4. CAN FD 错误帧:五种错误类型深度拆解

错误帧,是 CAN 总线最底层的自我保护机制。你想想看,一条差分信号线上挂着几十个节点,哪个节点发现不对劲,就立刻拉出错误帧。但问题来了——到底是什么错误?怎么发现的?我做过不少 EMI 整改项目,发现很多工程师把“总线报错”一股脑归因成“干扰”,但实际上错误类型不同,根因和排查路径完全不一样。

CAN FD 规范里定义了 5 种错误类型:位错误、填充错误、CRC 错误、格式错误、ACK 错误。这章咱们一个一个过,我会结合我踩过的坑,告诉你每种错误在 EMI 环境下到底长什么样。

4.1 位错误(Bit Error)

定义很简单:一个节点在发送位的同时,也监控总线上的实际电平。如果送出去的和看到的不一致,就报位错误。

举个例子:节点 A 发送了显性位(0),但因为 EMI 耦合,总线上被拉成了隐性位(1),A 立刻检测到不一致,当场报错。

关键点:位错误只在发送节点自己身上触发。接收节点如果发现信号畸变,它不会报位错误——它只会把收到的位当成合法数据,除非别的地方也能触发错误。

我遇到过不少 case:EMI 噪声恰好在发送节点的采样点附近跳变,导致采样错误。这时候你在示波器上看波形,显性位中间冒了个窄毛刺,发送节点直接报位错误。解决思路通常是降低线缆共模电感的高频阻抗,或者调整采样点位置(比如从 80% 挪到 75%)。

注意:位错误有可能是仲裁阶段正常现象!多个节点同时发送时,隐性位被显性位覆盖也会产生“不一致”。所以错误帧统计时要排除仲裁期的位错误,只看数据场和控制场的。

4.2 填充错误(Stuff Error)

CAN/CAN FD 使用位填充规则:连续发送 5 个相同电平后,必须插入一个相反电平。目的是保证有足够边缘用于时钟同步。如果接收方发现连续 6 个相同位,就触发填充错误。

这个错误在 EMI 环境下特别常见。为什么呢?因为 EMI 可能导致信号畸变,把本该出现的填充位吃掉,或者伪造出额外的填充位。我记得在某个车载项目里,高速运转的电机产生强磁场干扰,每次电机加速时总线上就蹦出一堆填充错误。后来排查发现,是屏蔽层接地不良导致共模电流在 CAN 差分线上产生了差模噪声,把正确的填充位给翻转了。

填充错误 vs 其他错误的区别
对比项填充错误位错误
触发条件连续6个相同位发送与监控不一致
检测方所有接收节点仅发送节点
EMI干扰典型表现填充位被淹没或篡改采样点处信号突变

实战经验:如果你的错误帧统计里填充错误占比超过 60%,先检查终端电阻和共模扼流圈。填充错误往往意味着信号完整性出了问题,而不是节点硬件损坏。

4.3 CRC 错误(Cyclic Redundancy Check Error)

发送节点计算整个帧(包括填充位)的 CRC 校验和,放在 CRC 场。接收节点重新计算一遍,如果对不上,就报 CRC 错误。

这个错误在 EMI 干扰下几乎是 “压死骆驼的最后一根稻草”。因为 CRC 覆盖了整个帧的数据内容,只要有一位被 EMI 翻转,CRC 就会算错。我曾经在实验室复现过一个场景:用近场探头在 CAN 线束上注入 200 MHz 左右的噪声,CRC 错误率从 0 飙升到 15%。

而且你要知道——CRC 错误是 全局广播 的。当一个节点发现 CRC 错误,它会主动发出错误帧,导致所有节点都停止当前发送,重新仲裁。这就解释了为什么一个微小 EMI 事件能导致整条总线“瘫痪”几毫秒。

4.4 格式错误(Form Error)

格式错误针对的是帧中固定格式的场(比如 CRC 分隔符、ACK 分隔符、EOF 等)。这些位在协议里规定死了必须是隐性位。如果检测到显性位,就报格式错误。

我个人觉得格式错误是 最容易被忽略 的错误类型。因为很多人只盯着数据场和 CRC,忘了那些固定位。有一次我在做 EMC 测试,加了几组不同频率的辐射干扰后,错误帧数忽高忽低。折腾了两天,最后用 CAN 协议分析仪一看——全是格式错误!问题出在 CRC 分隔符被干扰拉成了显性,导致所有节点都以为这里不是一个合法帧的结束。

格式错误通常不是节点故障,而是总线电气特性出了问题。检查一下端接电阻的阻值和位置,还有总线上的 stub(分支)长度是否超了 CAN FD 的要求(小于 0.3 m)。

4.5 ACK 错误(Acknowledge Error)

发送节点在 ACK 场期望收到至少一个显性位(表示至少有一个接收节点正确收到了帧)。如果它在 ACK 采样点仍看到隐性位,就报 ACK 错误。

说白了,这就是“没人回我”。原因可能很简单:总线上没有其他节点在监听,或者接收节点因为之前发生了错误而处于离线状态。但在 EMI 干扰下,还有一种可能——干扰导致接收端的 ACK 显性位被发送节点误读为隐性。

我调试过一个案例:两节点 CAN FD 通信,远离干扰源时正常;一靠近变频器,发送节点就疯狂报 ACK 错误。示波器上明明看到 ACK 场有显性位(接收节点正确回应了),但发送节点就是识别不出来。最后发现是共模回流路径上的噪声叠加到了差分信号上,导致发送节点的接收器输入端发生共模闩锁。加了一个共模扼流圈就解决了。

4.6 五种错误类型速查表

错误类型触发条件检测方EMI 干扰常见表现
位错误发送 vs 监控不一致发送节点采样点处毛刺导致误判
填充错误连续6个相同位所有接收节点填充位被翻转或遗漏
CRC错误接收计算的CRC不匹配所有接收节点数据场任何位被干扰都触发
格式错误固定格式位出现显性电平所有接收节点分隔符、EOF等被拉低
ACK错误ACK场无显性位发送节点ACK显性被噪声淹没或接收器共模问题
CAN FD 错误帧的五种类型 CAN FD 错误帧 位错误 填充错误 CRC错误 格式错误 ACK错误 检测方分布 位错误/ACK:发送节点 其他三种:接收节点

4.7 实战要点总结

  • 不要只看错误帧总数——一定要区分类型。我曾经看过一份测试报告,只报了个“错误帧 500 个”,根本没法定位。
  • 位错误 + ACK 错误同时出现,大概率是发送节点的收发器或共模问题。
  • 填充错误 + CRC 错误同时暴增,基本是信号完整性崩了,查端接、查屏蔽。
  • 格式错误单独出现,优先检查固定位附近是否存在窄脉冲干扰(比如电源噪声耦合)。

记住一条经验法则:EMI 导致的错误帧不会只有一种。如果只看到单一类型错误疯狂出现,先怀疑节点本身的硬件故障,而不是 EMI。

这五种错误,说白了就是 CAN FD 的“感官歧视”。每种错误告诉你哪个环节被干扰了。掌握了它们,你看到错误帧就不是一团浆糊,而是一张清晰的故障分布图。下回遇到总线报错,先打开协议分析仪,看看错误类型统计——方向就有了。