<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Bus-Off on Zero Day Notes</title>
        <link>https://blog.5772447.xyz/tags/bus-off/</link>
        <description>Recent content in Bus-Off on Zero Day Notes</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh</language>
        <lastBuildDate>Sun, 08 Nov 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://blog.5772447.xyz/tags/bus-off/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>终端电阻缺失：CAN 节点频繁 bus-off</title>
            <link>https://blog.5772447.xyz/posts/b7e66573/</link>
            <pubDate>Sun, 08 Nov 2026 09:00:00 +0800</pubDate>
            <guid>https://blog.5772447.xyz/posts/b7e66573/</guid>
            <description>&lt;h2 id=&#34;问题背景&#34;&gt;&lt;a href=&#34;#%e9%97%ae%e9%a2%98%e8%83%8c%e6%99%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;问题背景&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;工厂一条产线的控制系统用 CAN 总线组网，主控网关加 11 个执行节点，主控是 STM32F103 加 TJA1050 收发器，速率 500kbps，总线长度大约 80 米。节点负责电机、气缸、传感器的控制与采集，网关每秒轮询一轮，掉线的节点会在上位机标红。&lt;/p&gt;&#xA;&lt;p&gt;这套网络运行了一年多，偶发单节点掉线，重启节点就好。上个月产线改造，新增了一个检测工位，施工队在总线中段拉了一根 5 米的支线接新节点。之后掉线开始变多：每天都有几个节点失联，重启后能撑几个小时，然后再次掉线。&lt;/p&gt;&#xA;&lt;h2 id=&#34;故障现象&#34;&gt;&lt;a href=&#34;#%e6%95%85%e9%9a%9c%e7%8e%b0%e8%b1%a1&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;故障现象&#xD;&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;上位机多个节点随机标红，每次掉线的节点不固定，有时一个，有时三四个。&lt;/li&gt;&#xA;&lt;li&gt;节点失联后不会自己恢复，必须断电重启；重启后正常一段时间，几小时到一天不等。&lt;/li&gt;&#xA;&lt;li&gt;节点固件里读到 &lt;code&gt;HAL_CAN_GetError&lt;/code&gt; 返回 &lt;code&gt;HAL_CAN_ERROR_BOF&lt;/code&gt;，CAN 控制器的发送错误计数器 TEC 已经到 255。&lt;/li&gt;&#xA;&lt;li&gt;总线负载不高，正常时不到 30%，排除带宽打满。&lt;/li&gt;&#xA;&lt;li&gt;产线电机启动、变频器工作时掉线更频繁，夜里停机时明显减少。&lt;/li&gt;&#xA;&lt;li&gt;网关侧能看到节点停止发送心跳，但总线上的其他节点还在正常通信。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;排查过程&#34;&gt;&lt;a href=&#34;#%e6%8e%92%e6%9f%a5%e8%bf%87%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;排查过程&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;第一步确认控制器状态。在故障节点上通过调试串口打印 &lt;code&gt;CAN_ESR&lt;/code&gt;，TEC 已经到 255，REC 也不低，LEC 显示位错误或填充错误。CAN 控制器在发送错误累计到 255 时会进入 bus-off，主动退出总线，不再发送任何帧；如果固件没有开启自动恢复，它就会一直停在那里，表现就是“节点失联”。&lt;/p&gt;&#xA;&lt;p&gt;第二步量总线。断电后用万用表测 CAN_H 与 CAN_L 之间的电阻，正常应该是两个 120Ω 终端并联后的 60Ω；实际测到 120Ω，说明只有一端接了终端电阻，另一端是开路的。再上示波器看波形，CAN_H/CAN_L 上有明显的振铃和过冲，边沿不干净，典型的总线反射。&lt;/p&gt;&#xA;&lt;p&gt;第三步查布线。现场是手拉手加中途分支的混合拓扑：网关在控制柜，末端节点在产线尾部，最远端的节点没有终端电阻；新增的检测工位从总线中段拉了一根 5 米支线，支线末端也没有匹配。500kbps 下，支线建议控制在 0.3 米以内，5 米支线相当于一根天线，反射会把位电平搅乱。&lt;/p&gt;&#xA;&lt;p&gt;第四步解释链路。CAN 是差分总线，靠两根线的电平差判位；终端电阻的作用是吸收信号能量、抑制反射。缺一端终端、加上长支线，信号在末端反射回来，和后续位叠加，采样点就可能判错；每次位错误让 TEC 加 8，成功发送一次减 1，错误率一高，TEC 很快冲到 255，节点进入 bus-off。电机和变频器工作时干扰更强，错误率更高，所以掉线更频繁。&lt;/p&gt;&#xA;&lt;p&gt;第五步验证。在末端节点并联一只 120Ω 电阻，总线电阻变成 60Ω；把 5 米支线缩短到 0.3 米以内，重新压接屏蔽层；示波器上的振铃明显收敛。再给固件开启 STM32 的 ABOM（自动 bus-off 管理），并在初始化里加 bus-off 恢复流程，节点在 bus-off 后能自动重新上线。连续观察一周，TEC 保持在个位数，没有节点再失联。&lt;/p&gt;&#xA;&lt;h2 id=&#34;解决方案&#34;&gt;&lt;a href=&#34;#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;解决方案&#xD;&#xA;&lt;/h2&gt;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;补终端电阻&lt;/strong&gt;：在总线物理两端各装一只 120Ω 电阻，断电测量 CAN_H 与 CAN_L 之间应为 60Ω 左右；不要在每个节点上都装，也不要只在网关一端装。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;改拓扑&lt;/strong&gt;：改成手拉手菊花链，主干走双绞屏蔽线；节点支线控制在 0.3 米以内，新增设备必须从主干节点串接，不能从总线中段随便拉长线。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;处理屏蔽与地&lt;/strong&gt;：屏蔽层单端接地，避免形成地环路；所有节点共地，CAN 收发器的参考地电位差过大会直接破坏差分信号。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;开启 bus-off 自动恢复&lt;/strong&gt;：STM32 bxCAN 置位 &lt;code&gt;CAN_MCR&lt;/code&gt; 的 ABOM，让控制器在 bus-off 后自动执行恢复序列；同时在应用层记录 bus-off 次数、TEC/REC 峰值，恢复后重新初始化过滤器。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;加错误监控&lt;/strong&gt;：节点心跳里带上 TEC、REC、bus-off 计数，网关侧对错误计数持续上升的节点告警，不要等它彻底失联。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;验收标准&lt;/strong&gt;：总线电阻 60Ω、示波器无明显振铃、72 小时无 bus-off、TEC 峰值低于 30；新增节点上线前按这套标准复测。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;根因分析&#34;&gt;&lt;a href=&#34;#%e6%a0%b9%e5%9b%a0%e5%88%86%e6%9e%90&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;根因分析&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;直接根因是 &lt;strong&gt;CAN 总线一端缺少 120Ω 终端电阻，加上新增的 5 米长支线，信号在末端反射造成位错误；错误累计使 TEC 超过 255，节点进入 bus-off，而固件没有开启自动恢复，节点一直停在离线状态&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;p&gt;更深一层，是把 CAN 当成“两根线接上就能通”的总线。CAN 是传输线，终端匹配、拓扑、支线长度、共地和屏蔽都是电气规范的一部分；500kbps 下这些参数对信号完整性的影响会被放大，少一个电阻、多一根支线，实验室短距离可能看不出来，到了产线 80 米的现场就会以随机掉线的形式暴露。&lt;/p&gt;&#xA;&lt;p&gt;还有一层是监控只看了“节点在不在线”，没看“节点错误计数高不高”。TEC 从 0 涨到 255 是一个过程，如果提前采集错误计数器，完全可以在节点真正 bus-off 之前发现总线质量在恶化。&lt;/p&gt;&#xA;&lt;h2 id=&#34;预防措施&#34;&gt;&lt;a href=&#34;#%e9%a2%84%e9%98%b2%e6%8e%aa%e6%96%bd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;预防措施&#xD;&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;CAN 布线纳入施工规范：菊花链拓扑、两端 120Ω、支线长度上限、双绞屏蔽、单端接地、共地要求，验收时逐项测量。&lt;/li&gt;&#xA;&lt;li&gt;新增节点或改线必须做总线评审，禁止从主干中段拉长支线；改完用示波器和电阻测量复验。&lt;/li&gt;&#xA;&lt;li&gt;固件默认开启 bus-off 自动恢复，并记录 bus-off、TEC/REC 峰值，作为设备健康指标上报。&lt;/li&gt;&#xA;&lt;li&gt;网关侧对节点错误计数做趋势告警，TEC 持续上升或 bus-off 次数增加时提前排查。&lt;/li&gt;&#xA;&lt;li&gt;产线强干扰区域（变频器、伺服、大功率电机）优先使用隔离收发器或光纤转换，减少共模干扰。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;总结&#34;&gt;&lt;a href=&#34;#%e6%80%bb%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;总结&#xD;&#xA;&lt;/h2&gt;&lt;p&gt;CAN 总线不是两根普通导线，而是一条有阻抗、有反射、有终端匹配的传输线。一个 120Ω 电阻和一根 5 米支线，足以让节点从“偶尔掉线”变成“每天失联”；而固件不开自动恢复，又把一次总线错误变成了永久离线。把电气规范写进施工验收，把错误计数器纳入监控，CAN 网络才能在强干扰的产线上长期稳定。&lt;/p&gt;&#xA;&lt;h2 id=&#34;延伸阅读&#34;&gt;&lt;a href=&#34;#%e5%bb%b6%e4%bc%b8%e9%98%85%e8%af%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;延伸阅读&#xD;&#xA;&lt;/h2&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.5772447.xyz/posts/10494fcc/&#34; &gt;RS485 总线干扰致采集网关每隔几小时集体掉线&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.5772447.xyz/posts/65c53b2c/&#34; &gt;I2C 总线被拉死：传感器读数全部超时&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
        </item></channel>
</rss>
