作者:张光和尚山秀珍 | 来源:互联网 | 2023-07-18 01:23
目录一、CAN协议帧格式1、数据帧2、遥控帧3、错误帧4、过载帧5、帧间隔一、CAN协议帧格式CAN协议帧的格式十分重要,部分MCU中的CAN外设寄存器就是根
目录
一、CAN协议帧格式
1、数据帧
2、遥控帧
3、错误帧
4、过载帧
5、帧间隔
一、CAN协议帧格式
CAN协议帧的格式十分重要,部分MCU中的CAN外设寄存器就是根据对应帧结构来进行设计的。
- 数据帧:用于发送单元向接收单元传送数据的帧
- 遥控帧:用于接收单元向具有相同ID的发送单元请求数据的帧
- 错误帧:用于当检测出错误时向其他单元通知错误的帧
- 过载帧:用于接收单元通知其尚未做好接收准备的帧
- 帧间隔:用于将数据帧和遥控帧与前面的帧分离开来的帧
1、数据帧
(1)帧起始:标识一个数据帧的开始,用于同步,一个显性位,只有在总线空闲期间节点才能发送SOF
(2)仲裁段(场):ID、RTR、IDE、SRR
- ID:唯一确定一条报文,表明报文的含义和优先级;(标准帧:11位ID;拓展帧:29位ID)
- RTR 远程传送请求位(0:数据帧。 1:远程帧)
- IDE 标识符拓展位 (0:11位ID,标准帧。1:29位ID,拓展帧)
- SRR 远程代替请求位 SRR = 1
以Renesas RH850的用户手册中的Receive Rule ID Register举例:其中就设计到CAN数据帧的相关设置
(3)控制段(场):主要用于表示数据段有多少个字节
- r1、r0 为保留位,默认为显性电平(逻辑0)
- DLC 数据长度码:表示数据段的字节数,表示为0~8
(4)数据段(场):CAN数据帧要发送的数据内容
(5)CRC段(场):用于进行CRC校验
- CRC:接收到的CRC数据,用于进行校验
- DEL 界定符:用于界定CRC序列,固定1个隐性电平(逻辑1),CRC界定符之前会进行位填充,CRC之后的位域都是固定格式,不允许位填充
(6)ACK段(场):确定报文被至少一个节点正确接收
发送节点在ACK发送隐性位(逻辑1):
- 正确接收到报文的节点 =》 ACK发送显性位(逻辑0)
- 未正确接收到报文的节点 =》ACK发送隐性位(逻辑1)
发送节点检测应答位是否被显性电平覆盖(即ACK变为显性位,逻辑0)
(7)帧结束:7个连续的隐性位(逻辑1),表示帧结束;节点在检测11个连续的隐性位后,认为总线空闲
2、遥控帧
具体各位信息可以参考数据帧
3、错误帧
(1)CAN中的错误检测:
- 位检测:节点检测到的位域自身送出的位数值不同。(注:仲裁段与ACK段不参与位检测)
- 填充检测:在使用位填充编码的帧段,不允许出现6个连续相同的电平
- CRC检测:节点计算CRC序列与接收到的CRC序列不同
- 格式检测:固定格式位场(CRC界定符之后),含有一个或更多非法位
- ACK检测:发送节点在ACK位期间未检测到“显性”电平
发送节点的产生错误一般有:位错误、格式错误、ACK错误
接收节点的产生错误一般有:填充错误、格式错误、CRC错误
(2)CAN中的错误帧:
一般流程:检测错误=》发送错误帧=》通知报文错误
主动错误与被动错误的区别:
- 主动错误:只要检查到错误,它立即“主动地”发送错误标志,连续6个显性位(不满足CAN协议的“最多5个连续的同性位”要求)。
- 被动错误:如果检查到错误,它只能“被动地”等其他站点报错,等待的时候不能去动总线,发送了6个隐性位(不满足CAN协议的“最多5个连续的同性位”要求,能够部分或全部被其他节点的显性位覆盖),直到识别出其他站点报错,然后就可以去竞争总线,该干啥干啥。
错误帧的发送
- 位错误、填充错误、格式错误或ACK错误产生后:当前发送的一下位发送错误帧
- CRC错误:紧随ACK界定符后的位发送错误帧
- 错误帧发送后:总线空闲时重发出错的数据帧
4、过载帧
5、帧间隔