第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总线拓扑结构,你可以直观地看到节点、主干、分支和终端电阻的关系。

CAN总线拓扑结构示意图 120Ω 120Ω 节点1 节点2 节点3 节点4 拓扑要点 主干线两端各接一个120Ω终端电阻 | 分支长度尽量短(<0.3m) 节点通过T型分支挂接到主干线,避免星型或环型拓扑

2.4 终端电阻的作用

终端电阻,就是挂在总线两端的120Ω电阻。很多人觉得它只是“匹配阻抗”,其实它的作用远不止这些。

我总结了一下,终端电阻有三大作用:

  1. 消除信号反射:高速信号在总线末端遇到阻抗突变时,会产生反射。反射信号叠加到原信号上,会造成波形畸变。120Ω匹配了CAN收发器的输出阻抗,让信号“有去无回”。
  2. 提供显性电平的回路:发送显性位时,CAN_H和CAN_L之间需要形成电流回路。终端电阻就是这个回路的负载。没有它,显性电平根本拉不出来。
  3. 总线空闲状态偏置:隐性状态下,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Ω,心里就有底了。