嵌入式软件开发_CAN通信
嵌入式软件开发_CAN通信
0 CAN基础知识介绍
CAN是Controller Area Network(控制器局域网路)的缩写,是ISO国际标准化组织的串行通信协议。由德国电气商博世公司在1986年率先提出。此后,CAN通过ISO11898及ISO11519进行了标准化。现在在欧洲已是汽车网络的标准协议。
CAN协议经过ISO标准化后由有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率125Kbps~1Mbps的高通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。CAN具有很高的可靠性和良好的错误检测能力,广泛应用于汽车计算机控制系统和环境温度恶劣/电磁辐射强及振动大的工业环境。
CAN的特点
- 多主控制。总线空闲时,所有单元都可发送消息,而两个以上的单元同时发送消息时,根据标识符(ID,非地址)决定优先级。两个以上的单元同时开始发送消息时,对各消息ID的每个位进行逐个仲裁比较。仲裁获胜(优先级最高)的单元可继续发送消息,仲裁失利的单元则立即停止发送而进行接收工作。
- 速度快,距离远。最高1Mbps(距离<40m),最远可达10KM(速率<5Kbps)。
CAN物理层的形式主要分为闭环总线和开环总线,一个适合于高速通讯,一个适合于远距离通讯(速度慢)。闭环通讯网络是一种高速、短距离网络,它的总线最大长度为40m,通信速度最高1Mbps,总线的两端各要求有一个"120欧"的电阻。开环总线网络是低速、远距离网络,它的最大传输距离1km,最高通讯速率为125kbps,两根总线是独立的、不形成闭环,要求每根总线上各串联有一个"2.2千欧"的电阻。 - 具有错误检测/错误通知和错误恢复功能。所有单元都可以检测错误(错误检测功能),检测出错误的单元会立即同时通知其他所有单元(错误通知功能),正在发送消息的单元一旦检测出错误,会强制结束当前的发送。强制结束发送的单元会不断反复地重新发送次消息直到成功发送为止(错误恢复功能)。
- 连接节点多。CAN总线可同时可同时连接多个单元。可连接的单元总数理论上是没有限制的。但实际上可连接的单元受总线上的时间延迟及电气负载的限制。降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。
- CAN控制器根据CAN_L和CAN_H上的电位差来判断总线电平。总线电平分为显性电平和隐性电平,二者必居其一。发送方通过使总线电平发生变化,将消息发送给接收方。显性电平对应逻辑:0 例:CAN_High的电平为3.5V,CAN_Low的电平为1.5V,CAN_H和CAN_L的电压差为2V左右。隐性电平对应逻辑:1 例:CAN_High和CAN_Low线上的电压均为2.5V,CAN_H和CAN_L之间的电压差为0V。显性电平具有优先权,只要有一个单元输出显性电平,总线上即为显性电平。而隐性电平则具有包容的意味,只要所有的单元都输出隐形电平,总线上才为隐形电平(显性电平比隐性电平更强)。
- CAN通讯节点由一个CAN控制器及CAN收发器组成,控制器与收发器(电平转换)之间通过CAN_Tx及CAN_Rx信号线相连,收发器与CAN总线之间使用CAN_High及CAN_Low信号线相连。当CAN节点需要发送数据时,控制器把要发送的二进制编码通过CAN_Tx线发送到收发器,然后由收发器把这个普通的逻辑电平转化为差分信号,通过差分线CAN_High和CAN_Low线输出到CAN总线网络。而通过收发器接收总线上数据到控制器时,则是相反的过程,收发器把总线上收到的CAN_High及CAN_Low信号转化为普通的逻辑电平信号,通过CAN_Rx输出到控制器中。
- CAN通讯是半双工,收发数据需要分时进行。在CAN通讯网络中,因为共用总线,在整个网络中同一时刻只能有一个通讯节点发送信号,其余的节点在该时刻都只能接收。
- 由于CAN属于异步通讯,没有时钟信号线,连接在同一个总线网络中的各个节点会像串口通讯那样,节点使用约定好的波特率进行通讯,特别地,CAN还会使用“位同步”的方式来抗干扰/吸收误差,实现对总线电平信号进行正确的采样,确保通讯正常。
1.CAN总线系统结构


