最近公司项目设计到汽车电子相关的技术,在工作中遇到一些问题,所以这里分享一些坑点,在CAN总线中确保通信的可靠性和鲁棒性至关重要。由于总线通常部署在电磁环境复杂、节点众多的场景(如汽车、工业控制),错误的发生在所难免。CAN协议定义了一套完善的错误检测、通知和故障界定机制,使系统能够在错误发生时进行有效处理,并在必要时隔离故障节点,保障总线的整体可用性。下面将带大家详细解析CAN总线的错误处理机制。
1、错误检测基础
首先是CAN协议本身内置了多种错误检测机制,包括:
位错误(Bit Error):节点发送的位电平与总线实际电平不符。 填充错误(Stuff Error):在帧的起始帧、仲裁场、控制场、数据场和CRC序列中,出现连续6个相同极性的位,违反了位填充规则。 CRC错误(CRC Error):接收节点计算的CRC校验码与接收到的CRC序列不符。 格式错误(Form Error):固定格式位场(如帧结束EOF、ACK界定符等)中出现非法位值。 应答错误(Acknowledgment Error):发送节点在ACK时隙未检测到显性位(表示无节点正确接收)。
当节点检测到上述任何一种错误时,它会立即发送一个错误标志(Error Flag) 来通知总线上的所有其他节点。值得注意的是上面除了应答错误其他均可以在接收CAN单元中发生,同样除了CRC和格式错误其他错误均会在发送单元中发生,所以这里非常重要,可以根据相关错误缩小出问题的CAN节点范围。
2、错误计数器
CAN控制器为了量化节点的错误状况并界定其状态,CAN协议为每个总线单元配备了两个关键计数器:
发送错误计数器(Transmit Error Counter, TEC):记录该节点在发送过程中检测到的错误。 接收错误计数器(Receive Error Counter, REC):记录该节点在接收过程中检测到的错误。
计数规则(核心机制):
接收器检测到错误(位错误、填充错误、CRC错误、格式错误): REC = REC + 1
接收器在发送主动错误标志后,检测到的第一个位为“显性”(Dominant): REC = REC + 8
(此规则较为特殊,涉及错误标志发送后的位确认)发送器发送一个错误标志(无论主动或被动): TEC = TEC + 8
3、错误界定与转换
根据TEC
和REC
的数值,总线单元的状态被严格划分为三种,每种状态对应不同的总线行为权限,这样如果CAN总线异常了就可以通过相关策略具体排查:

主动错误状态(Error Active):
条件: TEC
和REC
均小于等于 127 (0 <= TEC <= 127
且0 <= REC <= 127
)。行为: 节点可以正常参与总线通信。当它检测到错误时,会发送一个主动错误标志(Active Error Flag)(连续6个显性位)。这是一个强力的错误通知信号,会强制中断当前帧的传输。
被动错误状态(Error Passive):
节点不允许发送主动错误标志。 节点可以参与总线通信。 当检测到错误时,它只能发送一个被动错误标志(Passive Error Flag)(连续6个隐性位)。这个标志的强度较弱,不会干扰总线上的显性位,因此可能无法成功中断其他节点的传输。 关键限制: 处于被动错误状态的节点在完成一次发送(帧或错误标志)后,不能立即开始下一次发送。它必须在总线空闲期间,在正常的间歇(Intermission)之后,额外插入一段由8位隐性位组成的“挂起传送(Suspend Transmission)”时间,然后才能尝试竞争总线进行下一次发送。这降低了频繁出错的节点对总线的干扰。
条件: TEC
大于 127 或REC
大于 127 (128 <= TEC <= 255
或128 <= REC <= 255
)。行为:
总线关闭状态(Bus Off):
条件: TEC
大于 255 (TEC >= 256
)。行为: 节点被强制断开与总线的电气连接。它不允许进行任何发送或接收操作,对总线完全无影响。这是一种保护机制,防止因节点硬件或软件严重故障而持续破坏总线通信。 恢复: 节点需要特定的内部条件(通常是检测到总线连续空闲达到一定时间或次数)才能尝试从总线关闭状态恢复到初始状态(通常是错误主动状态),并重新开始通信。
状态转换关系总结:
节点初始状态通常为主动错误状态。 当 TEC
或REC
超过127时,节点从主动错误状态进入被动错误状态。当 TEC
达到或超过256时,节点(无论之前是主动还是被动错误状态)进入总线关闭状态。当 TEC
和REC
都降低到128以下时,节点可以从被动错误状态恢复到主动错误状态。从总线关闭状态恢复需要满足特定条件(如总线空闲检测),并直接回到初始状态(通常是主动错误状态)。
4、小结
CAN总线的错误处理机制也不错如此嘛,不过它通过发送错误计数器(TEC)和接收错误计数器(REC),系统能够精确量化节点的错误发生频率。基于计数器的值,节点被动态地划分为主动错误、被动错误和总线关闭三种状态,每种状态对应不同的总线访问权限和错误响应方式(主动/被动错误标志)。
特别是被动错误状态下的“挂起传送”要求和总线关闭状态的强制隔离,有效地限制了故障节点对总线整体通信的负面影响,确保了在部分节点出现问题时,关键通信仍能继续进行。
