3. 错误类型分析:位错误、填充错误、CRC错误、格式错误、应答错误

好,咱们今天来聊聊CAN总线上的五种错误类型。说实话,这五种错误就像五个“捣蛋鬼”,每个都有自己的脾气。我在项目里跟它们打过无数次交道,有的好对付,有的真能让你查一整天。

先给你一个总览表,心里有个底:

错误类型 检测层级 触发条件 严重程度
位错误 发送节点 发送电平与总线不匹配
填充错误 所有节点 连续5个相同位后无填充
CRC错误 接收节点 CRC校验不通过
格式错误 所有节点 帧格式不符合规范
应答错误 发送节点 ACK槽未被置为显性

3.1 位错误——最直接的“对质”

位错误,说白了就是“我说了A,总线却回了B”。发送节点往总线上放一个显性位(0),结果自己读回来是个隐性位(1),那肯定出问题了。

为什么会这样?最常见的原因是总线短路或节点驱动能力不足。我记得有一次,一个客户的车载网关老是报位错误,查了三天。最后发现是CAN收发器的TXD引脚虚焊,导致发送信号幅度不够。嗯,这种硬件问题最隐蔽。

关键点:位错误只在发送节点检测。接收节点不参与位错误检测,因为接收节点本来就不需要“发送后再读取”。

你想想看,如果两个节点同时发送相同的数据,总线电平一致,位错误就不会触发。但如果一个发0一个发1,总线仲裁后显性位获胜,发隐性位的节点就会检测到位错误。这就是CAN总线“胜者为王”的机制。

3.2 填充错误——比特流的“节奏感”

填充错误跟位填充机制有关。CAN协议规定:连续发送5个相同位后,必须插入一个相反位。这是为了给接收节点提供同步时钟边沿。

我曾经遇到一个案例:某ECU在高温环境下频繁报填充错误。排查后发现是晶振温漂太大,导致位时序偏移,接收节点误判了填充位的位置。说白了,时钟精度不够,节奏就乱了。

避坑指南:我曾经在项目里为了省成本,用了精度±1%的晶振。结果高温测试时填充错误频发。后来换成±0.5%的,问题就解决了。CAN总线的时钟容差要求是±1.5%,但实际设计时我建议留足余量。

填充错误的检测逻辑很简单:接收节点在数据流中如果连续检测到6个相同位,就判定为填充错误。注意,CRC界定符和ACK槽这些固定格式部分不参与填充。

3.3 CRC错误——数据的“指纹”对不上

CRC错误是接收节点用来检查数据完整性的。发送节点会计算一个15位的CRC校验码,接收节点收到后重新计算,如果对不上,就报CRC错误。

我个人习惯在开发阶段把CRC错误当作“第一优先级”来排查。为什么?因为CRC错误往往意味着物理层有问题——比如线缆过长、终端电阻不对、或者电磁干扰严重。

注意:CRC错误具有“传染性”。一个节点报CRC错误,其他节点也可能同时报。因为总线上的所有接收节点都会参与CRC校验。如果总线被干扰,所有节点都会受害。

我记得有个项目,总线长度超过40米,终端电阻只加了一端。结果CRC错误率高达5%。后来两端都加上120Ω电阻,错误率降到0.01%以下。嗯,有时候问题就这么简单。

3.4 格式错误——不守规矩的“坏学生”

格式错误检测的是帧格式的固定位域。比如CRC界定符必须是隐性位,ACK界定符也必须是隐性位。如果这些固定位域的电平不对,所有节点都会报格式错误。

格式错误比较少见,但一旦出现,往往意味着节点软件有bug。我遇到过一种情况:某个节点在发送数据时,把CRC界定符误配置成了显性位。结果整个网络都被它拖垮了,所有节点都在报格式错误。

你想想看,格式错误就像交通规则里的“闯红灯”。不是车坏了,是司机不守规矩。所以排查时重点看软件配置,别老盯着硬件。

3.5 应答错误——没人理你的“尴尬”

应答错误是发送节点独有的“尴尬”。发送节点在ACK槽期间等待一个显性位,如果等不到,就报应答错误。这意味着总线上没有其他节点成功接收这帧数据。

为什么会没人应答?要么总线上只有一个节点(孤零零的),要么接收节点都处于bus-off状态,要么接收节点的验收滤波把所有帧都过滤掉了。

实战经验:我曾经调试一个系统,某个节点一直报应答错误。查了半天发现,接收节点的验收滤波配置错了,把标准帧和扩展帧搞混了。发送节点发的是扩展帧,接收节点只接收标准帧,自然没人应答。

应答错误还有一个特点:它不会触发错误帧。因为发送节点检测到应答错误后,会重发数据帧。但如果连续重发都失败,发送节点最终会进入bus-off状态。嗯,这就是“社死”的CAN总线版本。

小结

五种错误类型,各有各的脾气。我个人建议你在排查时按这个优先级来:

  1. 先看CRC错误——大概率是物理层问题
  2. 再看位错误——可能是驱动或短路问题
  3. 然后看应答错误——检查节点配置和网络拓扑
  4. 填充错误和格式错误——通常是软件bug或时钟问题

记住一句话:错误帧不是敌人,它是CAN总线给你的“诊断报告”。读懂它,你就能找到问题根源。下一节咱们聊聊错误帧的生成机制和传播过程,到时候你会更清楚这些错误是怎么“闹大”的。