图 1 CAN 总线系统结构图 图2 ISO/OSI模型
① CAN控制器
接收控制单元中微处理器发出的数据,处理数据并传给CAN收发器;
② CAN收发器
将数据传到总线 or 从总线接收数据给控制器;
③ CAN数据传递终端
避免数据传输终了反射回来;
④ CAN数据总线
传输数据的数据线,两根 CAN-high and CAN-low,差分信号;
2.CAN总线系统的数据传输
CAN总线的节点发送数据是以报文的形式广播给网络中所有节点。收发器接收到数据就把数据传送给控制器,再由控制器检查判断是不是所需数据,不是则忽略(验收滤波由硬件+软件设置完成)。
- 网络上任何一个节点在任何时候都可以发送数据
- 多个节点发送数据,优先级低主动退出发送
- 短帧结构,每帧数据信息为0~8字节(用户定义),对数据编码而不是地址编码
- CAN每帧都有CRC校验和其他检验措施,严重错误的情况下具有自动关闭输出的功能。
3. CAN总线系统数据格式
CAN-bus通信帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔共五种类型。
1. 数据帧
数据帧携带数据从发送器至接收器,总线上传输的大多是这个帧。数据帧结构上由7个段组成,其中根据仲裁段ID码长度的不同,分为标准帧(CAN2.0A)和扩展帧(CAN2.0B)

1.1 帧起始、帧结束
帧起始和帧结束用于界定一个数据帧,无论是标准数据帧或扩展数据帧都包含这两个段。

1.2 仲裁段
CAN-BUS是如何解决多个节点同时发送数据,即总线竞争的问题?该问题由仲裁段给出答案。CAN-BUS并没有规定节点的优先级,但通过仲裁段帧ID规定了数据帧的优先级,根据CAN2.0标准版本不同,帧ID分为11位和29位两种。

1.3 显性及隐性
CAN-bus发布了ISO11898和ISO11519两个通信标准,此两个标准中差分电平的特性不相同。

1.4 总线仲裁
CAN控制器在发送数据的同时监测数据线的电平是否与发送数据对应电平相同,如果不同,则停止发送并做其他处理。

从该分析过程中得出结论:帧ID值越小,优先级越高,对于同为扩展格式数据帧、标准格式帧、远程帧及扩展帧的情况同理。

1.5 控制段
控制段共6位,标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成:扩展帧控制段则由IDE、r1、r0和DLC组成。

1.6 数据段
一个数据帧传输的数据量为0~8个字节,这种短帧结构使得CAN-BUS实时性很高,非常适合汽车和工控应用场合。

1.7 CRC段
CAN-BUS 使用CRC校验进行数据检错,CRC校验值存放于CRC段,CRC校验段由15位CRC值和1位CRC界定符构成。

CRC部分的计算一般由CAN控制器硬件完成,出错时的处理则由软件控制最大重发数。 在CRC校验码之后,有一个CRC界定符,它为隐性位,主要作用是把CRC校验码与后面的ACK段间隔起来。
1.8 ACK段
当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平。

ACK段 表示确认正常接收的段。ACK段包括一个ACK槽位,和ACK界定符位。在ACK槽位中,发送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在ACK和帧结束之间由ACK界定符间隔开。
1.9 帧结束
帧结束表示数据帧结束的段。帧结束段由发送节点发送的7个隐形位表示结束。
2.远程帧
远程帧由总线单元发出,请求发送具有同一识别符的数据帧。与数据帧相比,远程帧结构上无数据段,由6个段组成,同理分为标准格式和扩展格式,且RTR位为1(隐性电平)

2.1 数据帧与远程帧的比较

2.2 CAN-BUS 错误类型
尽管CAN-BUS是可靠性很高的总线,但依然可能出现错误:CAN-BUS的错误类型共有5种。

当出现5种错误类型之一时,发送或接收节点将发送错误帧。错误帧的结构如下,其中错误标识分为主动错误标识和被动错误标识。

为防止自身由于某些原因导致无法正常接收的节点一直发送错误帧,干扰其他节点通信,CAN-BUS规定了节点的3种状态及其行为。

3 过载帧
当某个接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点:过载帧由过载标志和过载帧界定符组成。

4 帧间隔
帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。

5 CAN-BUS整个链路层处理数据的流程是:

转自:https://blog.csdn.net/simonforfuture/article/details/79405663

浙公网安备 33010602011771号