CAN数据链路层的帧格式介绍——数据帧和远程帧
前言:
年纪大就会发现之前学习过的内容,如果不常使用,不久就会忘个精光,为了方便日后查看,便将其记录起来。不积跬步,无以至千里。本章主要介绍数据链路层的帧格式。
CAN协议中4中类型的帧结构:
- 数据帧
- 远程帧
- 错误帧
- 过载帧
数据帧(Data frame):
数据帧,顾名思义携带数据从发送节点A到接收节点B,使节点A与节点B能进行数据交互。
数据帧分两种类型:①标准帧②扩展帧
标准帧使用的是CAN2.0A,CAN ID是11bit,ID最大也就是0x7FF,扩展帧使用的是CAN2.0B,CAN ID是29bit,ID最大可达到0x1FFFFFFFx(一般扩展帧ID后加x表示扩展帧);
数据帧,无论是标准帧还是扩展帧都主要包含七个部分:①帧起始、②仲裁场、③控制场、④数据场、⑤CRC场、⑥ACK场、⑦帧结束
帧起始:
说明:帧的最开始的一位是帧起始,也叫SOF(Star of Frame),固定为显性位,即逻辑0.标志着数据帧的帧开始了。帧起始只有在总线空闲期间节点才能够发送。
作用:用于同步,总线空闲期间的任何隐性到显性的跳变都将引起节点进行硬同步
仲裁场:
说明:标准帧的仲裁场主要有CAN ID和RTR组成,而扩展帧在标准帧的基础上,则多了SRR和IDE
作用:仲裁场主要作用在于区分哪个节点更优先,让更优先的节点掌握发送权,其他节点在静默等待总线空闲再进行下一回合的仲裁。
仲裁过程:在CAN总线中有一种回读机制,指节点在发送到总线报文的同时也对总线上当前的报文进行回读(为了判断自己发出的东西与总线上的东西是否一致);
还有一种线与机制,指总线上接收到多节点报文时,显性位(逻辑0)能覆盖隐形位(逻辑1)
例子:在总线上目前有两节点在发送报文,A和B 在ID8前发送的都一样,回读总线上报文也与自己发送出去的一致,但A节点在发ID8时,发现自己发送出去的和回读总线上的电平不一致,从而判断出总线上有其他比自己优先级高的节点也在发送报文,则A节点会主动退出发送,转换为接收,从而使B节点,掌握了总线的发送权,发送的报文也不存在延时,报文完整不被破坏,这也被称作非破坏性仲裁机制。
节点 | SOF | ID10 | ID9 | ID8 | ID7 | ... |
A节点 | 0 | 1 | 0 | 1 | - | - |
B节点 | 0 | 1 | 0 | 0 | 0 | 1 |
总线 | 0 | 1 | 0 | 0 | 0 | 1 |
CAN ID:可确定唯一标识符,利用CAN ID 可对总线上报文进行仲裁优先级,ID值越小,优先级越高。
RTR:在标准帧中用于区别是数据帧还是远程帧,当RTR位为显性时,即逻辑0,为数据帧,当RTR位为隐性,即逻辑1时,为远程帧。RTR作用:在ID相同的情况下,保证数据帧优先级高于远程帧。
SRR:在扩展帧中(数据帧或远程帧),SRR横为隐性,即逻辑1,扩展帧的SRR位刚好对上标准帧的RTR位。SRR作用:在前11位ID相同的情况下,标准数据帧优先级高于扩展数据帧。
IDE:在扩展帧中恒为隐性,即逻辑1;
在数据帧中IDE位于控制段,且横为显性,即逻辑0;刚好标准帧的IDE和扩展帧的IDE位置对应上,IDE作用:在前11位ID相同的情况下,标准远程帧优先级高于扩展远程帧。
区分:
SOF | ID | RTR/SRR | IDE | 区分为 |
0 | XXX | 0 | 0 | 标准数据帧 |
0 | XXX | 1 | 标准远程帧/扩展数据帧/扩展远程帧 | |
0 | XXX | 1 | 0 | 标准扩展帧 |
0 | XXX | 1 | 1 | 扩展帧(数据/远程) |
控制场:
说明:数据帧和远程帧的控制段结构相同。
IDE:标准帧的IDE对应扩展帧的IDE位置,
r/r1和r0:保留位,必须以显性,即逻辑0发送,但接收方,可接受显/隐性任意组合电平;
DLC:代表数据场的数据长度,对没有数据场的远程帧,DLC表示该远程帧对应的数据帧的数据场的字节数。
数据场:
说明:数据场就是我们节点携带的数据,需要相互交互的数据信息,0-64位,具体数据长度由控制场DLC决定。
数据场里低字节先发(Byte0....Byte7)
每个字节是高位先发(Bit7....Bit0)
超过一个字节的数据可以把低有效位放在前(Intel格式),也可以把高有效位放在前(Motorola格式)
CRC场:
说明:CRC场包含CRC校验序列和CRC界定符(恒为隐形,即逻辑1),通过多项式生成CRC值,比较发送节点与接受节点CRC是否一致,来确保帧的有效性,计算范围包括发送节点【帧起始、仲裁场、控制场、数据场】是否与接收节点【帧起始、仲裁场、控制场、数据场】是否一致。
ACK场:
说明:ACK场包含ACK槽和ACK界定符两位,
节点 | ACK槽 | ACK界定符 | 结果 |
发送节点 | 1 | 1 | |
接收节点 | 0 | 1 | 表示接收节点已正确接收报文 |
帧结束:
说明:固定7个隐性位,即逻辑1构成。
帧间隔:
说明:固定为3个隐形位,即逻辑1构成。
当连续11位为隐性时,总线为空闲状态,节点可发送帧起始来让总线忙碌起来,接着就开始仲裁,又是一个忙碌的小总线~
远程帧(Remote frame):
当接收节点想快速获取某节点数据时,可向总线发送远程帧,远程帧数据场无内容
节点 | ID | RTR | DLC | data |
发送A节点(cycle=100ms) | XXX | 0 | 8 | xxxx |
接收B节点(呀!等不急了,我马上就要数据) | XXX(与A节点ID一致) | 1 | 8(与A节点的DLC一致) | ---- |
发送A节点(收到B节点的远程帧,不等100ms了,马上回传数据) | XXX | 0 | 8 | xxxx |
接收B节点(呀,收到数据啦~) |