CAN 总线电路:60Ω 是一根活总线的脉搏(以 STM32F4 为例)
位同步篇 结尾说「下一站终于要拆收发器篇那颗 666µs 的炸弹了」——结果这次又被点了名,炸弹第三次排队(排队排出了惯性,下一篇真的拆)。这次的题目是三篇 CAN 一直当道具用的那根线本身:芯片外面的电路。收发器篇 讲完了芯片里面(TXD/RXD、驱动管、超时),位同步篇讲完了时间轴(边沿、拨表),但双绞线、120Ω、那个悬停的 2.5V,一直没人为它们单独开一场——而它们才是 CAN 硬件故障里出镜率最高的主角。
先看一个现场场景。机器人 CAN 调不通,抓包工具都懒得开,老工程师掏出一只万用表,打到欧姆档,断电,红黑表笔搭上 CAN_H 和 CAN_L,看一眼读数就下结论:60Ω,硬件没事,去查软件;40Ω,你多挂了终端电阻,去把驱动器上的拨码关掉;120Ω,有一端的电阻没装或者线断了,去顺着线摸。全程没上电、没发包、没碰任何一颗芯片——CAN 的物理层故障,万用表比 candump 先知道。
还有个新手必踩的坑埋在这个场景里:明明每块板子上都焊了 120Ω,怎么读出来不是 120?四个关节电机驱动器各自带一颗内置终端电阻,加上主控端那颗——五颗 120Ω 并联,读数 24Ω。总线「看起来接得对」,协议一层挑不出任何毛病,却从通电第一天起就病着。这篇就讲清楚这些读数背后的账。
这篇分三层:L1 给出一条总线的接线纪律和体检单;L2 算三笔账——阻抗、共模、反射,正好对应 120Ω、双绞线、支线长度这三条纪律的来历;L3 想明白为什么这根线必须被当成「一根传输线」而不是「一段接线」。
L1:先让它跑起来——接线纪律与体检单
你在第一层。目标:把一条真总线接得「出厂即健康」,而不是接完靠运气。
最小硬件清单(收发器选型和接线见 收发器篇):一条双绞线、两个 120Ω 电阻、每块板一颗 CAN 收发器。接线纪律只有四条,但每条背后都是 L2 的一笔账:
- 拓扑手拉手:一根主干线从一端走到另一端,节点从主干上「就近引出」。不是星型(从中央辐射出去)、不是环形,更不是「每块板各拉一根线到配电盒汇合」。
- 终端电阻挂两端,只挂两端:120Ω 跨接在 CAN_H 和 CAN_L 之间,物理上最远的两个位置各一个,中间节点一律不挂。有拨码开关或焊桥的板子(很多电机驱动器内置终端电阻,印象中多数默认拨到「关」,上电前值得逐块确认——未逐一核对各厂商默认值,欢迎指正),组网前先核一遍状态。
- 支线要短:每个节点从主干引出的小辫子(stub)尽量短,高速率下手掌长度量级。多长的账 L2 算。
- 线用双绞的:CAN_H 和 CAN_L 绞在一起,不是捆在一起——要的是「绞」,不是「并」。
然后是体检单。断电欧姆档量 CAN_H↔CAN_L,这个读数只由拓扑和电阻决定,和任何芯片、任何代码无关,所以它才敢在断电时下诊断:
| 读数 | 判定 | 一句话理由 |
|---|---|---|
| 60Ω | 健康 | 两端各 120Ω,并联:120/2 |
| 120Ω | 只有一个终端在岗,或线路有断点 | 一颗电阻够不着并联 |
| 40Ω / 30Ω / 24Ω | 多挂了 1 / 2 / 4 颗终端电阻 | 120/3、120/4、120/5 |
| 0Ω 上下 | H 和 L 短路 | 查接线端子 |
| ∞ | 干路断线 | 顺着线摸 |
上电电压档(不发数据时量):CAN_H 对地 ≈ 2.5V,CAN_L 对地 ≈ 2.5V——这是隐性的长相(数值出自 收发器篇 核过的手册表)。通信中上示波器:显性时 H 抬到 ≈3.5V、L 压到 ≈1.5V。两项体检互补:欧姆档量的是拓扑,电压档量的是偏置——一个测「线接对了没有」,一个测「有人在给线供电吗」。
到这一步你会接、会查了。但体检单上每个数字都欠着解释:为什么偏偏是 120Ω?为什么只挂两端、多挂反而病?断电时那 2.5V 已经消失——它是谁供的、为什么需要它?以及最反直觉的一条:位宽是微秒级的、边沿是纳秒级的,支线那点小辫子凭什么坏事?
L2:懂原理——阻抗、共模、反射三笔账
到这一层,问题变了:四条接线纪律分别防的是什么?
一、阻抗账:120Ω 不是随便选的,也不是随便挂的
先回答 120Ω 的来历。信号边沿在导线上不是瞬间到位的「电平变化」,而是一朵以约 5ns/m 奔跑的「浪」(《CAN 总线篇》 实验三用过的速度)。浪走在一段均匀导线上时,看到的是一个由分布电感和分布电容决定的「瞬时阻抗」——特性阻抗。CAN 选定的双绞线(差分、绞距固定)特性阻抗标称 120Ω,高速 CAN 物理层标准 ISO 11898-2 的整套电气指标就是围这个数设计的——具体条款我未当场核对原文,欢迎指正,但「双绞线 ≈ 120Ω」这个工程事实四十年没变过。
终端电阻的岗位由此确定:浪跑到总线尽头,看见一个和自己一路走来所见完全相同的阻抗,就头也不回地被吸收——不产生反射。120Ω 不是负载、不是上拉、不是下拉,它的本职是「浪的出口」。这也解释了为什么挂两端:浪从任何一个位置出发都同时向两头跑,两头都得有出口,缺一个,那头的浪就原样弹回来。
「只挂两端、中间不挂」是同一笔账的另一半。中间某点并联一个 120Ω,等于在河道里突然放宽一倍——浪跑到这里,一部分继续、一部分反射,回去的浪叠加在来的浪上,边沿开始变形。数量多了还有第二笔恶账:并联账。N 颗 120Ω 并联是 120/NΩ:两颗 60Ω,四颗 30Ω,机器人那种五颗 24Ω。负载越重,显性差分电压越瘪。粗算一下:把输出级近似当恒流源,60Ω 负载下差分典型 2V(收发器篇 那张表)对应约 33mA;同样电流打在 24Ω 上只剩约 0.8V——跌破 0.9V 的显性判决线,接收方开始「看不清」。这个模型很糙(输出级不是理想恒流源,实际是内阻吃账、电流被限),但结论方向不会错:终端挂多的症状不是「立刻不通」,是「差分电压滑向判决线」——波形看起来都在动,错帧偶发、越带负载越糟。这也是手册纪律的本意:TJA1050 的「显性差分 ≥1.5V」这条合格线,是在 60Ω 负载下定义的(收发器篇核过手册);负载偏离 60Ω,手册没有背书任何值。
顺手还一笔旧账。收发器篇 结尾留过一个真问题:分裂终端(split termination——不用一颗 120Ω,改用两个 60Ω 串联,中点经电容接地)如果接 Vref 偏置,两个终端节点各自的 Vref 会不会互相灌电流打架?这篇把它往前推一步:标准分裂终端的中点接的是电容,电容隔直——两个中点之间根本不构成直流回路,「打架」在这张图里不发生。这大概也是它选中点接地、不选中点接 Vref 的原因之一(此为我的推演,未在文献里找到明说这层动机的原文,欢迎指正)。而中点真正的工作是给共模电流开一条高频低阻的到地通路——这笔账记在下一节。
二、共模账:2.5V 悬停与双绞的用意
断电后那 2.5V 消失了,上电后它是谁供的?终端电阻供不了——两颗电阻只把 H 和 L 连在一起,哪一根都没接电源。把两条线悬停在半电源的,是每颗收发器内部往半电源方向的弱偏置(隐性时 CAN_H 和 CAN_L 都在 2.5V 附近,合格范围 2.0~3.0V——收发器篇 手册数字;内部结构是接收输入端的偏置网络,从手册参数反推的合理机制,未拆片核对)。这层弱偏置买到的,是对称的摆动空间:显性时 H 从 2.5V 抬到 3.5V、L 从 2.5V 压到 1.5V——上下各留 1.5V 的余量,不顶天不落地,给共模扰动留出缓冲。
因为共模扰动是一定会来的,这就轮到「绞」字了。外部干扰(电机、点火、开关电源)砍在电缆上时是同时、等量砸向两根线的——只要两线的物理位置平均下来重合,砍下来的就是纯共模,差分接收只看差值,一起抖等于没抖(《CAN 总线篇》 说过这半句)。「双绞」保证的正是「平均位置重合」:每绞一次,谁离干扰源近谁远就交换一次,全长平均下来两线看到的世界一样。两根线并排走,一根永远贴着干扰源,共模里就掺进了差模分量——差分免疫的护甲破了一角。CAN_H/CAN_L 没有极性、可以整根对调,但「绞在一起」这件事没有商量余地。
共模还有一条边界:收发器扛得住的共模电压是 −2V~+7V(HVD230 手册数字,收发器篇核过)。这层边界的含义是各节点不需要严格共地——地电位差平移整个 2.5V 摆动窗,只要别平移出这 9V 的窗,差分照收。但跨设备长线(机器人本体到外部控制柜、两个独立供电的系统对接)的地电位差可能超出这个窗——那是共模的护甲也救不了的领域,解法不在电平上而在隔离上:隔离型收发器(数字隔离器 + 收发器,或集成一体的隔离收发器)配隔离电源,把两边的地在直流上彻底断开,共模窗口随隔离屏障的耐压一起变宽。这是机器人 CAN 的常见配置,账目简单:地差超过 9V 的窗,就买隔离。
三、反射账:位是微秒级的,边沿是纳秒级的
最后一笔账最难,因为它的主角在示波器上要放大才看得见。
直觉上讲,支线那点长度不可能坏事:1Mbps 的位宽是 1000ns,一根 1m 的支线,浪打个来回 2×1×5 = 10ns——差了一百倍,凭什么坏事?因为反射吃的不是位,是边沿。收发器输出的边沿是 ns 级的陡峭翻转(印象中 TJA1050 这类高速收发器的总线摆率在数十 ns 这一档,未当场核对手册原值,欢迎指正),位同步篇说过,全网的对表、采样全押在边沿落点上。支线是一段尽头开路的传输线:主干的浪跑到支线接口,分出一朵钻进支线;它在支线尽头被全反射,再原路折返,重新灌回主干——一朵延迟了「2×支线长×5ns/m」的鬼边沿,叠加在真边沿的尾巴上。判决标准由此而来:鬼边沿必须赶在真边沿长完之前回来,两朵浪融成一个略胖的边沿,无害;回来晚了,就是一个独立的假翻转,正好砸进别人正在对表的窗口。
用位宽算,这标准宽得离谱(采样点在 87.5%,1Mbps 下预算 875ns,支线能伸到几十米);用边沿算,几十 ns 的上升时间把支线摁在米级以下。约束从来不是位,是边沿——这也是位同步篇那笔「BS1 路费账」的姊妹账:路费账管主干的来回(超了,采样点读不到正确电平);反射账管支线的鬼影(超了,采样点读到的是叠加了鬼影的电平)。两笔账合起来,就是「主干可以几十米、支线只有零点几米」这种悬殊比例的来历。行业经验表格通常把 1Mbps 的支线上限收在 0.3m 量级(印象中 CiA 及各厂商应用笔记有对照表,未核对原文)——比物理极限紧得多,紧出来的部分买的是余量:多支线叠加、节点电容、未来升 CAN FD。
到这里三笔账齐了。但把三笔账放在一起看,会发现它们其实在讲同一件事——这根线不能当「接线」对待。
L3:想得透——你接的不是线,是一根传输线
到这一层,问题只剩一个:三笔账背后共用的那条设计前提是什么?
本质
去掉所有术语,CAN 的电路到底是什么?一根被故意做成「处处阻抗相等」的传输线,两端用和它一模一样的电阻封口。120Ω 买的是干净的边沿(浪到头有出口,不折返);双绞买的是「干扰面前两线平等」(共模护甲的制造工艺);2.5V 偏置买的是对称的摆动空间(上下各留缓冲)。一句话说给同事听:你以为在接线,其实在给一朵朵 ns 级的浪修河道——河道要均匀(特性阻抗处处 120Ω)、河口要收浪(终端电阻)、两岸要同权(双绞)。位同步篇的结论「整根总线就是时钟线」在这篇有了下半句:时钟线是要养护的——它的每一个边沿都是浪,浪是被电路惯着走的。
心智模型:运河与湖。主干是河道,支线是死胡同,终端电阻是河道尽头的湖——浪进了湖就摊平成水面,不回头。拆脚手架:其一,水往低处流是单向的,浪是双向的——任何节点开口,浪同时向两头跑,所以「两端」一个都不能少;其二,「阻抗」不是欧姆表量的直流电阻(那是终端电阻的读数),是浪行进中看到的瞬态阻抗——它由线自身的电感电容决定,藏在导体几何形状里,这就是为什么「同样的铜,双绞的和并排的、笔直的和打折的性格完全不同」。
三个被否决的方案
被否决的方案一:每个节点都端接(「处处有出口」的过度矫正)。 两端要出口,那干脆每块板都挂 120Ω,岂不是走到哪儿都有出口?阻抗账当场翻车:N 颗并联成 120/NΩ,河道每过一站放宽一格,浪在每一站都部分反射;更糟的是总线特性变成节点数的函数——接十块板和接四块板是两条不同的总线,驱动级的账全得重算。这也回答了一个更深的「为什么」:CAN 的拓扑必须长成「一根线、两个头」的形状,是物理层强制的,不是布线美观建议——端接「恰好两个」和拓扑「恰好一条主干」互为因果。
被否决的方案二:干脆不端接(「短线不是能跑吗」)。 短线确实能跑,这正是它阴险的地方:短线时反射在边沿建立的时间里已经跑完好几个来回、衰减干净,示波器上波形看着只是「不太方」,桌面联调全通。线一长、速率一高,鬼边沿开始落在别人的采样窗口里——症状是偶发仲裁错、偶发 CRC 错,和软件 bug 的表现一模一样。这门课以太网交过学费:早期同轴以太网(10BASE2)的 50Ω 终结器丢一个,整段网瘫,老网工的传说里排障第一步永远是摸两端终结器在不在。CAN 的 120Ω 是同一门课的补考,考点一样:没挂终端的总线不是「少了零件」,是物理上不完整。
被否决的方案三:星型 + 有源集线器(现代以太网思路)。 集线器每个口重驱动,支线爱多长多长,免去手拉手布线的麻烦。第一笔账是单点故障:集线器死了全网哑巴,和 《CAN 总线篇》 否决主机的判决词一字不差——把主持权下沉到物理层的整套设计,不允许物理拓扑先长出一个中央角色。第二笔账是每一段集线器到节点都是一条独立传输线,每段两端又得各自端接——省下的是布线形状,加倍的是端接数量和反射界面。第三笔账最朴素:机器人上多一台有源设备,就多一份供电、故障和成本清单。CAN 的手拉手拓扑不是技术落后的将就,是「无主机」哲学在物理形状上的投影——连线的几何都在说:这里没有中央。
一个反直觉收尾
回头看开头那只万用表,它真正厉害的地方不是量电阻,而是它的诊断居然不需要任何芯片参与。整个 CAN 系统里,寄存器、过滤器、波特率、任务调度——出问题时每一层都可能是嫌疑犯,唯独物理层的健康可以由 R、L、C 和拓扑完全决定,断电可测、一测就准。这不是巧合,是分层的赠品:层和层之间只交换定义好的东西(收发器只交给控制器一个 RXD 电平),所以故障也可以按层切割——欧姆档负责「线和电阻」,电压档负责「偏置和供电」,示波器负责「边沿的形状」,全过了才轮到 candump 进场。反过来,跳过体检直接抓包,就是在一个未知的物理层上解读协议——位同步篇那个「时好时坏、把排查方向引向软件」的陷阱,一半是这么造成的。
动手环节:一只万用表、一个计算器
实验一:五个读数的现场判。 一台机器人:主控 + 四个关节电机驱动器,全部接上了,CAN 偶发错帧。断电,欧姆档量 CAN_H↔CAN_L,读数 24Ω。先预测:这个读数对应什么配置?怎么改?
答案:120/24Ω 倒数关系 = 五颗 120Ω 并联——主控板上一颗,四个驱动器各自内置一颗(默认开启)。多数驱动器的设计意图是「单电机调试时板上自带终端」——真组网时该关掉。改法:关掉/焊掉全部驱动器的内置终端,只留主控和最远端驱动器各一颗(或干脆两端都由主控和线端电阻承担)。复检读数回到 60Ω。这道题的陷阱在于 24Ω 恰好「不短不断」,示波器上波形都在动——差分电压账(L2 一)决定了它的症状是「越带载越糟的偶发错」,而不是干脆不通。顺手把五个读数都推一遍:60 健康、120 一端失守、40/30 多挂、∞ 断线——一张读数表就是一张拓扑 X 光片。
实验二:支线的两种算法。 1Mbps,位宽 1000ns,采样点 87.5%,边沿上升时间按 25ns 算(量级示意值)。先预测:用「位宽」当预算,支线最长能伸多远?用「边沿」当预算呢?两个答案差多少倍?
答案:位宽账:反射要在采样点前消停,预算 875ns,支线往返 2×L×5ns ≤ 875ns → L ≤ 87m——荒谬,真按这个接,1m 支线就开始出症状。边沿账:鬼边沿要赶在真边沿长完前回来,2×L×5ns ≤ 25ns → L ≤ 2.5m——量级立刻对了。两笔账差 35 倍,而行业表还要再收(0.3m 量级),收掉的买余量。这道题的考点:给支线定规矩的是边沿,不是位。位同步篇说「BS1 是路费」——那是主干的账;支线的账得另开一页,两页不能混着签。
实验三:差分电压的下坡路。 假设输出级近似恒流 33mA(60Ω 负载下差分 2V 的反推),判决线 0.9V。先预测:终端从 2 颗挂到 3 颗、4 颗、5 颗,显性差分电压各是多少?哪一颗起越过判决线?
答案:120/2=60Ω → 2V;120/3=40Ω → 1.3V;120/4=30Ω → 1V;120/5=24Ω → 0.8V——第五颗越线,第四颗只剩 0.1V 裕量。但真机大概率比这个模型死得早:恒流假设在重载下先失效(内阻、限流都往更糟的方向掰),而且共模扰动直接吃这 0.1V。工程结论不是「挂四颗还能凑合」,而是手册合格线在 60Ω 下才成立,偏离负载就是偏离背书——电路的纪律像位时序的纪律一样,是「合同」,不是「建议」。
三个自测问题,能答上说明这三层你真爬过了:
- 120Ω 为什么挂两端、只挂两端?(答案在 L2 一与 L3 方案一:浪双向跑、两头都要出口;中间挂 = 阻抗跳变点 + 并联账压低差分电压,且让总线特性变成节点数的函数。)
- 隐性时终端电阻不接电源,2.5V 是谁供的?为什么必须供?(答案在 L2 二:收发器内部弱偏置;供出对称摆动空间,给共模扰动留缓冲。)
- 不加终端电阻短线能跑、长线偶发错——「短线能跑」和「长线出错」各是什么机理?(答案在 L3 方案二与 L2 三:短线反射在边沿时间内衰减完;长线鬼边沿落进别人的采样/对表窗口,症状伪装成软件 bug。)
最后留一个我自己没找到干净答案的真问题:屏蔽双绞线的屏蔽层,该单端接大地还是两端接? 两端接,高频共模电流有了到地回路、EMI 好,但两个「地」之间有电位差时会形成地环路,把工频哼声灌回屏蔽层;单端接恰好反过来。两派的说法我都听过言之凿凿的版本,机理上各有对的一半,我自己没做过对比实测——机器人上到底怎么选,如果你的项目里用示波器对比过两种接法,我很想听结论。
收尾地图
一张「症状 → 查什么」的速查表收尾(电压/阈值数字出自 收发器篇 核过的手册):
| 症状/场景 | 查什么 | 一句话理由 |
|---|---|---|
| 组网前验收 | 断电量 H↔L:要 60Ω | 欧姆档是拓扑的 X 光(实验一) |
| 读数 40/30/24Ω | 板载内置终端电阻的拨码/焊桥 | 多挂一颗,差分电压下坡一格(实验三) |
| 读数 120Ω 或 ∞ | 一端电阻失守、干路断线 | 两端的出口一个都不能少 |
| H/L 对地都是 0V | 收发器供电、偏置 | 隐性时该有 ≈2.5V 的悬停 |
| 波形在动、偶发错帧 | 显性差分是否 ≥1.5V(60Ω 负载的合格线) | 手册只背书 60Ω 的世界 |
| 桌面通、装机偶发错 | 终端数量 + 支线长度 + 采样点(位同步篇) | 三层体检按序过,最后才轮到软件 |
| EMI 辐射超标 | 分裂终端(2×60Ω + 中点电容到地) | 给共模电流开高频到地的路 |
| 跨设备长线不稳 | 地电位差是否超 −2~+7V 共模窗 | 超窗买隔离收发器,不修电平 |
| 布线 | 手拉手主干 + 支线 ≤0.3m 量级 | 位宽不管支线,边沿管(实验二) |
下一站(这次是真的):那颗从收发器篇一路排到现在的 666µs 炸弹——接收 FIFO 只有 3 级,500kbps 下满打满算 666µs 的余量,轮询路线在真实机器人上活不过第一版。把 CAN 接收改成中断、再塞进 《FreeRTOS 队列》,死线就拆掉了。拆完炸弹,三篇硬件铺垫就全部到位,CANopen 的门也就在眼前了。