4. CAN总线错误类型:位错误、填充错误、CRC错误、形式错误、应答错误
CAN协议定义了五种独立的错误类型,用于检测总线通信中的各类故障。任何CAN控制器在发送或接收报文时,只要检测到其中一种错误,就会立即产生错误帧,中断当前通信。理解这五种错误类型的触发条件、检测位置和典型场景,是排查XMC系列工业通信故障的基础。
4.1 五种错误类型概述
| 错误类型 | 检测位置 | 触发条件 | 典型故障场景 |
|---|---|---|---|
| 位错误 (Bit Error) | 发送节点 | 发送器监控总线电平,发现与自身发送的位电平不一致 | 总线短路、多节点同时发送相同ID但数据不同、收发器驱动能力不足 |
| 填充错误 (Stuff Error) | 所有节点(接收/发送) | 在需要位填充的段(SOF~CRC)中检测到连续6个相同电平 | 发送器位填充逻辑故障、总线噪声导致额外位翻转、晶振偏差累积 |
| CRC错误 (CRC Error) | 接收节点 | 接收器计算的CRC序列与发送器发送的CRC序列不匹配 | 总线干扰导致数据场或CRC场损坏、发送器CRC计算错误 |
| 形式错误 (Form Error) | 所有节点 | 在固定格式的位场(CRC界定符、ACK界定符、EOF)检测到显性位 | 总线电气噪声、节点时序异常、错误帧干扰 |
| 应答错误 (ACK Error) | 发送节点 | 发送器在ACK槽位未检测到显性位(即无节点应答) | 总线上无其他节点、接收节点未正确配置、ACK屏蔽位设置错误 |
4.2 位错误 (Bit Error)
位错误是CAN协议中最直接的错误检测机制,仅由发送节点触发。发送器在发送每一位的同时,持续监控总线电平。如果发送器发送的是显性位(0),但监控到总线为隐性(1),或者发送隐性位(1)却监控到显性位(0),则立即产生位错误。
- 例外情况:在仲裁场和应答场,发送器发送隐性位但监控到显性位是正常的(仲裁丢失或收到应答),此时不视为位错误。
- XMC调试要点:检查XMC4500/4700的CAN模块状态寄存器(如
CAN_NSR中的LEC位域),若值为001(Bit Error),应优先排查总线物理层(终端电阻、线缆阻抗、节点接地)。
4.3 填充错误 (Stuff Error)
CAN协议采用位填充机制:发送器在SOF到CRC场之间,每连续发送5个相同电平的位后,自动插入一个相反电平的填充位。接收器则监控这一规则,若检测到连续6个相同电平,即判定为填充错误。
- 作用:保证总线有足够的电平跳变,用于接收器的时钟同步(PLL锁定)。
- 不受填充保护的段:CRC界定符、ACK场、EOF、IFS(帧间空间)。
- XMC调试要点:填充错误通常由外部噪声或发送器时钟抖动引起。检查XMC的CAN位时序配置(
CAN_BTR),确保采样点位置在75%~85%之间,提高抗干扰能力。
4.4 CRC错误 (CRC Error)
CRC(循环冗余校验)错误由接收节点检测。发送器在CRC场发送一个15位的CRC序列(对于标准帧和扩展帧),该序列由SOF、仲裁场、控制场和数据场通过CRC多项式计算得出。接收器使用相同的多项式重新计算,若结果与接收到的CRC序列不一致,则产生CRC错误。
- 多项式:CAN标准使用
x¹⁵ + x¹⁴ + x¹⁰ + x⁸ + x⁷ + x⁴ + x³ + 1。 - 错误漏检率:CAN的CRC-15的汉明距离为6,可检测所有≤5位的突发错误,漏检率极低(约4.7×10⁻¹¹)。
- XMC调试要点:CRC错误通常与总线噪声或位时序有关。在XMC中,可以通过调整
CAN_BTR的BRP(波特率预分频)和TSEG1/TSEG2(时间段)来优化采样点,减少因信号畸变导致的CRC计算差异。
4.5 形式错误 (Form Error)
形式错误检测的是帧格式的固定位场是否被破坏。CAN协议规定某些位场必须为隐性电平(如CRC界定符、ACK界定符、EOF的第1~6位),如果任何节点在这些位置检测到显性位,则产生形式错误。
- 固定格式位场:
- CRC界定符:1位隐性
- ACK界定符:1位隐性
- EOF(帧结束):7位隐性
- 错误帧的界定符:8位隐性
- 常见原因:总线上的强噪声脉冲、错误帧的二次干扰、节点在EOF期间错误地发送显性位。
- XMC调试要点:形式错误往往伴随其他错误类型出现。检查XMC的CAN错误计数器(
CAN_ECR),若REC(接收错误计数)和TEC(发送错误计数)同时快速增加,说明总线处于严重干扰状态。
4.6 应答错误 (ACK Error)
应答错误仅由发送节点检测。在ACK场中,发送器发送一个隐性位(ACK槽),然后释放总线。所有正确接收到报文的节点(无论是否对该报文感兴趣)必须在ACK槽期间发送一个显性位来确认。如果发送器在ACK槽监控到隐性位(即无节点应答),则产生应答错误。
- 关键点:即使报文内容有误(如CRC错误),接收节点也不会发送ACK显性位,因此发送器会收到ACK错误。
- 典型场景:
- 总线上只有单个节点(无其他节点应答)。
- 接收节点的CAN控制器处于只听模式(Listen-Only Mode),不发送ACK。
- 接收节点的验收滤波器(Acceptance Filter)未配置,导致报文被硬件丢弃,未进入接收缓冲区。
- XMC调试要点:检查XMC的CAN节点配置,确认
CAN_NCR中的LOM(只听模式)位未被置1。同时检查验收滤波器列表(CAN_MO结构体),确保报文ID在允许范围内。
4.7 错误类型与错误帧的关系
任何节点检测到上述五种错误之一后,会立即发送错误帧。错误帧由两部分组成:
- 错误标志(Error Flag):6个连续显性位(主动错误节点)或6个连续隐性位(被动错误节点)。
- 错误界定符(Error Delimiter):8个连续隐性位。
错误帧的发送会强制中断当前正在传输的报文,并通知总线上所有节点丢弃该报文。随后,发送节点会自动重发被中断的报文(前提是错误计数器未达到总线关闭阈值)。
4.8 XMC错误状态寄存器快速定位
在XMC系列微控制器中,CAN模块提供了丰富的状态寄存器用于错误定位。以下是最常用的寄存器及其位域:
| 寄存器 | 位域 | 值 | 含义 |
|---|---|---|---|
CAN_NSR(节点状态寄存器) |
LEC[2:0](最后错误代码) |
000 |
无错误 |
001 |
位错误 (Bit Error) | ||
010 |
形式错误 (Form Error) | ||
011 |
填充错误 (Stuff Error) | ||
100 |
CRC错误 (CRC Error) | ||
CAN_ECR(错误计数器) |
TEC[7:0] |
0~255 | 发送错误计数(≥128 → 错误被动;≥256 → 总线关闭) |
CAN_ECR(错误计数器) |
REC[7:0] |
0~255 | 接收错误计数(≥128 → 错误被动) |
CAN_NSR.LEC获取最后错误类型。如果LEC为111(无有效错误),则检查CAN_ECR的TEC和REC,判断节点是否处于错误被动或总线关闭状态。