2. CAN物理层:差分信号原理、CAN_H与CAN_L电平、显性电平与隐性电平、总线终端电阻

各位同学,咱们今天聊聊CAN的物理层。很多人学CAN,上来就啃帧结构、ID仲裁,结果遇到总线通信不稳定,查了半天才发现是物理层出了问题。我做了十几年嵌入式,这类坑踩过不少。物理层看着基础,但它是整个系统稳定的基石。

说白了,CAN物理层就干一件事:可靠地把0和1送到总线上。它用的不是咱们常见的单端信号(比如UART的TX/RX对地),而是一对差分线——CAN_H和CAN_L。

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

你想想看,汽车里发动机点火、电机运转、空调压缩机启停,电磁环境多恶劣。单端信号在这种环境下,地电位一抖,电平就飘了。差分信号就不一样——它看的是两根线之间的电压差,而不是对地电压。

我举个例子。假设CAN_H是3.5V,CAN_L是1.5V,差值是2V。哪怕地电位被干扰抬高了1V,CAN_H变成4.5V,CAN_L变成2.5V,差值还是2V。这就是差分信号的抗干扰能力。

核心优势:

  • 共模抑制:外部干扰同时作用在两根线上,差值不变
  • 抗地电位偏移:不依赖绝对地电平
  • 低辐射:两根线电流方向相反,磁场相互抵消

我在一个农机项目里遇到过,CAN总线走线长达30米,经过电机驱动器旁边。单端信号根本没法看,换成差分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(逻辑低)

注意看,隐性状态时两根线都是2.5V,差分电压接近0。显性状态时CAN_H被拉高到3.5V,CAN_L被拉低到1.5V,差分电压约2V。

这里有个关键点:显性电平会覆盖隐性电平。也就是说,只要有一个节点发送显性位,总线就是显性。这就是CAN总线仲裁的物理基础——谁先发0,谁就赢了。

个人经验: 我建议你在调试时用示波器同时抓CAN_H和CAN_L,然后做数学通道算差值。只看单根线很容易被共模噪声误导。差分信号,就得看差值。

2.3 显性电平与隐性电平的驱动机制

为什么会形成这两种电平?这得从CAN收发器的内部结构说起。

收发器里有两个关键部分:

  • 隐性状态:收发器输出级的高边和低边都关断,总线通过终端电阻自然拉到2.5V(共模电平)
  • 显性状态:高边MOS管导通,把CAN_H拉到VCC(通常5V或3.3V)附近;低边MOS管导通,把CAN_L拉到GND附近

实际电平值取决于收发器型号和供电电压。ISO 11898-2标准规定:

  • 隐性:CAN_H = 2.5V ± 0.1V,CAN_L = 2.5V ± 0.1V
  • 显性:CAN_H ≥ 3.5V,CAN_L ≤ 1.5V

我曾经在一个项目中用了5V供电的TJA1050,结果误接了3.3V的SN65HVD230。显性电平不够,总线一直处于隐性状态,通信完全不通。查了两天才发现是收发器电压不匹配。所以,选型时一定要看数据手册的显性电平输出范围。

避坑指南: 不同供电电压的收发器不能混用。5V收发器的显性电平约3.5V/1.5V,3.3V收发器的显性电平约2.9V/1.4V。混用时,3.3V节点可能无法正确识别5V节点发送的显性位。

2.4 总线终端电阻

终端电阻是CAN总线物理层最容易忽略、也最容易出问题的地方。

它的作用有两个:

  1. 阻抗匹配:防止信号在总线末端反射,造成波形畸变
  2. 提供隐性电平:终端电阻把CAN_H和CAN_L拉到2.5V共模电平

标准CAN总线要求两端各接一个120Ω电阻。为什么是120Ω?因为CAN双绞线的特征阻抗大约是120Ω。阻抗匹配了,信号反射就最小。

我画个图帮你理解终端电阻的位置:

CAN总线终端电阻连接示意图 CAN_H CAN_L 120Ω 120Ω 节点 1 节点 2 终端电阻必须位于总线物理两端,中间节点不接

你看,只有总线最远的两端各接一个120Ω电阻。中间节点不接。如果接多了,总线等效电阻变小,隐性电平就拉不到2.5V,通信会出问题。

终端电阻速查表:

场景 电阻值 说明
标准CAN(≤1Mbps) 两端各120Ω 双绞线特征阻抗120Ω
低速CAN(≤125kbps) 两端各2.2kΩ 允许更多节点,但抗干扰差
单节点调试 一端120Ω 另一端开路也能工作,但不推荐
多节点星型拓扑 需计算等效电阻 尽量用直线拓扑,避免星型

我记得有一次在现场排查故障,总线距离不到1米,有人偷懒没接终端电阻。结果示波器一看,波形上升沿有严重的过冲和振铃,通信误码率高达10%。接上120Ω电阻后,波形干净得像教科书一样。所以,别省那两个电阻。

2.5 物理层常见问题排查清单

最后,我整理一份物理层排查清单。你在现场遇到CAN通信问题时,按这个顺序查,能省不少时间。

  1. 测终端电阻:断电,用万用表测CAN_H和CAN_L之间。正常值约60Ω(两个120Ω并联)。如果测到120Ω,说明只有一端接了电阻;如果测到0Ω,说明短路了。
  2. 测共模电压:上电但不通信,测CAN_H对GND和CAN_L对GND,都应该是2.5V左右。如果偏差超过0.3V,检查终端电阻和收发器供电。
  3. 测差分电压:通信时用示波器看差分波形。显性位差分电压应在1.5V~3.0V之间,隐性位接近0V。
  4. 看波形质量:检查上升沿和下降沿是否有过冲、振铃、台阶。有的话,检查拓扑结构和终端电阻。
  5. 检查节点数量:标准CAN最多支持110个节点(取决于收发器驱动能力)。节点太多会拉低显性电平。

小技巧: 我习惯在调试板上预留一个120Ω电阻的焊盘,用跳线帽控制是否接入。这样在单节点调试时接上,多节点组网时断开,灵活得很。

好了,物理层的内容就这些。差分信号、CAN_H/CAN_L电平、显性/隐性、终端电阻,这四个概念是CAN物理层的核心。你把这些搞清楚了,后面学帧结构、仲裁、错误处理,心里就有底了。