1. 从一次现场调试翻车说起:为什么偏偏是120Ω
做嵌入式或者汽车电子这行的,估计没人没跟CAN总线打过交道。我印象特别深,早些年接手一个车载控制器的联调项目,实验室台架上跑得好好的,装车之后偶发丢帧,尤其是电机一启动,通信误码率直接飙上去。查了三天,示波器一挂,波形上那个反射振铃看得人头皮发麻。最后问题出在哪?一条支线的末端终端电阻漏贴了,整条总线等效负载从60Ω变成了接近120Ω,阻抗不连续,信号在末端来回弹。
这件事之后,我把CAN物理层的东西从头到尾捋了一遍。今天想聊的这个话题,就是那个被无数人当作"标配"却很少有人真正讲清楚的问题——CAN总线终端电阻为什么必须是120Ω。这不是一个拍脑袋定下来的数字,它背后是阻抗匹配和信号完整性这两件事在物理层的硬约束。
先把结论摆出来:120Ω这个值,本质上是双绞线特性阻抗的数值,终端电阻的作用是让总线两端的阻抗连续,把传输线末端的信号能量吸收掉,避免反射。两个120Ω并联,总线静态差分负载是60Ω,这个60Ω又刚好匹配CAN收发器驱动能力和ISO 11898标准对负载的要求。所以它不是"选"出来的,是被传输线物理特性和标准共同"定"出来的。
这篇文章我打算从原理讲到实操,包括怎么算、怎么测、怎么排查,以及那些文档里不会写的坑。适合刚接触CAN物理层的朋友,也适合做了几年但一直没深究过终端电阻的老手——我保证你能从里面捞到点新东西。
2. 阻抗匹配到底在匹配什么:把传输线当成水管来理解
2.1 特性阻抗不是电阻,别被名字骗了
很多人第一次听到"特性阻抗120Ω",下意识觉得那是个电阻值,其实完全不是一回事。特性阻抗(Characteristic Impedance)描述的是电磁波在传输线上传播时,电压波和电流波的比值,记作Z0。它由传输线单位长度的电感L和电容C决定:
Z0 = √(L / C)
注意,这个公式里没有频率,也没有线长。也就是说,对于一条几何结构均匀的双绞线,它的特性阻抗是一个相对固定的值,跟你信号频率关系不大(在一定的频率范围内)。CAN常用的屏蔽或非屏蔽双绞线,特性阻抗典型值就在95Ω到140Ω之间,而ISO 11898标准把标称值定在了120Ω。
为什么是120而不是100或者150?这跟线缆制造工艺、收发器驱动能力、以及行业早期的事实标准都有关系。汽车行业大量使用的双绞线,其几何尺寸和绝缘材料决定了Z0落在120Ω附近最经济、最稳定。标准一旦定下来,整个生态——收发器、连接器、线束——都围绕这个值来设计,形成了路径依赖。
2.2 反射是怎么产生的:水管突然变细的类比
你可以把信号在传输线上的传播想象成水流在水管里走。如果水管从头到尾粗细一致,水就顺畅地流过去。但如果水管末端突然堵死(开路),水撞到尽头会反弹回来;如果末端突然变成一个巨大的水池(短路),水会瞬间泄掉,同样产生扰动。
电信号也一样。当信号沿着特性阻抗为Z0的线缆传播,到达末端时,如果末端负载阻抗ZL不等于Z0,就会发生反射。反射系数Γ的公式是:
Γ = (ZL - Z0) / (ZL + Z0)
- 末端开路:ZL = ∞,Γ = 1,全反射,信号原样弹回。
- 末端短路:ZL = 0,Γ = -1,也是全反射,但相位相反。
- 末端接Z0:ZL = Z0,Γ = 0,无反射,能量被完全吸收。
CAN总线两端各接一个120Ω终端电阻,正是为了让末端负载等于线缆特性阻抗,把反射系数压到零。这就是阻抗匹配的核心目的。
2.3 为什么是两个120Ω而不是一个60Ω
这里有个特别容易被问到的点:既然总线静态差分阻抗要60Ω,为什么不干脆一端接一个60Ω?
原因在于拓扑对称性。CAN是总线型拓扑,两端都要端接。如果只在一端接60Ω,另一端开路,那么开路那一端照样全反射,问题没解决。两端各接120Ω,从任意一端看进去,看到的都是"120Ω终端 + 远端120Ω并联后的等效",在信号传播的瞬间,远端电阻还没"感知"到,靠的是传输线本身的Z0来吸收。等信号到达远端,被120Ω吸收掉。两端对称,反射最小。
而且两个120Ω并联得到60Ω,这个值恰好是CAN收发器差分驱动能力的最佳负载点。负载太重(阻抗太低),驱动电流不够,差分电压幅度上不去;负载太轻(阻抗太高),抗干扰能力下降。60Ω是权衡后的甜点。
3. 120Ω背后的电气计算:从差分电压到负载能力
3.1 差分信号与显性/隐性电平
CAN用的是差分信号,两根线CAN_H和CAN_L。逻辑"0"(显性位)时,收发器把CAN_H拉高、CAN_L拉低,差分电压Vdiff = V(CAN_H) - V(CAN_L) 典型值约2V;逻辑"1"(隐性位)时,两线都回到约2.5V的共模电平,Vdiff接近0V。
这个差分电压是怎么建立起来的?靠的是收发器内部的驱动电路往总线上灌电流。以典型的高速CAN收发器为例,显性状态下,它会在CAN_H和CAN_L之间形成一个约2V的电压差,同时驱动电流流过总线负载。
3.2 负载电阻决定了驱动电流
总线上的等效负载,就是两个120Ω终端电阻并联,加上所有节点收发器的输入阻抗(通常很高,几十kΩ以上,可忽略)。所以等效负载:
R_load = 120Ω // 120Ω = 60Ω
显性状态下,收发器需要在这个60Ω负载上建立约2V的差分电压,那么驱动电流大约是:
I = V / R = 2V / 60Ω ≈ 33mA
这个33mA就是收发器差分驱动级需要提供的电流量级。如果终端电阻选错,比如只接了一个120Ω(负载120Ω),电流只要约16mA,看似更省电,但抗干扰裕度下降;如果误接了三个120Ω(负载40Ω),电流要50mA,很多收发器驱动能力不够,差分电压被拉低,通信直接失败。
所以120Ω不是随便定的,它直接决定了收发器的驱动电流预算和噪声容限。
3.3 不同终端方案的对比
实际工程里,终端电阻的接法不止一种,我整理了一个对比表,方便你选型时参考:
| 终端方案 | 接法 | 等效负载 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|---|
| 标准双端120Ω | 总线两端各一个120Ω | 60Ω | 反射最小,标准推荐 | 需两端都接 | 绝大多数CAN网络 |
| 单端120Ω | 仅一端接120Ω | 约120Ω | 省一个电阻 | 另一端反射严重 | 极短总线(<10cm)应急 |
| 分裂终端 | 每端两个60Ω串联,中点接电容到地 | 60Ω | 改善共模,EMC好 | 成本高,布线复杂 | 高EMC要求场合 |
| 单电阻60Ω | 一端接60Ω | 60Ω | 负载正确 | 另一端仍反射 | 不推荐 |
提示:分裂终端(Split Termination)在汽车EMC敏感场景里越来越常见,两个60Ω串联、中点通过一个4.7nF到100nF的电容接地,能把共模噪声旁路掉,同时对差模阻抗还是120Ω。如果你的项目过不了辐射发射测试,可以试试这个方案。
4. 信号完整性视角:反射、振铃与位定时
4.1 反射如何毁掉一帧报文
CAN的位速率从几十kbps到1Mbps不等(CAN FD更高)。信号沿总线传播,遇到阻抗不连续点就反射。反射波和原始波叠加,会在接收端造成过冲、下冲、振铃。如果振铃幅度超过收发器的采样阈值,或者持续时间跨过了采样点,接收端就会把显性误判成隐性,或者反过来,导致位错误。
我实测过一个案例:一条约20米的总线,末端漏接终端电阻,500kbps下用示波器看接收端波形,显性位下降沿之后有明显的振铃,幅度接近1V,持续约200ns。而500kbps一个位时间是2μs,采样点在位时间的75%左右,也就是1.5μs处。振铃虽然没直接盖住采样点,但它抬高了噪声基底,一旦有外部干扰叠加,误码就来了。
4.2 传播延迟与终端电阻的关系
信号在双绞线上的传播速度大约是光速的2/3,即约5ns/m。一条40米的总线,单程传播延迟约200ns,往返400ns。这个往返时间必须远小于位时间,否则反射波会在同一个位时间内回来捣乱。
对于1Mbps,位时间1μs,往返400ns已经占了40%,相当危险。所以高速CAN对总线长度有严格限制,1Mbps通常不超过40米。终端电阻在这里的作用,就是把往返反射的能量尽快吸收,缩短振铃的衰减时间。
4.3 用ADS做一次信号完整性仿真
如果你手头有Keysight ADS或者类似的SI仿真工具,可以搭一个简单的CAN通道模型验证一下。基本步骤:
- 用传输线模型(TLINP或理想传输线)设置Z0=120Ω,延迟按线长算(比如20米,延迟100ns)。
- 两端各接120Ω电阻到参考地(差分的话用两个单端模型)。
- 激励源用一个带上升沿的脉冲,模拟CAN收发器的显性驱动,上升沿设成几十ns。
- 在接收端探针观察波形。
仿真里你可以做对比实验:把一端电阻去掉,立刻能看到反射振铃;把电阻改成60Ω,波形幅度会变化。这种仿真不需要很精确的模型,定性验证足够了。我一般用它来给新人讲反射,比纯讲公式直观得多。
注意:仿真里的传输线模型是理想的,实际线缆有损耗、有寄生参数,振铃会比仿真里衰减得快一些。所以仿真看到"很糟"的波形,实测可能没那么糟,但趋势是对的。
5. 实操排查:终端电阻到底该不该加、怎么测
5.1 万用表测终端电阻的正确姿势
最常用的排查手段就是断电测电阻。把总线两端设备都断电(注意是断整个网络的电,不是只断一个节点),用万用表测CAN_H和CAN_L之间的直流电阻。
- 正常情况:约60Ω(两个120Ω并联)。
- 测到120Ω:只有一端接了终端电阻。
- 测到约40Ω:多接了一个终端电阻(三个并联)。
- 测到很大或开路:两端都没接,或者线断了。
这个测量必须在完全断电下做,因为收发器内部有保护二极管,带电测量会得到错误读数。我见过有人带电测出30多欧,吓得以为短路,其实是二极管导通造成的。
5.2 容错测试中终端电阻的角色
热词里提到"CAN通信物理层容错测试",这个场景很典型。做容错测试时,经常要模拟线缆断路、短路、终端丢失等故障,看网络能不能降级运行。这里有个常见误区:测试时为了"制造故障"把终端电阻拔掉,结果整个网络都瘫了,误以为是协议栈的问题。
实际上,终端电阻属于物理层,拔掉它属于物理层故障,协议层的容错机制(比如错误帧、总线关闭恢复)是在物理层还能勉强通信的前提下才起作用的。如果反射严重到根本收不到正确位,协议层再强也没用。所以做容错测试时,终端电阻的配置要单独作为一个变量来控制,别跟协议测试混在一起。
5.3 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决 |
|---|---|---|---|
| 偶发丢帧,电机启动时加剧 | 终端电阻缺失或错误 | 断电测CAN_H-CAN_L电阻 | 补齐两端120Ω |
| 波形振铃严重 | 阻抗不连续、支线过长 | 示波器看接收端波形 | 缩短支线,检查终端 |
| 通信距离上不去 | 终端电阻不匹配 | 测等效负载 | 确认60Ω |
| 多节点时通信异常 | 终端电阻重复接入 | 逐个节点断电排查 | 只保留两端 |
| EMC测试辐射超标 | 共模噪声大 | 近场探头定位 | 改用分裂终端 |
6. 那些文档不会告诉你的实操心得
6.1 终端电阻不一定非要"物理上"在两端
标准说终端电阻在总线两端,但"两端"指的是电气拓扑的末端,不是物理位置。有些项目为了布线方便,把终端电阻做在连接器里,或者做在某个节点的PCB上,只要它在电气上是总线的最远端就行。我做过一个项目,终端电阻直接集成在线束的末端接插件里,省了一个节点盒,效果一样好。
但要注意:如果终端电阻做在节点内部,而这个节点又不在物理末端,那就等于在总线中间加了个负载,会造成阻抗不连续。所以做之前一定要画清楚拓扑图。
6.2 支线(Stub)长度是隐形杀手
终端电阻对了,不代表信号就一定好。支线长度是另一个大坑。从主干线分出去到节点的线叫支线,支线太长,信号在支线上来回反射,一样破坏信号完整性。
经验值:500kbps时支线不超过1米,125kbps时不超过5米。这个没有绝对公式,跟线缆参数有关,但大致是这个量级。我见过有人把节点用3米长的线挂到500kbps总线上,结果就是偶发误码,查了半天才想到支线。
6.3 终端电阻的功率和精度别忽视
120Ω终端电阻在显性状态下要消耗功率。按33mA驱动电流算,每个电阻上的功耗约:
P = I² × R,但注意电流是两个电阻分担的,单个电阻电流约16.5mA P = (0.0165)² × 120 ≈ 0.033W
看起来很小,选0603封装都够。但如果总线长时间处于显性(比如故障时),功耗会累积。我一般选0805或1206封装,留足余量。精度方面,用1%精度的金属膜电阻就够了,没必要上0.1%,因为线缆本身的特性阻抗公差就有±10%左右,电阻再准也没用。
6.4 热词里那个"Chrome 120"是个美丽的误会
搜索热词里混进来一个"this extension requires google chrome version 120 or greater",这明显是浏览器扩展的报错,跟CAN终端电阻的120Ω完全是两码事。做技术搜索时经常遇到这种关键词污染,别被带偏。CAN的120Ω是物理层的阻抗值,跟软件版本号没有任何关系。
6.5 FPGA实现CAN时终端电阻怎么处理
热词里还有"FPGA是实现CAN总线",这个我得多说两句。用FPGA做CAN控制器时,FPGA本身只实现协议层(位定时、CRC、仲裁等),物理层还是要外接收发器芯片(比如TJA1050、SN65HVD230之类)。终端电阻是接在收发器的总线侧,跟FPGA无关。
但有个细节:FPGA的IO电平跟收发器的逻辑电平要匹配,通常是3.3V或5V。如果FPGA直接驱动收发器的TX引脚,注意电平兼容。终端电阻千万别接到FPGA的IO上,那是总线侧的事。
7. 从阻抗匹配延伸到整个物理层设计
聊到这儿,终端电阻的事基本说透了。但我想再往外延一点,因为阻抗匹配和信号完整性这两个概念,不只用在CAN上。RS-485、FlexRay、以太网,甚至高速PCB上的差分对,都是同一套逻辑:让传输线的特性阻抗和终端负载匹配,把反射压下去。
CAN的120Ω之所以经典,是因为它把这个问题简化到了一个极致的程度——两个电阻,一个数值,覆盖了绝大多数场景。你不需要复杂的匹配网络,不需要仿真调参,照着标准接就行。这种"简单可靠"正是CAN能在汽车和工业领域活这么多年的原因之一。
我自己在带新人的时候,喜欢让他们先做一件事:拿一条双绞线,两端接120Ω,用信号发生器打一个方波进去,示波器看波形;然后把一端电阻拔掉,再看波形。那个反射振铃的对比,比讲一小时公式都管用。物理层的东西,看得见摸得着,才记得住。
最后分享一个我常用的快速判断法:上电前先断电测电阻,60Ω左右心里就有底了。如果测出来不对,别急着上电,先把终端电阻的事搞清楚。我踩过的坑里,物理层问题占了通信故障的一大半,而终端电阻又是物理层问题里最高频的一个。把它搞明白,能省下大量调试时间。