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总线物理层最容易忽略、也最容易出问题的地方。
它的作用有两个:
- 阻抗匹配:防止信号在总线末端反射,造成波形畸变
- 提供隐性电平:终端电阻把CAN_H和CAN_L拉到2.5V共模电平
标准CAN总线要求两端各接一个120Ω电阻。为什么是120Ω?因为CAN双绞线的特征阻抗大约是120Ω。阻抗匹配了,信号反射就最小。
我画个图帮你理解终端电阻的位置:
你看,只有总线最远的两端各接一个120Ω电阻。中间节点不接。如果接多了,总线等效电阻变小,隐性电平就拉不到2.5V,通信会出问题。
终端电阻速查表:
| 场景 | 电阻值 | 说明 |
|---|---|---|
| 标准CAN(≤1Mbps) | 两端各120Ω | 双绞线特征阻抗120Ω |
| 低速CAN(≤125kbps) | 两端各2.2kΩ | 允许更多节点,但抗干扰差 |
| 单节点调试 | 一端120Ω | 另一端开路也能工作,但不推荐 |
| 多节点星型拓扑 | 需计算等效电阻 | 尽量用直线拓扑,避免星型 |
我记得有一次在现场排查故障,总线距离不到1米,有人偷懒没接终端电阻。结果示波器一看,波形上升沿有严重的过冲和振铃,通信误码率高达10%。接上120Ω电阻后,波形干净得像教科书一样。所以,别省那两个电阻。
2.5 物理层常见问题排查清单
最后,我整理一份物理层排查清单。你在现场遇到CAN通信问题时,按这个顺序查,能省不少时间。
- 测终端电阻:断电,用万用表测CAN_H和CAN_L之间。正常值约60Ω(两个120Ω并联)。如果测到120Ω,说明只有一端接了电阻;如果测到0Ω,说明短路了。
- 测共模电压:上电但不通信,测CAN_H对GND和CAN_L对GND,都应该是2.5V左右。如果偏差超过0.3V,检查终端电阻和收发器供电。
- 测差分电压:通信时用示波器看差分波形。显性位差分电压应在1.5V~3.0V之间,隐性位接近0V。
- 看波形质量:检查上升沿和下降沿是否有过冲、振铃、台阶。有的话,检查拓扑结构和终端电阻。
- 检查节点数量:标准CAN最多支持110个节点(取决于收发器驱动能力)。节点太多会拉低显性电平。
小技巧: 我习惯在调试板上预留一个120Ω电阻的焊盘,用跳线帽控制是否接入。这样在单节点调试时接上,多节点组网时断开,灵活得很。
好了,物理层的内容就这些。差分信号、CAN_H/CAN_L电平、显性/隐性、终端电阻,这四个概念是CAN物理层的核心。你把这些搞清楚了,后面学帧结构、仲裁、错误处理,心里就有底了。