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Ω电阻,相当于用电阻匹配了传输线的特性阻抗。这样做的目的是:
- 消除信号反射:信号传到总线末端时,如果没有匹配电阻,会反射回来,造成波形畸变。我见过一个项目,没接终端电阻,总线长度才10米,波形上就有明显的过冲和振铃。
- 提供隐性电平偏置:终端电阻和收发器内部的电路配合,把总线偏置到2.5V的隐性电平。
- 确定差分负载:两个120Ω电阻并联,总线上看到的差分负载是60Ω。收发器就是按这个负载设计的。
关键参数:标准CAN总线终端电阻 = 120Ω ± 1%,功率建议用1/4W或更高。如果总线很短(比如小于1米),有时可以省略一个终端电阻,但我个人不建议这么做——省一个电阻的钱,可能换来一堆调试时间。
下面这张图展示了CAN总线物理层的完整结构,包括节点、双绞线、终端电阻和信号波形。
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总线通信的基础,尤其是差分信号和终端电阻,在实际调试中会反复遇到。记住:物理层稳了,上层协议才能跑得顺。