第二讲:CAN物理层——差分信号原理、CAN_H与CAN_L电平、总线拓扑结构、终端电阻作用

各位同学,欢迎来到第二讲。

上一讲我们聊了CAN总线的基本概念,知道它为什么在汽车和工业领域这么吃香。今天咱们深入一层,看看CAN总线在物理层面是怎么工作的。

说白了,物理层就是信号在线上怎么跑的问题。你想想看,如果信号都传不过去,上层协议再牛也没用。我刚开始接触CAN时,总觉得物理层很简单,不就是两根线嘛。结果第一次调试就栽了跟头——信号乱跳,怎么都抓不到正确的波形。后来才发现,是终端电阻没接对。

好,咱们正式开始。

2.1 为什么CAN要用差分信号?

先问大家一个问题:为什么CAN不直接用单端信号,非要搞两根线?

单端信号,比如UART,一根线对地传信号。优点是简单,缺点是抗干扰能力差。汽车里到处都是电机、点火线圈,电磁环境极其恶劣。单端信号在这种环境下,分分钟被干扰得面目全非。

差分信号就不一样了。它用两根线传同一个信号,但相位相反。接收端只看两根线的电压差,不看它们对地的绝对电压。

举个例子:

  • CAN_H 电压 = 3.5V,CAN_L 电压 = 1.5V,差分电压 = 3.5 - 1.5 = 2.0V → 逻辑0(显性)
  • CAN_H 电压 = 2.5V,CAN_L 电压 = 2.5V,差分电压 = 2.5 - 2.5 = 0V → 逻辑1(隐性)

如果外部干扰同时加到两根线上,比如都升高了0.5V:

  • CAN_H = 4.0V,CAN_L = 2.0V,差分电压 = 4.0 - 2.0 = 2.0V → 还是2.0V,没变!

这就是差分信号的魅力——共模干扰被抵消了。我在一个电机驱动项目里遇到过,电机启动瞬间,地线上能跳起好几伏的噪声。但CAN通信愣是没受影响,靠的就是这个差分特性。

核心要点:差分信号通过两根线的电压差传递信息,天然免疫共模干扰。这是CAN能在恶劣环境中稳定工作的根本原因。

2.2 CAN_H与CAN_L的电平细节

咱们再细看一下CAN_H和CAN_L的具体电平值。不同标准略有差异,但最常用的是ISO 11898-2标准,也就是高速CAN。

信号状态 CAN_H电压 CAN_L电压 差分电压
隐性(逻辑1) 2.5V 2.5V 0V
显性(逻辑0) 3.5V 1.5V 2.0V

注意看,隐性时两根线都是2.5V,差分电压为0。显性时CAN_H升高到3.5V,CAN_L降低到1.5V,差分电压2V。

这里有个关键点:显性位会覆盖隐性位。也就是说,如果总线上同时有节点发显性、有节点发隐性,最终总线呈现的是显性。这个特性是CAN总线仲裁机制的基础,后面讲数据链路层时会详细说。

个人经验:我建议你在调试时用示波器同时抓CAN_H和CAN_L,然后做数学运算看差分信号。这样能一眼看出信号质量好不好。如果差分电压低于1.2V,说明总线负载可能有问题,或者线缆太长衰减太严重。

2.3 总线拓扑结构

CAN总线的拓扑结构,说白了就是一条直线,所有节点都挂在这条线上。

为什么非得是直线?

因为信号在线上传播时,遇到阻抗不连续的地方就会反射。分支线、T型接头都会造成阻抗突变,导致信号反射,波形变差。我见过一个案例,有人为了布线方便,在总线上加了个T型分支,结果通信时好时坏。查了两天才找到原因——分支线太长,反射信号把正常波形都搞乱了。

正确的做法是:

  • 主干线用双绞线,尽量走直线
  • 每个节点用短支线(建议不超过30cm)连接到主干线
  • 支线越短越好,最好直接焊在主干线上
  • 总线两端各接一个120Ω终端电阻

节点数量方面,标准高速CAN最多支持30个节点。如果使用CAN FD或者加中继器,可以扩展到更多。但节点越多,总线负载越重,信号质量会下降。

避坑指南:我曾经在一个项目里,为了节省线束,把CAN总线走成了环形。结果通信完全乱套,数据包疯狂重传。后来才意识到,环形拓扑在CAN总线里是绝对禁止的——信号会来回反射,形成驻波,总线根本没法正常工作。

2.4 终端电阻的作用

终端电阻,就是接在总线两端的120Ω电阻。别小看这两个小东西,没有它们,CAN总线根本跑不起来。

终端电阻的作用有两个:

  1. 消除信号反射:信号传到总线末端时,如果遇到阻抗突变,就会反射回来。终端电阻的阻值等于传输线的特性阻抗(双绞线约120Ω),信号到达末端时被电阻吸收,不会反射。
  2. 提供隐性电平:当所有节点都处于隐性状态时,CAN_H和CAN_L都是2.5V。这个2.5V是怎么来的?就是通过终端电阻分压得到的。如果没有终端电阻,隐性电平会漂移,总线逻辑混乱。

为什么是120Ω?

因为CAN总线用的双绞线,特性阻抗大约是120Ω。终端电阻匹配这个值,反射最小。我见过有人用100Ω或者150Ω代替,短距离通信可能没问题,但长距离或者高速通信时,波形质量明显变差。

重要提醒:终端电阻必须接在总线的最两端,而不是任意位置。如果只接一个电阻,或者接在中间,反射问题依然存在。我习惯在画PCB时,把终端电阻放在连接器的旁边,这样最接近总线末端。

2.5 实际调试中的几个坑

最后,分享几个我在实际项目中踩过的坑,希望能帮大家少走弯路。

  • 终端电阻忘接:这是最常见的错误。总线两端各缺一个120Ω电阻,通信距离稍长就出错。我建议在设计阶段就把终端电阻画进原理图,不要等调试时再补。
  • CAN_H和CAN_L接反:接反了不会烧设备,但通信完全不通。因为差分信号反相了,接收端解析出来的数据全是错的。用万用表量一下CAN_H对地电压,显性时应该是3.5V左右,如果量出来是1.5V,那就是接反了。
  • 共模电压超限:CAN收发器允许的共模电压范围一般是-2V到+7V。如果地线没接好,或者有强干扰源,共模电压可能超出这个范围,导致收发器损坏。我建议在CAN_H和CAN_L上加共模扼流圈,能有效抑制共模干扰。
  • 线缆太长:高速CAN(1Mbps)的理论最大距离是40米。如果距离更长,必须降低波特率。比如125kbps时可以到500米。别指望1Mbps跑100米,信号衰减和反射会让你怀疑人生。

好了,这一讲的内容就到这里。物理层是CAN通信的基础,把这些搞明白了,后面数据链路层、应用层学起来就轻松多了。下一讲我们聊聊CAN的帧格式,看看数据到底是怎么打包发送的。

记住:差分信号是CAN的护身符,终端电阻是CAN的定海神针。这两样东西搞懂了,物理层你就掌握了八成。