CAN总线传输的是CAN帧,CAN的通信帧分为五种类型的帧结构,分别为:(1)数据帧;(2)遥控帧;(3)错误帧;(4)过载帧;(5)帧间隔。
其中错误帧、过载帧、帧间隔都是由硬件完成的,没有办法用软件来控制。因此对于一般使用者来说,只需要掌握数据帧与遥控帧即可。数据帧和遥控帧的帧结构非常相似,故在一起学习。
根据标识符的长度,数据帧和遥控帧都可以分为标准帧(2.0 A)和扩展帧(2.0 B)。标准帧只有11位标识符(ID),而扩展帧具有29位标识符。数据帧的帧结构有7个段,包括帧起始、仲裁段、控制段、数据段、CRC段、ACK段和帧结束,而遥控帧的帧结构仅缺少数据段。
下面进行标准数据帧与扩展数据帧的对比:
通过比较发现:标准数据帧和扩展数据帧的仲裁段和控制段所包含的内容不同,需要注意。而且如果标准ID相同,由于远程发送请求位是显性的,而替代远程请求位是隐性的,所以标准数据帧的优先级高于扩展数据帧。
1.1 帧起始
帧起始(SOF, Start of Frame),显性(即逻辑0)表示报文的开始,并用于同步总线上的节点。它表示CAN_H和CAN_L上有电压差了,即有数据。
1.2 仲裁段
(1)标准数据帧的仲裁段包括标识符(ID,Identifier)和远程发送请求位 (RTR,Remote Transmission Request )。
标识符ID:标准CAN总线具有11位标识符,用于确定报文的优先级。高七位(ID10-ID4)不能全为隐性位1(显0隐1)。
当总线空闲(即隐性电平为1)时,总线上任何一个节点都可以向总线发送报文。若两个或两个以上的节点向总线发送报文时,就会出现总线访问冲突。CAN总线采用“非破坏性逐位仲裁机制”使具有优先权的报文优先发送,而低优先级的节点主动退出发送而主动处于单纯监听方式。此域的数值越小,优先级越高。
远程发送请求位RTR:RTR用来区分该帧是数据帧还是远程帧。当RTR为逻辑0时,代表该帧为数据帧;当RTR为逻辑1时,代表该帧为远程帧。同时,也保证了数据帧的优先级高于远程帧。当需要从另一个节点请求信息时,此位为隐性(即逻辑1)。所有节点都能接收这个请求,但帧ID确定被指定的节点。
(2)扩展数据帧的仲裁段,在基本标识符ID(ID28-ID18)和远程发送请求位RTR之间插入了替代远程请求位SRR,标识符扩展帧IDE,扩展标识符ID(ID17-ID0)三部分。
替代远程请求位SRR,SRR是一个隐性位1。它对应标准帧的远程发送请求位RTR位,在标准数据帧中RTR位是显性位0,即标准数据帧的优先级高于扩展数据帧。
标识符扩展位IDE,对于扩展帧,IDE属于仲裁段;对于标准帧,IDE属于控制段。此位为显性位0时,表示这是一个标准帧;此位为隐性位1时,表示这是扩展帧。
1.3 控制段
保留位r0,用于后期标准修订会使用,其保留位必须发送为显性,但是收发器认可“显性”和“隐性”位的任何组合。
DLC-4位数据长度代码,代表传输数据的字节数目,一帧CAN报文最多传输8字节用户数据。
1.4 数据段
一帧CAN报文可以0-8字节数据,最多传输8字节用户数据。
1.5 CRC段
CRC段,Cyclic Redundancy Check,为循环冗余校验,其包括CRC校验序列和CRC界定符。
CRC校验序列是根据多项式运算生成的CRC值,其计算范围包括:帧起始、仲裁段、控制段和数据段。
CRC循环冗余校验的过程:
在CRC校验中,遵循原则是异或运算,即 相同为0;相异得1。
(1)展开多项式获得CRC除数。 如:x6+x4+x2+x+1,除数为1010111。
(2)在原始数据后加“0”,多项式的阶数是多少就加几个0。多项式:的阶数为6,所以应该在原数据后加6个“0”,即数据串为:1101011011 000000,除数为1010111。
(3)计算校验数据:将数据串第一个1与除数左对齐,重复操作,直到所有数据都处理过。
1101011011000000
1010111
0111100011000000
1010111
010111111000000
1010111
00010001000000
1010111
00100110000
1010111
001101100
1010111
0111011
所得到的数据结果即为CRC校和,将校验和加在数据项之后即为带有CRC校验的数据。
CRC界定符恒为隐性1。
1.6 ACK段
ACK,Acknowledgement,为应答,其包括应答位和应答位界定符。在接收器确认之前,ACK两位是隐性位。当接收器正确地接收到有效的报文,接收器会在应答位期间向发送节点发送一个显性位,表示应答。如果接收器发现这帧数据有错误,则不向发送节点发送ACK应答,发送节点会稍后重传这帧数据。
1.7 帧结束
EOF(End of Frame),是7位帧结束标志位,全部为隐性位。如果这七位出现显性位,则会引起填充错误。
IFS-7位帧间隔标志位,CAN控制器将接收到的帧正确地放入消息缓存区。