终端电阻缺失:CAN 节点频繁 bus-off

产线 CAN 网络多个节点每隔几小时失联,根因是总线一端缺少 120Ω 终端电阻、长支线反射导致位错误,节点反复进入 bus-off 且未自动恢复。补终端电阻并启用自动恢复后稳定。

问题背景

工厂一条产线的控制系统用 CAN 总线组网,主控网关加 11 个执行节点,主控是 STM32F103 加 TJA1050 收发器,速率 500kbps,总线长度大约 80 米。节点负责电机、气缸、传感器的控制与采集,网关每秒轮询一轮,掉线的节点会在上位机标红。

这套网络运行了一年多,偶发单节点掉线,重启节点就好。上个月产线改造,新增了一个检测工位,施工队在总线中段拉了一根 5 米的支线接新节点。之后掉线开始变多:每天都有几个节点失联,重启后能撑几个小时,然后再次掉线。

故障现象

  • 上位机多个节点随机标红,每次掉线的节点不固定,有时一个,有时三四个。
  • 节点失联后不会自己恢复,必须断电重启;重启后正常一段时间,几小时到一天不等。
  • 节点固件里读到 HAL_CAN_GetError 返回 HAL_CAN_ERROR_BOF,CAN 控制器的发送错误计数器 TEC 已经到 255。
  • 总线负载不高,正常时不到 30%,排除带宽打满。
  • 产线电机启动、变频器工作时掉线更频繁,夜里停机时明显减少。
  • 网关侧能看到节点停止发送心跳,但总线上的其他节点还在正常通信。

排查过程

第一步确认控制器状态。在故障节点上通过调试串口打印 CAN_ESR,TEC 已经到 255,REC 也不低,LEC 显示位错误或填充错误。CAN 控制器在发送错误累计到 255 时会进入 bus-off,主动退出总线,不再发送任何帧;如果固件没有开启自动恢复,它就会一直停在那里,表现就是“节点失联”。

第二步量总线。断电后用万用表测 CAN_H 与 CAN_L 之间的电阻,正常应该是两个 120Ω 终端并联后的 60Ω;实际测到 120Ω,说明只有一端接了终端电阻,另一端是开路的。再上示波器看波形,CAN_H/CAN_L 上有明显的振铃和过冲,边沿不干净,典型的总线反射。

第三步查布线。现场是手拉手加中途分支的混合拓扑:网关在控制柜,末端节点在产线尾部,最远端的节点没有终端电阻;新增的检测工位从总线中段拉了一根 5 米支线,支线末端也没有匹配。500kbps 下,支线建议控制在 0.3 米以内,5 米支线相当于一根天线,反射会把位电平搅乱。

第四步解释链路。CAN 是差分总线,靠两根线的电平差判位;终端电阻的作用是吸收信号能量、抑制反射。缺一端终端、加上长支线,信号在末端反射回来,和后续位叠加,采样点就可能判错;每次位错误让 TEC 加 8,成功发送一次减 1,错误率一高,TEC 很快冲到 255,节点进入 bus-off。电机和变频器工作时干扰更强,错误率更高,所以掉线更频繁。

第五步验证。在末端节点并联一只 120Ω 电阻,总线电阻变成 60Ω;把 5 米支线缩短到 0.3 米以内,重新压接屏蔽层;示波器上的振铃明显收敛。再给固件开启 STM32 的 ABOM(自动 bus-off 管理),并在初始化里加 bus-off 恢复流程,节点在 bus-off 后能自动重新上线。连续观察一周,TEC 保持在个位数,没有节点再失联。

解决方案

  1. 补终端电阻:在总线物理两端各装一只 120Ω 电阻,断电测量 CAN_H 与 CAN_L 之间应为 60Ω 左右;不要在每个节点上都装,也不要只在网关一端装。
  2. 改拓扑:改成手拉手菊花链,主干走双绞屏蔽线;节点支线控制在 0.3 米以内,新增设备必须从主干节点串接,不能从总线中段随便拉长线。
  3. 处理屏蔽与地:屏蔽层单端接地,避免形成地环路;所有节点共地,CAN 收发器的参考地电位差过大会直接破坏差分信号。
  4. 开启 bus-off 自动恢复:STM32 bxCAN 置位 CAN_MCR 的 ABOM,让控制器在 bus-off 后自动执行恢复序列;同时在应用层记录 bus-off 次数、TEC/REC 峰值,恢复后重新初始化过滤器。
  5. 加错误监控:节点心跳里带上 TEC、REC、bus-off 计数,网关侧对错误计数持续上升的节点告警,不要等它彻底失联。
  6. 验收标准:总线电阻 60Ω、示波器无明显振铃、72 小时无 bus-off、TEC 峰值低于 30;新增节点上线前按这套标准复测。

根因分析

直接根因是 CAN 总线一端缺少 120Ω 终端电阻,加上新增的 5 米长支线,信号在末端反射造成位错误;错误累计使 TEC 超过 255,节点进入 bus-off,而固件没有开启自动恢复,节点一直停在离线状态。

更深一层,是把 CAN 当成“两根线接上就能通”的总线。CAN 是传输线,终端匹配、拓扑、支线长度、共地和屏蔽都是电气规范的一部分;500kbps 下这些参数对信号完整性的影响会被放大,少一个电阻、多一根支线,实验室短距离可能看不出来,到了产线 80 米的现场就会以随机掉线的形式暴露。

还有一层是监控只看了“节点在不在线”,没看“节点错误计数高不高”。TEC 从 0 涨到 255 是一个过程,如果提前采集错误计数器,完全可以在节点真正 bus-off 之前发现总线质量在恶化。

预防措施

  • CAN 布线纳入施工规范:菊花链拓扑、两端 120Ω、支线长度上限、双绞屏蔽、单端接地、共地要求,验收时逐项测量。
  • 新增节点或改线必须做总线评审,禁止从主干中段拉长支线;改完用示波器和电阻测量复验。
  • 固件默认开启 bus-off 自动恢复,并记录 bus-off、TEC/REC 峰值,作为设备健康指标上报。
  • 网关侧对节点错误计数做趋势告警,TEC 持续上升或 bus-off 次数增加时提前排查。
  • 产线强干扰区域(变频器、伺服、大功率电机)优先使用隔离收发器或光纤转换,减少共模干扰。

总结

CAN 总线不是两根普通导线,而是一条有阻抗、有反射、有终端匹配的传输线。一个 120Ω 电阻和一根 5 米支线,足以让节点从“偶尔掉线”变成“每天失联”;而固件不开自动恢复,又把一次总线错误变成了永久离线。把电气规范写进施工验收,把错误计数器纳入监控,CAN 网络才能在强干扰的产线上长期稳定。

延伸阅读

使用 Hugo 构建
主题 Stack 由 Jimmy 设计