4. CAN总线错误类型:位错误、填充错误、CRC错误、形式错误、应答错误

CAN协议定义了五种独立的错误类型,用于检测总线通信中的各类故障。任何CAN控制器在发送或接收报文时,只要检测到其中一种错误,就会立即产生错误帧,中断当前通信。理解这五种错误类型的触发条件、检测位置和典型场景,是排查XMC系列工业通信故障的基础。

核心原则:CAN的错误检测机制覆盖了位电平、编码规则、数据完整性、帧结构和应答确认五个维度,确保任何单点故障都不会导致错误报文被误认为有效。

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),应优先排查总线物理层(终端电阻、线缆阻抗、节点接地)。
排查建议:位错误频繁出现时,使用示波器测量CAN_H和CAN_L的差分电压。正常显性电平约1.5~2.5V,隐性电平约0V。若显性电平低于1.2V,说明总线驱动不足或存在短路。

4.3 填充错误 (Stuff Error)

CAN协议采用位填充机制:发送器在SOF到CRC场之间,每连续发送5个相同电平的位后,自动插入一个相反电平的填充位。接收器则监控这一规则,若检测到连续6个相同电平,即判定为填充错误。

  • 作用:保证总线有足够的电平跳变,用于接收器的时钟同步(PLL锁定)。
  • 不受填充保护的段:CRC界定符、ACK场、EOF、IFS(帧间空间)。
  • XMC调试要点:填充错误通常由外部噪声或发送器时钟抖动引起。检查XMC的CAN位时序配置(CAN_BTR),确保采样点位置在75%~85%之间,提高抗干扰能力。
位填充规则与填充错误触发示意图 正常发送(5个相同位后插入填充位): 1 1 1 1 1 0 ← 填充位(相反电平) 填充错误触发(连续6个相同电平): 1 1 1 1 1 1 ← 第6个相同位 → 填充错误! 说明: • 填充位由发送器自动插入,接收器自动移除(去填充)。 • 填充错误意味着总线上的位流违反了编码规则,通常由噪声或发送器故障引起。

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错误。
  • 典型场景:
    1. 总线上只有单个节点(无其他节点应答)。
    2. 接收节点的CAN控制器处于只听模式(Listen-Only Mode),不发送ACK。
    3. 接收节点的验收滤波器(Acceptance Filter)未配置,导致报文被硬件丢弃,未进入接收缓冲区。
  • XMC调试要点:检查XMC的CAN节点配置,确认CAN_NCR中的LOM(只听模式)位未被置1。同时检查验收滤波器列表(CAN_MO结构体),确保报文ID在允许范围内。
常见误区:很多开发者认为“只要总线上有节点,ACK就不会出错”。实际上,如果接收节点的验收滤波器未正确配置,硬件会自动丢弃报文而不发送ACK,导致发送器产生ACK错误。这是XMC CAN调试中最容易被忽略的问题之一。

4.7 错误类型与错误帧的关系

任何节点检测到上述五种错误之一后,会立即发送错误帧。错误帧由两部分组成:

  1. 错误标志(Error Flag):6个连续显性位(主动错误节点)或6个连续隐性位(被动错误节点)。
  2. 错误界定符(Error Delimiter):8个连续隐性位。

错误帧的发送会强制中断当前正在传输的报文,并通知总线上所有节点丢弃该报文。随后,发送节点会自动重发被中断的报文(前提是错误计数器未达到总线关闭阈值)。

错误检测 → 错误帧发送 → 报文重发流程 发送节点 接收节点 接收节点 CAN 总线 检测到错误 (位/填充/ACK错误) 检测到错误 (CRC/填充/形式错误) 检测到错误 (CRC/填充/形式错误) 所有节点发送错误帧(6个显性位 + 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 → 错误被动)
调试技巧:在XMC的CAN中断服务程序中,优先读取CAN_NSR.LEC获取最后错误类型。如果LEC为111(无有效错误),则检查CAN_ECR的TEC和REC,判断节点是否处于错误被动或总线关闭状态。