在当今的汽车电子和工业控制等领域,CAN(Controller Area Network)总线的应用极为广泛。由于总线常常部署在电磁环境复杂、节点众多的场景中,如汽车内部和工业自动化生产线等,错误的发生难以避免。因此,确保 CAN 总线通信的可靠性和鲁棒性就显得至关重要。CAN 协议定义了一套完善的错误检测、通知和故障界定机制,使系统能够在错误发生时进行有效处理,并在必要时隔离故障节点,保障总线的整体可用性。接下来,我们将详细解析 CAN 总线的错误处理机制。
CAN 协议本身内置了多种错误检测机制,这些机制是保障总线通信可靠性的基础。具体包括:
- 位错误(Bit Error):当节点发送的位电平与总线实际电平不符时,就会检测到这种错误。这可能是由于电磁干扰、线路故障等原因导致的。
- 填充错误(Stuff Error):在帧的起始帧、仲裁场、控制场、数据场和 CRC 序列中,CAN 协议采用位填充规则,即不允许出现连续 6 个相同极性的位。如果出现这种情况,就违反了位填充规则,检测为填充错误。
- CRC 错误(CRC Error):接收节点会对接收到的数据计算 CRC 校验码,并与接收到的 CRC 序列进行比较。如果两者不符,则判定为 CRC 错误,这通常意味着数据在传输过程中发生了改变。
- 格式错误(Form Error):固定格式位场,如帧结束 EOF、ACK 界定符等,都有特定的格式要求。如果这些位场中出现非法位值,就会检测到格式错误。
- 应答错误(Acknowledgment Error):发送节点在 ACK 时隙未检测到显性位,表示没有节点正确接收数据,此时判定为应答错误。
当节点检测到上述任何一种错误时,会立即发送一个错误标志(Error Flag)来通知总线上的所有其他节点。需要注意的是,除了应答错误外,其他错误均可以在接收 CAN 单元中发生;除了 CRC 和格式错误外,其他错误均会在发送单元中发生。通过分析这些错误类型,可以缩小出问题的 CAN 节点范围。
为了量化节点的错误状况并界定其状态,CAN 协议为每个总线单元配备了两个关键计数器:
- 发送错误计数器(Transmit Error Counter, TEC):用于记录该节点在发送过程中检测到的错误。
- 接收错误计数器(Receive Error Counter, REC):用于记录该节点在接收过程中检测到的错误。
计数规则如下:
- 接收器检测到错误(位错误、填充错误、CRC 错误、格式错误)时,REC = REC + 1。
- 接收器在发送主动错误标志后,检测到的个位为 “显性”(Dominant)时,REC = REC + 8。这一规则较为特殊,涉及错误标志发送后的位确认。
- 发送器发送一个错误标志(无论主动或被动)时,TEC = TEC + 8。
根据 TEC 和 REC 的数值,总线单元的状态被严格划分为三种,每种状态对应不同的总线行为权限,这有助于在 CAN 总线出现异常时进行具体排查。
- 主动错误状态(Error Active):当 TEC 和 REC 均小于等于 127(0 <= TEC <= 127 且 0 <= REC <= 127)时,节点处于主动错误状态。在这种状态下,节点可以正常参与总线通信。当它检测到错误时,会发送一个主动错误标志(Active Error Flag),即连续 6 个显性位。这是一个强力的错误通知信号,会强制中断当前帧的传输。
- 被动错误状态(Error Passive):当 TEC 大于 127 或 REC 大于 127(128 <= TEC <= 255 或 128 <= REC <= 255)时,节点进入被动错误状态。此时,节点不允许发送主动错误标志,只能发送一个被动错误标志(Passive Error Flag),即连续 6 个隐性位。这个标志的强度较弱,不会干扰总线上的显性位,因此可能无法成功中断其他节点的传输。此外,处于被动错误状态的节点在完成发送(帧或错误标志)后,不能立即开始下发送。它必须在总线空闲期间,在正常的间歇(Intermission)之后,额外插入一段由 8 位隐性位组成的 “挂起传送(Suspend Transmission)” 时间,然后才能尝试竞争总线进行下发送。这一限制降低了频繁出错的节点对总线的干扰。
- 总线关闭状态(Bus Off):当 TEC 大于 255(TEC >= 256)时,节点进入总线关闭状态。在这种状态下,节点被强制断开与总线的电气连接,不允许进行任何发送或接收操作,对总线完全无影响。这是一种保护机制,防止因节点硬件或软件严重故障而持续破坏总线通信。节点需要特定的内部条件,通常是检测到总线连续空闲达到一定时间或次数,才能尝试从总线关闭状态恢复到初始状态(通常是错误主动状态),并重新开始通信。
状态转换关系总结如下:
- 节点初始状态通常为主动错误状态。
- 当 TEC 或 REC 超过 127 时,节点从主动错误状态进入被动错误状态。
- 当 TEC 达到或超过 256 时,节点(无论之前是主动还是被动错误状态)进入总线关闭状态。
- 当 TEC 和 REC 都降低到 128 以下时,节点可以从被动错误状态恢复到主动错误状态。
- 从总线关闭状态恢复需要满足特定条件(如总线空闲检测),并直接回到初始状态(通常是主动错误状态)。
CAN 总线的错误处理机制通过发送错误计数器(TEC)和接收错误计数器(REC),能够量化节点的错误发生频率。基于计数器的值,节点被动态地划分为主动错误、被动错误和总线关闭三种状态,每种状态对应不同的总线访问权限和错误响应方式(主动 / 被动错误标志)。特别是被动错误状态下的 “挂起传送” 要求和总线关闭状态的强制隔离,有效地限制了故障节点对总线整体通信的负面影响,确保了在部分节点出现问题时,关键通信仍能继续进行。
关键词:CAN 总线