文章
Classical CAN的四种帧结构
- 数据帧 (Data Frame)
- 远程帧 (Remote Frame)
- 错误帧 (Error Frame)
- 过载帧 (Overload Frame)
数据帧 (Data Frame)
发送节点A:我这里有标识符(Identifier)为AAA的消息发出来了,谁喜欢谁拿去。
接收节点B:这不是我的主人(上层应用程序)感兴趣的消息,不理他。
接收节点C:我的主人(上层应用程序)说过,收到标签为AAA的消息的话一定要给他看。收下!
数据帧格式


-
帧起始 (SOF) 用来指示一个数据帧和远程帧的开始, SOF包含一个确定的显性位。可用于同步CAN网络中的节点设备。
-
仲裁段
2.1 CAN2.0A 数据帧标准格式 Classical Base Frame Format (CBFF): 仲裁区域内的identifier只支持11 bit。
- 标识符段 Identifier (11 bits)
- 远程传输请求位 RTR (1 bit): RTR位被置为显性电平。
2.2 CAN2.0B 数据帧扩展格式 Classical Extended Frame Format (CEFF): 仲裁区域内的identifier支持29 bit。主流的CAN控制器基本上都支持CAN 2.0B。
- 标准标识符段 Identifier (11 bits)
- 替代远程请求 Substitute Remote Request (SRR) (1 bit)
- 标识符扩展位 Identifier Extension (IDE) (1 bit): The IDE bit allows distinguishing between the CAN base frame format and the CAN extended frame format.
- 扩展标识符 (18 bits)
- 控制段
- 保留位 r1, r0 (2 bits): 永远处于显性状态
- 数据长度代码 Data Length Code (DLC) (4 bits): 虽然4 bits 最大长度能表示15,但是CAN的数据段最大长度只能是8个字节,所以如果DLC 的值超过8,数据段内的数据会按照8个来发送。
- 数据段
包含最多8个字节的数据。
- CRC段
15位校验和,用于错误检测。
- 应答段
任何能够正确接收报文的CAN控制器都会在每条报文的末尾发送一个应答位。传送节点检查应答位是否存在,如果没有检测到应答位,会重新发送报文。
- 如何区分CBFF和CEFF
- 如果11位标识符后的两位都是显性电平,则认为此两位为RTR和r1,从而认定此帧格式为11-bit identifier的CBFF数据帧。
- 如果11位标识符后的两位都是隐性电平,则认为此两位为SRR和IDE,从而继续读取后续18为id,拼凑成29-bit。然后再次判断后两位RTR和r1,如果为两个显性电平,则认定此帧格式为29-bit identifier的CEFF。
- 如果RTR为隐性电平,r1为显性,则认定此帧格式为远程帧。
远程帧 (Remote Frame)
发送节点A: 谁能发送一个标签为AAA的消息出来?
接收节点B: 我的主人说过,谁索要标签为AAA的消息的话,我一定要发送出去。于是...
发送节点B: 我这里有标签为AAA的消息发出来了,谁喜欢谁拿去。
远程帧格式

-
远程帧可用来发送请求数据。当一个网络设备的接收器接收到一个远程帧时,如果已经配置过针对此远程帧的Identifier 做响应的话,该设备的发送器就会发送一个用于应答的数据帧。
-
RTR永远置为隐性电平。
-
远程帧没有数据段。
-
远程帧和数据帧的DLC值必须一致。
错误帧
错误帧/过载帧的格式

-
错误标志用来发出一组违反总线协议的故障信号。主动错误标志由6个连续显性电平的位组成,这是违反了CAN位填充规则的,因此,该网络中的所有设备都可以识别出这种错误标志。
-
网络中其他设备识别出错误标志后,会发送第二个错误标志。所有的错误标志叠加后,就会在总线上形成一个由6~12个显性电平位组成的波形序列。
过载帧
-
过载帧通常由尚未处理完上一帧消息的CAN控制器发出,可以用于延迟网络中其他设备发送下一条帧消息。
-
目前主流的CAN控制器已经不再主动发送过载帧了,只会对过载帧作出延迟发送的反应。