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

大家好,我是你们的讲师。今天咱们来聊聊CAN总线的物理层。很多初学者觉得物理层就是些电压、电阻,没什么好学的。但我跟你说,恰恰是这些“基础”的东西,决定了你的系统能不能稳定工作。我在现场调试时,至少有一半的通信问题,最后都追到了物理层上。

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

先问大家一个问题:汽车发动机舱里,电磁干扰有多严重?火花塞点火、发电机、各种电机……那环境简直是噪声的海洋。如果像UART那样用单根线传数据,信号早就被淹没了。

CAN总线聪明的地方在于,它用两根线来传一路信号——CAN_H和CAN_L。这两根线绞在一起,传输的信号互为镜像。外界干扰来了,两根线上会感应出几乎相同的噪声。接收器只看两根线的电压差,噪声就被抵消掉了。这就是差分信号的核心思想。

核心公式:CAN总线接收器检测的是差分电压 Vdiff = VCAN_H - VCAN_L,而不是单根线对地的绝对电压。

说白了,就是“共模抑制”。我当年做的一个项目,线束从电机旁边走,单端信号根本没法看,换成CAN之后,波形干净得像教科书一样。你想想看,这有多重要。

2.2 CAN_H与CAN_L的电平定义

CAN总线定义了两种逻辑状态:隐性(Recessive)和显性(Dominant)。这两种状态对应着不同的电压组合。

状态 逻辑值 CAN_H电压 CAN_L电压 差分电压 Vdiff
隐性 逻辑1 2.5V 2.5V ≈ 0V
显性 逻辑0 3.5V 1.5V ≈ 2V

注意看,隐性时两根线都是2.5V,差分电压接近0。显性时CAN_H被拉高到3.5V,CAN_L被拉低到1.5V,差分电压大约2V。接收器就是靠这个差分电压来判断总线状态的。

个人经验:测量CAN总线波形时,我习惯用差分探头直接看CAN_H和CAN_L的差值。如果只用单端探头看其中一根线,波形会受地线干扰,容易误判。示波器设置成“A-B”模式,直接看差分波形,一目了然。

2.3 显性电平与隐性电平的“争霸”机制

这里有个很有意思的机制:显性电平会覆盖隐性电平。为什么?

你看,隐性状态是靠总线上的电阻“拉”到2.5V的,驱动能力很弱。而显性状态是收发器主动输出电流,驱动能力强。所以,只要有一个节点发送显性位,总线就会变成显性。多个节点同时发送显性位,总线还是显性。

这个特性是CAN总线仲裁的基础。我举个例子:

  • 节点A发送隐性位(1),节点B发送显性位(0)
  • 总线最终呈现显性(0)
  • 节点A发现自己发的1和总线上的0不一致,就知道自己仲裁输了,立刻停止发送

这就是“线与”逻辑。嗯,这里要注意:仲裁过程中,发送显性位的节点会继续发送,发送隐性位的节点会退出。整个过程不会破坏数据,也不会浪费带宽。

避坑指南:我曾经遇到过一个故障,总线一直处于显性状态,所有节点都无法通信。查了半天,发现是一个节点的收发器坏了,输出一直拉着CAN_H。这就是“总线锁死”。排查时,可以逐个断开节点,看总线能否恢复隐性。

2.4 总线终端电阻的作用

终端电阻是CAN总线物理层最容易忽略,但又最关键的部分。标准CAN总线要求在总线两端各接一个120Ω的电阻。

为什么是120Ω?

因为CAN总线的双绞线特性阻抗大约是120Ω。在总线两端并联120Ω电阻,相当于用电阻匹配了传输线的特性阻抗。这样做的目的是:

  1. 消除信号反射:信号传到总线末端时,如果没有匹配电阻,会反射回来,造成波形畸变。我见过一个项目,没接终端电阻,总线长度才10米,波形上就有明显的过冲和振铃。
  2. 提供隐性电平偏置:终端电阻和收发器内部的电路配合,把总线偏置到2.5V的隐性电平。
  3. 确定差分负载:两个120Ω电阻并联,总线上看到的差分负载是60Ω。收发器就是按这个负载设计的。

关键参数:标准CAN总线终端电阻 = 120Ω ± 1%,功率建议用1/4W或更高。如果总线很短(比如小于1米),有时可以省略一个终端电阻,但我个人不建议这么做——省一个电阻的钱,可能换来一堆调试时间。

下面这张图展示了CAN总线物理层的完整结构,包括节点、双绞线、终端电阻和信号波形。

CAN总线物理层结构示意图 120Ω 120Ω CAN_H (3.5V / 2.5V) CAN_L (1.5V / 2.5V) 节点 1 节点 2 节点 3 差分信号波形 (Vdiff = VCAN_H - VCAN_L) 隐性位 (逻辑1): Vdiff ≈ 0V   |   显性位 (逻辑0): Vdiff ≈ 2V 双绞线

2.5 终端电阻的配置与注意事项

实际项目中,终端电阻的配置有几个要点:

  • 位置:必须放在总线的物理两端,而不是中间。放在中间只能匹配一段,另一端还是会有反射。
  • 数量:标准CAN总线只需要两个终端电阻。有些节点内部已经集成了120Ω电阻(比如某些CAN分析仪),这时候外部就不用再加了。
  • 测量:在总线断电的情况下,用万用表测量CAN_H和CAN_L之间的电阻。如果总线正常,应该测到约60Ω(两个120Ω并联)。如果测到120Ω,说明少了一个终端电阻;如果测到0Ω,说明短路了。

避坑指南:我曾经在一个项目中,发现总线通信时好时坏。用示波器一看,波形上升沿有严重的过冲。检查发现,终端电阻被放在了总线中间,而不是两端。把电阻移到两端后,波形立刻变好了。记住:终端电阻的位置和阻值一样重要。

2.6 物理层参数速查表

最后,给大家整理一个物理层关键参数的速查表,方便你调试时参考:

参数 标准值 说明
总线空闲电压 2.5V 隐性电平,CAN_H和CAN_L相等
显性差分电压 1.5V ~ 3.0V 典型值2V,接收器阈值约0.7V
终端电阻 120Ω ± 1% 两端各一个,并联后60Ω
最大总线长度 40m @ 1Mbps 速率越低,长度可以越长
节点数 最多110个 受收发器驱动能力限制
双绞线特性阻抗 120Ω 与终端电阻匹配

好了,物理层的内容就讲到这里。这些概念是理解CAN总线通信的基础,尤其是差分信号和终端电阻,在实际调试中会反复遇到。记住:物理层稳了,上层协议才能跑得顺。