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总线隐性/显性电平定义 CAN总线隐性/显性电平定义 隐性状态 (Recessive) 逻辑 "1" CAN_H ≈ 2.5V CAN_L ≈ 2.5V 差分电压 ≈ 0V 总线处于空闲或弱驱动状态 显性状态 (Dominant) 逻辑 "0" CAN_H ≈ 3.5V CAN_L ≈ 1.5V 差分电压 ≈ 2V 总线被节点主动驱动

从图上可以看得很清楚:

  • 隐性状态: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的“骨架”,显性/隐性电平是它的“语言”,终端电阻是它的“护甲”。这三样东西搞明白了,后面学协议帧、仲裁、错误处理,就会顺畅很多。