3. CAN FD 错误帧的定义与类型:主动错误帧、被动错误帧、过载帧

说实话,干这行这么多年,我见过不少工程师一上来就拿着逻辑分析仪抓波形,看见一段乱糟糟的显性脉冲就喊“错误帧”。可要是连这帧是主动发出来的还是被动发出来的都分不清,后面分析故障原因根本无从下手。咱们今天就把三种错误帧的定义、结构、以及触发条件彻底理清。

3.1 错误帧的核心构成

不管哪种错误帧,其实骨架都一样:错误标志 + 错误分隔符。错误标志可以是6个连续的显性位,也可以是6个连续的隐性位(但会被其他节点覆写),而错误分隔符固定是8个隐性位。分隔符的作用是让总线恢复到隐性状态,保证后续的正常帧或过载帧能正常开始。

一个重要的细节:错误帧不是由单个节点发完就结束的。当多个节点同时检测到错误,它们会叠加发送错误标志,导致总线上的显性位长度可能超过6位。逻辑分析仪上看到的错误帧时长往往是“6+叠加”,别误以为那是另一种错误类型。

3.2 主动错误帧

主动错误帧由错误主动(Error Active)节点发出。什么节点是主动的?只要节点的发送错误计数(TEC)或接收错误计数(REC)都小于128,它就处于主动状态。主动节点一旦发现总线错误(比如位填充错、CRC错、ACK错等),立刻在下一个位时间输出6个显性位作为主动错误标志。

我之前调试一台车的中控屏,白屏死机,拿逻辑分析仪一抓——总线上一串6位的显性脉冲,紧跟着8个隐性位,前后帧还都正确。我一看,这是典型的主动错误帧。查下去发现是某个传感器芯片的供电纹波太大,导致位采样出错,传感器自己主动报了错。

  • 错误标志长度:6位,全显性(0)
  • 分隔符:8位,全隐性(1)
  • 后续行为:主动帧结束后,出错节点自动重发被破坏的帧
  • 叠加效果:多个主动节点同时报错,显性位长度变成6~12位不等

我的习惯:在逻辑分析仪上设置触发条件为“显性位连续超过5位”,就可以精准捕获主动错误帧的开始位置。之后再检查分隔符是否完整,就能跟被动错误帧区分开。

3.3 被动错误帧

当一个节点的TEC或REC大于等于128,它就会切换为错误被动(Error Passive)状态。被动节点在检测到错误时,只能发送6个隐性位作为被动错误标志。注意,隐性位本身不驱动总线,所以其他主动节点很容易覆盖这个标志——这意味着被动错误帧的波形往往不明显。

为什么会有被动状态?说白了,这是CAN协议的一种“隔离机制”。让频繁出错的节点先闭嘴,不要一直发主动错误把整条总线打垮。我遇到过一台工业机器人,电机驱动器反复掉线,追查发现它的REC已经飙到200多了,发出的被动错误标志被其他节点覆盖,连错误帧的波形都看不清晰,最后只能靠状态寄存器确认它是被动状态。

  • 错误标志长度:6位,全隐性(1)
  • 分隔符:8位,全隐性(1)
  • 危险之处:被动标志可能完全被主动节点淹没,逻辑分析仪上只看到一段长的隐性电平,容易被忽略
  • 节点状态:错误被动节点在发送完成后不会自动重发,它必须等到总线空闲后才能再次尝试

我曾经踩过的坑:刚用逻辑分析仪时,看到一段长时间隐性电平就以为总线空闲,结果漏掉了被动错误帧。后来发现,在空闲帧间隔里如果出现6个以上的隐性位,其实应该判断为被动错误帧。我建议你在解码时勾选“忽略空闲帧间隔”选项,或者手动计算位时间。

3.4 过载帧

过载帧和错误帧长得像,但原因完全不同。它并不是因为数据传错了,而是因为节点接收器没准备好,或者帧间隔的前两个位里检测到了显性位。过载帧的结构也是过载标志(6个显性位)+ 过载分隔符(8个隐性位)。

你想想看,一个节点在结束上一帧后,需要一点时间处理接收到的数据。如果总线紧接着又来一个帧的首位,处理不过来的节点就会主动发出6个显性位,把总线拉长。过载帧的目的就是“喊停”,给接收节点争取时间。

  • 过载标志:6位显性(0)
  • 过载分隔符:8位隐性(1)
  • 触发条件:
    1. 帧间隔第1位或第2位检测到显性电平
    2. 接收器因处理延迟无法在预期时间开始下一帧
    3. 总线错误(但此时会优先发错误帧)
  • 与错误帧的区别:过载帧只在帧间隔或帧结束前触发,而错误帧可以在帧内任何位置触发

我记得有一次系统跑着跑着突然卡顿,抓波形发现每隔几个正常帧就出现一段6位显性+8位隐性的波形。起初我以为是主动错误帧,但看帧结构完全正确,也没有错误标志。后来发现是一个网关芯片的CPU负载太高,导致接收FIFO溢出,它用过载帧来强制推迟下一帧。

3.5 三种错误帧的快速比照

特性 主动错误帧 被动错误帧 过载帧
触发原因 错误主动节点检测到总线错误 错误被动节点检测到总线错误 接收器未准备好 / 帧间隔异常
错误标志 6位显性 6位隐性 6位显性
分隔符 8位隐性 8位隐性 8位隐性
节点是否重发 自动重发 等待总线空闲后重发 不重发,只是延时
波形辨识度 极易识别 容易被淹没 与主动错误帧相似,但位置不同
节点状态 Error Active Error Passive 无状态变化

3.6 本章知识结构图

下面这张图帮你理清三种错误帧的关系与差异,方便你以后在逻辑分析仪波形上一眼判断类型。

CAN FD 错误帧分类与结构 CAN FD 错误帧 主动错误帧 被动错误帧 过载帧 主动错误标志 6位显性 + 8位隐性分隔符 触发:Error Active节点 自动重发 波形:清晰显性脉冲 被动错误标志 6位隐性 + 8位隐性分隔符 触发:Error Passive节点 等待空闲后重发 波形:隐性位被覆盖 过载标志 6位显性 + 8位隐性分隔符 触发:接收器未准备好 不重发,仅延迟 波形:帧间隔内出现 结构共性 错误标志(6位) + 错误分隔符(8位隐性) 分隔符确保总线恢复隐性状态