2、物理层基础:差分信号原理、CAN_H与CAN_L电平定义、显性电平与隐性电平、总线终端电阻的作用
各位同学,咱们今天聊聊CAN总线的物理层。说白了,就是信号在线上到底怎么跑的。很多新手工程师觉得这部分枯燥,但我个人认为,物理层是理解整个CAN通信的基石。你想想看,如果连信号是“1”还是“0”都搞不清楚,后面那些复杂的协议分析根本无从下手。
2.1 为什么CAN要用差分信号?
汽车环境有多恶劣,做过实车测试的都知道。发动机点火、电机启停、各种电磁阀动作,产生的电磁干扰能把普通信号线变成天线。传统的单端信号(比如TTL电平),一根信号线对地传输,干扰一来,电平就跳变,数据就错了。
CAN总线聪明的地方在于,它用了差分信号。不是一根线对地,而是两根线——CAN_H和CAN_L——互为参考。发送端让这两根线的电压朝着相反方向变化,接收端只关心它们之间的电压差。
核心优势:
- 抗干扰强:外界干扰同时作用在两根线上,差值不变。这叫共模抑制。
- 信号清晰:差动信号摆幅小,但逻辑判别明确,不容易误判。
- 适合长距离:差分对天然抑制共模噪声,总线长度可达40米以上。
我记得有一次在台架上调试一个ECU,示波器一挂上去,CAN_H对地波形全是毛刺,但一看CAN_H和CAN_L的差分波形,干净得像教科书一样。那一刻你就知道,差分信号这东西,真不是玄学。
2.2 CAN_H与CAN_L的电平定义
CAN总线定义了两种逻辑状态:隐性(Recessive)和显性(Dominant)。这两种状态对应着不同的电压组合。
咱们先看一张经典的电压关系图,我把它画成了SVG,方便你理解。
从图上可以看得很清楚:
- 隐性状态:CAN_H和CAN_L都维持在2.5V左右,差分电压接近0V。这时候总线处于“放松”状态,任何节点都可以发起通信。
- 显性状态:CAN_H被拉高到3.5V,CAN_L被拉低到1.5V,差分电压约2V。这时候总线被某个节点“强占”,其他节点只能听。
一个小技巧:用示波器看CAN总线时,我习惯把通道1接CAN_H,通道2接CAN_L,然后做数学运算CH1-CH2。这样直接看到差分波形,逻辑分析起来特别直观。隐性时波形在0V附近,显性时跳到约2V,一眼就能看出数据帧的起始和结束。
2.3 显性电平与隐性电平的“争霸”规则
为什么叫“显性”和“隐性”?这名字起得很有深意。在CAN总线上,显性电平可以覆盖隐性电平。也就是说,如果两个节点同时发送,一个发显性(0),一个发隐性(1),总线最终呈现的是显性(0)。
这个特性是CAN总线仲裁机制的基础。你想想看,多个节点同时抢总线,谁发的数据帧优先级高(ID小,显性位多),谁就能赢。物理层上,就是靠显性电平“压倒”隐性电平来实现的。
注意:千万不要把CAN总线的逻辑电平跟普通数字电路搞混。CAN的隐性对应逻辑“1”,显性对应逻辑“0”。我第一次用CAN时,习惯性地以为高电平是1,结果调试了半天数据都对不上。后来才反应过来,CAN是反的!
2.4 总线终端电阻:为什么必须要有?
说到终端电阻,很多同学觉得不就是两个120欧姆的电阻嘛,焊上去就行了。但你真的理解它为什么是120欧姆吗?
CAN总线本质上是一对传输线。信号在线上跑,如果遇到阻抗不连续的地方,就会产生反射。反射回来的信号叠加在原信号上,轻则造成波形畸变,重则导致误码。
终端电阻的作用就是匹配传输线的特性阻抗,消除信号反射。
CAN总线的双绞线特性阻抗大约在120欧姆左右。所以我们在总线两端各接一个120欧姆电阻,这样从任意一端看进去,阻抗都是匹配的。
| 参数 | 标准值 | 说明 |
|---|---|---|
| 终端电阻阻值 | 120 Ω | 匹配双绞线特性阻抗 |
| 电阻位置 | 总线两端 | 最远端的两个节点 |
| 功率要求 | ≥ 0.25W | 常用1206或0805贴片 |
| 不接电阻的后果 | 信号反射、波形畸变 | 通信距离缩短、误码率升高 |
避坑指南:我曾经在一个项目中,为了省两个电阻,把终端电阻去掉了。结果在实验室里跑得好好的,一上车,总线长度超过5米,通信就开始丢帧。示波器一看,波形后沿有个明显的“台阶”,那就是反射波。后来老老实实把电阻加上,问题立刻消失。所以,终端电阻不是摆设,是必须品。
另外,有些CAN收发器内部集成了终端电阻,比如TJA1051的INH引脚模式。但大多数情况下,我们还是习惯在PCB上独立放置120欧姆电阻,方便调试和更换。
2.5 物理层参数速查表
最后,我把CAN物理层的关键参数整理成一个表格,方便你查阅。
| 参数 | 高速CAN (ISO 11898-2) | 低速CAN (ISO 11898-3) |
|---|---|---|
| 最大速率 | 1 Mbps | 125 kbps |
| 隐性电平 (CAN_H / CAN_L) | 2.5V / 2.5V | 1.75V / 3.5V (近似) |
| 显性电平 (CAN_H / CAN_L) | 3.5V / 1.5V | 3.5V / 1.5V (近似) |
| 差分电压 (显性) | 约 2V | 约 2V |
| 终端电阻 | 120 Ω (两端) | 通常不需要 |
| 总线最大长度 | 40 m @ 1 Mbps | 500 m @ 125 kbps |
嗯,物理层的基础知识就讲到这里。记住,差分信号是CAN的“骨架”,显性/隐性电平是它的“语言”,终端电阻是它的“护甲”。这三样东西搞明白了,后面学协议帧、仲裁、错误处理,就会顺畅很多。