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

好,咱们今天聊聊CAN总线的物理层。说实话,很多工程师做CAN开发,上来就写代码、调报文,对物理层反而一知半解。我个人觉得,这其实是个大坑。物理层搞不明白,你连示波器上的波形都看不懂,出了问题更是抓瞎。

咱们从最基础的说起。CAN总线为什么能在工业、汽车领域这么抗造?核心秘密就是——差分信号

2.1 差分信号原理:为什么它这么抗干扰?

你想想看,传统的单端信号,比如UART,一根线对地传数据。干扰来了,电平一抖,数据就错了。CAN不一样,它用两根线:CAN_H和CAN_L。

信号不是对地测量的,而是看两根线之间的电压差。干扰通常是共模的,同时作用在两根线上。两根线一起被干扰,差值基本不变。这就是差分信号的抗干扰逻辑。

核心公式:

总线电压 = V(CAN_H) - V(CAN_L)

干扰来了,V(CAN_H)和V(CAN_L)同时升高或降低,差值不变。

我在项目中遇到过一件事。一个客户的车载设备,在电机启动瞬间总是丢帧。查了半天,发现是地线回路引入了共模噪声。换成差分传输后,问题直接消失。说白了,差分信号就是给信号上了双保险。

2.2 CAN_H与CAN_L电平:到底是多少伏?

很多人记不住CAN总线的具体电平值。我教你一个笨办法,记住两个状态就行:显性隐性

咱们先看一张电平表,这是ISO 11898-2标准定义的:

总线状态 CAN_H电压 CAN_L电压 差分电压
隐性(Recessive) 2.5V 2.5V 0V
显性(Dominant) 3.5V 1.5V 2V

你看,隐性状态时,两根线都是2.5V,差值为0。显性状态时,CAN_H拉到3.5V,CAN_L拉到1.5V,差值2V。

嗯,这里要注意:实际应用中,这个电压会有波动。比如线长了、节点多了,电压会有点偏差。但只要差分电压大于0.9V,接收器就认为是显性;小于0.5V,就认为是隐性。中间那一段,叫不确定区,设计时要避开。

2.3 显性电平与隐性电平:谁说了算?

这个问题很有意思。为什么叫“显性”和“隐性”?

我打个比方。总线就像一条马路。隐性状态是“没人说话”,所有节点都在听。显性状态是“有人发言”,谁先拉低总线,谁就抢到了话语权。

关键点来了:显性电平会覆盖隐性电平

如果一个节点发隐性(差分0V),另一个节点发显性(差分2V),总线最终呈现的是显性。这就是CAN总线仲裁的物理基础——线与逻辑。

我的经验:

调试时,用示波器同时抓CAN_H和CAN_L,看差分波形。如果显性电平的差分电压低于1.5V,就要检查总线负载了。我曾经遇到过12个节点挂一条总线,显性电平被拉低到1.2V,通信时好时坏。后来加了中继器才解决。

2.4 总线终端电阻:为什么必须是120Ω?

这个问题,面试时经常被问到。终端电阻的作用有两个:

  1. 消除信号反射:高速信号在总线末端会反射,造成波形畸变。
  2. 提供回差电流:显性状态时,CAN_H和CAN_L之间需要电流回路。

为什么是120Ω?因为CAN总线的特性阻抗大约是120Ω。终端电阻匹配特性阻抗,反射最小。

实际应用中,终端电阻放在总线的最两端。每个终端电阻120Ω,两个并联后是60Ω。这就是为什么你用万用表量CAN_H和CAN_L之间的电阻,正常应该是60Ω左右。

避坑指南:

我曾经犯过一个低级错误。一个项目有3个节点,我在每个节点上都焊了120Ω电阻。结果总线电阻变成了40Ω(三个120Ω并联)。显性电流太大,CAN收发器发烫。后来改成只在两端节点放电阻,中间节点去掉,问题解决。

记住:终端电阻只能放在总线两端,中间节点不要加

2.5 实战小贴士:用示波器看波形

说了这么多理论,咱们来点实际的。怎么用示波器判断CAN物理层是否正常?

  • 看隐性电平:CAN_H和CAN_L都应该是2.5V左右。如果偏差超过0.3V,检查共模电压。
  • 看显性电平:CAN_H应该到3.5V,CAN_L到1.5V。如果幅值不够,可能是节点太多或终端电阻不对。
  • 看波形边沿:上升沿和下降沿应该陡峭,没有回勾。如果有回勾,说明阻抗不匹配。
  • 看差分电压:显性时差分电压应该在1.5V~3.0V之间。低于1.2V,通信可能不稳定。

我个人习惯,每次调试新板子,第一件事就是拿示波器看CAN波形。波形对了,后面写代码才放心。波形不对,先查硬件,别急着调软件。

好了,这一章就到这里。物理层是CAN总线的地基,地基不稳,上层建筑再漂亮也没用。下一章咱们聊聊CAN的数据链路层,看看报文是怎么组织的。