第2章 CAN总线物理层:差分信号、电平定义与拓扑结构
说实话,很多工程师学CAN协议,上来就啃数据帧、位填充这些。但我个人觉得,物理层才是真正决定系统稳不稳定的根基。你想想看,如果物理层设计有坑,上层协议再完美,车跑起来照样会丢帧。
这一章,我们就来把CAN物理层彻底讲透。我会结合自己这些年调试CAN网络踩过的坑,帮你把差分信号、电平定义、拓扑结构和终端电阻这些概念,一次理清楚。
2.1 为什么CAN要用差分信号?
先问一个问题:为什么CAN不直接用单端信号,非要搞两根线?
原因很简单——车载环境太恶劣了。发动机点火、电机驱动、电磁阀动作,到处都是干扰。单端信号线,比如你常见的UART的TX/RX,抗干扰能力很弱。干扰一上来,电平就跳变,数据就错。
CAN用的差分信号,说白了就是:
- CAN_H 和 CAN_L 两根线同时传输
- 接收器只看两根线的 电压差,不看对地电压
举个例子:假设外界来了一个共模干扰,把CAN_H和CAN_L同时抬高了2V。单端信号早就乱套了,但差分接收器只关心Vdiff = CAN_H - CAN_L。两根线同时抬高,差值不变,信号纹丝不动。
核心优势:
- 共模抑制比高,抗干扰能力强
- 双线冗余,一根断线还能单线工作(部分情况)
- 适合长距离传输(最远可达1km以上)
我记得有一次在台架上调试,电机一启动,UART通信就乱码。换成CAN之后,同样的线束,同样的干扰源,数据纹丝不动。从那以后,我对差分信号就特别信任。
2.2 CAN_H与CAN_L的电平定义
CAN总线有两种逻辑状态:显性(Dominant) 和 隐性(Recessive)。
说白了,显性就是“主动拉低”,隐性就是“释放总线”。
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 (Vdiff) | 逻辑值 |
|---|---|---|---|---|
| 隐性 | 2.5V | 2.5V | 0V | 1(逻辑高) |
| 显性 | 3.5V | 1.5V | 2V | 0(逻辑低) |
这里有个容易混淆的点:隐性对应逻辑1,显性对应逻辑0。为什么这么设计?因为总线采用“线与”机制——多个节点同时发送时,显性位会覆盖隐性位。仲裁的时候,谁先发0(显性),谁就赢。
我的经验:测量CAN总线静态电压时,如果CAN_H和CAN_L都在2.5V附近,说明总线处于空闲状态(隐性)。如果CAN_H接近3.5V、CAN_L接近1.5V,说明有节点正在发送数据。这个判断方法,我在现场排查总线“卡死”问题时用过无数次。
2.3 总线拓扑结构
CAN总线采用 多主总线 拓扑。所有节点都挂在同一条总线上,不分主从。
结构上,它是一条 直线型总线,两端各接一个终端电阻。节点通过“T型”分支(stub)连接到主干线上。
重要约束:
- 主干线长度:标准CAN(125kbps~1Mbps)最长约40m(1Mbps时)
- 分支长度:不超过0.3m(高速CAN),低速CAN可放宽到几米
- 节点数量:标准CAN最多30个节点(实际建议不超过16个)
我曾经见过一个项目,为了布线方便,把分支线拉到了1米多。结果总线反射严重,通信时好时坏。最后老老实实把分支剪短,问题就解决了。
下面这张图,是我自己画的一个典型CAN总线拓扑结构,你可以直观地看到节点、主干、分支和终端电阻的关系。
2.4 终端电阻的作用
终端电阻,就是挂在总线两端的120Ω电阻。很多人觉得它只是“匹配阻抗”,其实它的作用远不止这些。
我总结了一下,终端电阻有三大作用:
- 消除信号反射:高速信号在总线末端遇到阻抗突变时,会产生反射。反射信号叠加到原信号上,会造成波形畸变。120Ω匹配了CAN收发器的输出阻抗,让信号“有去无回”。
- 提供显性电平的回路:发送显性位时,CAN_H和CAN_L之间需要形成电流回路。终端电阻就是这个回路的负载。没有它,显性电平根本拉不出来。
- 总线空闲状态偏置:隐性状态下,CAN_H和CAN_L都是2.5V。终端电阻帮助维持这个共模电压,让总线处于确定状态。
为什么是120Ω?
CAN总线使用的双绞线,其特征阻抗大约是120Ω。终端电阻取120Ω,就是为了和传输线的特征阻抗匹配,最大程度减少反射。这个值不是拍脑袋定的,是ISO 11898标准明确规定的。
我遇到过一个问题:某项目CAN通信偶尔丢帧,用示波器一看,总线波形上有明显的“振铃”。检查发现,总线一端接了120Ω,另一端没接。补上之后,波形干净得像教科书一样。嗯,终端电阻真的不能省。
避坑指南:
- 终端电阻必须接在总线 物理两端,不是任意位置
- 不要用单个60Ω电阻代替两个120Ω并联——那是给低速CAN用的
- 测量总线电阻时,断电状态下,CAN_H和CAN_L之间应该是60Ω(两个120Ω并联)
- 如果测出来是120Ω,说明有一端没接电阻;如果是0Ω,说明短路了
2.5 物理层设计检查清单
最后,我把自己做CAN物理层设计时常用的检查清单分享给你。每次画完原理图、布完板,我都会对着它过一遍:
| 检查项 | 要求 | 常见问题 |
|---|---|---|
| 终端电阻 | 总线两端各一个120Ω | 漏接、接在中间、阻值不对 |
| 分支长度 | 高速CAN ≤ 0.3m | 分支过长导致反射 |
| 节点数量 | 建议 ≤ 16个 | 节点过多导致负载过重 |
| 线缆类型 | 双绞线,特征阻抗120Ω | 用普通导线代替 |
| 共模电压 | 隐性时CAN_H/CAN_L ≈ 2.5V | 电源地偏移导致共模电压漂移 |
| 接地 | 所有节点共地 | 地电位差过大损坏收发器 |
这一章的内容就到这里。物理层是CAN通信的基石,把差分信号、电平定义、拓扑和终端电阻搞明白,后面的协议解析才能顺风顺水。下次调试的时候,记得先拿万用表量一下总线电阻——60Ω,心里就有底了。