CAN(二)——错误帧
目录
MCU(通过其内置的CAN控制器)在什么时候会发出错误帧,以及这是如何实现的。
一、什么时候发错误帧?
MCU的CAN控制器不会随意发送错误帧,它只在检测到符合CAN协议规定的特定错误条件时才会立即触发。这些错误可以发生在发送过程中,也可以发生在接收过程中。
CAN协议定义了5种主要的错误类型:
1. 位错误
-
触发时机:当发送节点在总线上输出一个位的同时,回读总线上的电平,发现与它刚输出的电平不一致时。
-
例外情况:在仲裁场期间输出隐性位但回读到显性位,这不算位错误,因为这表示有更高优先级的节点在发送,本节点应该退出仲裁。在ACK槽期间输出隐性位但回读到显性位,这也不算错误,因为这表示有节点成功接收并回复了ACK。
2. 填充错误
-
触发时机:在帧起始、仲裁场、控制场、数据场、CRC场这些需要位填充的字段中,检测到连续6个相同电平的位。
-
原理:CAN协议规定,当出现连续5个相同位后,必须插入一个反相位的“填充位”。如果出现6个连续相同位,就违反了填充规则。
3. CRC错误
-
触发时机:接收节点根据接收到的数据计算出的CRC校验码,与发送节点在CRC场中发送的CRC序列不匹配时。
-
原理:这表明数据传输过程中可能受到了干扰,数据内容出现了错误。
4. 格式错误
-
触发时机:在报文帧的固定格式字段检测到非法位。
-
例子:
-
在帧结束字段(7个连续隐性位)检测到了显性位。
-
在ACK界定符或错误界定符(均为隐性位)检测到了显性位。
-
在CRC界定符(隐性位)检测到了显性位。
-
5. ACK错误
-
触发时机:发送节点在ACK槽中没有检测到显性位。
-
原理:ACK槽是发送节点留出的一个隐性位间隙。如果至少有一个接收节点(非发送节点本身)正确接收了该帧,它必须在这个槽里填入一个显性位。如果发送节点没有读到这个显性位,说明没有一个节点成功接收,它就会产生一个ACK错误。
二、自动重发的机制:CAN协议如何工作
-
发送节点发送报文:
MCU将需要发送的数据(标识符、数据域等)写入CAN控制器的发送邮箱,然后CAN控制器会开始在总线上逐位发送该报文。 -
接收节点发现错误:
总线上的其他节点在接收过程中,如果发现任何错误(如CRC校验错误、格式错误、位填充错误等),会立即在总线上主动发送一个“错误帧”。 -
错误帧的结构:
错误帧不是一种特殊的数据帧,而是由两个部分组成:-
错误标志:由6个连续的显性或隐性位(主动错误标志)组成,这破坏了CAN的位填充规则,从而引起所有节点的注意。
-
错误界定符:8个连续的隐性位。
-
-
发送节点也同时监听到错误:
CAN节点在发送的同时也在监听总线。当发送节点自己监听到这个错误帧时,它立即停止当前的发送(可能连错误帧都没发完就中止了)。 -
自动重发:
发送节点在停止当前发送后,会自动等待一个特定的“中断帧间隔”时间,然后毫不犹豫地再次尝试发送同一个报文。这个过程对MCU软件是透明的,MCU甚至不知道发生了重发(除非它去查询状态寄存器)。
三、错误帧如何实现?
错误帧的实现是由MCU内部的CAN控制器硬件自动完成的,无需CPU核心的干预。这是一个高速的硬件级响应过程。
1. 核心组件:CAN控制器内的错误管理逻辑
CAN控制器内部有一套复杂的状态机和计数器来实现错误处理:
-
错误计数器:每个CAN控制器都有两个错误计数器:
-
发送错误计数器
-
接收错误计数器
-
-
错误状态:根据错误计数器的值,节点处于三种状态之一:
-
主动错误状态:默认状态。可以正常参与总线通信。
-
被动错误状态:错误较多。受到限制,不能主动破坏总线。
-
总线关闭状态:错误非常多。完全与总线断开连接。
-
2. 错误帧的发送流程
当CAN控制器检测到上述任何一种错误时,会立即(在当前位时间内)执行以下操作:
第一步:发送“错误标志”
-
这是错误帧的主体,目的是破坏当前的总线传输。
-
如果节点处于【主动错误状态】:
-
它会立即向总线发送一个主动错误标志,即连续6个显性位。
-
这个连续的6个显性位违反了位填充规则,其他所有节点看到后都会识别出这是一个错误,并随之也发送错误标志。
-
这是一种“众裁”机制,所有检测到错误的节点会同步发出错误标志,在总线上叠加,形成一个长的显性位序列。
-
-
如果节点处于【被动错误状态】:
-
它只能发送一个被动错误标志,即连续6个隐性位。
-
它不会主动破坏总线,而是“悄悄地”在总线上等待。如果总线上在此期间没有其他显性位,这个错误标志才会被看到。如果此时有主动错误节点正在发送显性错误标志,被动错误节点的标志就会被覆盖。
-
第二步:发送“错误界定符”
-
在发送完错误标志后,所有节点都会切换到接收模式,并开始发送错误界定符。
-
错误界定符由8个连续的隐性位组成。
-
这个“冷静期”确保了总线在激烈的错误标志冲突后恢复稳定,为下一帧传输或重发做好准备。
3. 软件层面(程序员)能看到什么?
虽然错误帧的发送是硬件自动完成的,但程序员可以通过访问CAN控制器的状态寄存器和错误计数器寄存器来了解情况。
-
中断:CAN控制器通常可以配置为在发生错误、错误计数器变化或进入被动/总线关闭状态时产生中断。
-
状态寄存器:程序员可以查询寄存器位来判断“最后一次错误是什么类型”(如CRC错误、格式错误等),以及“当前节点处于什么错误状态”。
-
错误计数器:可以读取发送和接收错误计数器的值,用于总线健康状况诊断。
总结
-
什么时候发?
MCU在检测到位错误、填充错误、CRC错误、格式错误、ACK错误这五种情况之一时,会立即发送错误帧。 -
如何实现?
-
硬件自动实现:由CAN控制器内的状态机和计数器逻辑完成。
-
立即响应:在检测到错误的那个位时间就开始发送错误标志,不等待帧结束。
-
状态依赖:根据节点的错误状态(主动/被动)发送不同类型(显性/隐性)的错误标志。
-
流程固定:发送错误标志 -> 所有节点同步 -> 发送错误界定符 -> 总线恢复。
-
结果:强制发送节点终止当前帧并自动重发。
-
这种机制确保了CAN总线的高可靠性,任何错误都会被迅速发现并纠正,保证了数据的完整性和一致性。
更多推荐



所有评论(0)