第2章:CAN物理层——差分信号与电平定义

大家好,我是你们的实战派导师。今天咱们聊聊CAN总线的物理层。说实话,很多工程师一上来就扎进协议栈里,结果硬件上出了问题,排查半天才发现是物理层没搞对。我当年就吃过这个亏,所以这一章咱们把底子打扎实。

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

你想想看,汽车里发动机点火、空调压缩机启动,这些大电流设备一工作,整个车内的电磁环境简直是个噩梦。普通的单端信号(比如UART的TX/RX)在这种环境下,分分钟被干扰得面目全非。

CAN总线聪明就聪明在用了差分信号。说白了,就是一对线(CAN_H和CAN_L)同时传输,一个走高,另一个就走低。接收端看的是两根线的电压差,而不是对地的绝对电压。

核心公式:

差分电压 V_diff = V(CAN_H) - V(CAN_L)

当 V_diff > 0.9V 时,总线为显性(逻辑0)

当 V_diff ≈ 0V 时,总线为隐性(逻辑1)

我在项目里遇到过一件事:有个同事用示波器量CAN_H对地波形,发现毛刺很多,吓得不敢用了。我让他改测CAN_H和CAN_L的差分波形,结果干净得很。这就是差分信号的抗干扰能力——共模噪声会被抵消掉。

2.2 CAN_H与CAN_L的电平定义

咱们以最常用的ISO 11898-2高速CAN标准为例。总线空闲时,CAN_H和CAN_L都维持在2.5V左右,这叫隐性电平。当有节点发送数据时,CAN_H被拉高到3.5V,CAN_L被拉低到1.5V,这叫显性电平

总线状态 CAN_H电压 CAN_L电压 差分电压 逻辑值
隐性(空闲) 2.5V 2.5V ≈0V 1
显性(发送) 3.5V 1.5V ≈2V 0

这里有个关键点:显性电平会覆盖隐性电平。也就是说,只要有一个节点拉出显性电平,整条总线就是显性的。这就是CAN总线仲裁的基础——谁先发0,谁就赢。

我的小技巧:调试时用万用表测CAN_H和CAN_L对地电压。如果两个都是2.5V左右,说明总线空闲。如果一个3.5V一个1.5V,说明有节点在发数据。这比看示波器快多了。

2.3 显性电平与隐性电平的博弈

为什么会设计成显性覆盖隐性?我打个比方:就像一群人开会,谁嗓门大谁先说话。在CAN总线里,逻辑0(显性)就是那个嗓门大的。多个节点同时发送时,谁先发0,谁就抢到总线控制权。

嗯,这里要注意:隐性电平不是0V,而是差分电压接近0V。很多新手以为隐性就是没信号,其实不是。隐性状态下,总线仍然有2.5V的共模电压,只是两根线电压相等而已。

我曾经帮一个客户排查问题,他们发现总线偶尔通信失败。查了半天,原来是CAN收发器的隐性电平漂到了2.7V,导致接收端误判。所以啊,收发器的共模电压稳定性很重要。

2.4 终端电阻:120Ω的奥秘

说到终端电阻,很多人的第一反应就是「CAN总线两端各接一个120Ω电阻」。但你知道为什么是120Ω吗?

这要从传输线理论说起。CAN总线的双绞线特性阻抗大约是120Ω。为了消除信号反射,终端电阻必须匹配这个阻抗。如果不匹配,信号会在总线末端反弹,造成波形畸变。

终端电阻的作用:

  • 消除信号反射:匹配特性阻抗,防止波形振铃
  • 提供偏置电压:隐性状态下,两个120Ω电阻分压,将总线偏置到2.5V
  • 确定总线差分阻抗:两个120Ω并联,总阻抗60Ω

我见过最典型的错误,就是有人只在总线一端接了120Ω电阻。结果总线长度超过10米后,通信就时好时坏。示波器一看,波形末端有个明显的过冲。加上第二个120Ω电阻后,波形立刻干净了。

2.5 终端电阻的选型实战

选型时,我建议你关注以下几点:

  1. 功率:常规120Ω电阻用1/4W就够了。但如果总线有短路风险,建议用1/2W的。
  2. 精度:1%精度足够,5%的也能用,但匹配效果差一些。
  3. 封装:0805或1206都行,但要注意散热。我习惯用1206,焊接方便,功率余量大。
  4. 是否可拆卸:开发阶段建议用可插拔的终端电阻模块,方便调试。

警告:千万不要在总线中间节点上接终端电阻!我曾经见过一个项目,每个节点都焊了120Ω电阻,结果总线阻抗变成了20Ω,收发器直接过载保护。记住:终端电阻只在总线最远的两端各接一个

2.6 实际电路中的注意事项

最后,分享几个我在量产项目中踩过的坑:

  • 共模扼流圈:在CAN_H和CAN_L上串一个共模扼流圈,能有效抑制共模干扰。我一般选100μH的。
  • ESD保护:CAN总线是外露的,必须加TVS管。推荐PESD1CAN或类似型号。
  • 分叉线长度:从总线到节点的分支线(stub)越短越好,最好不超过30cm。长了会引起反射。
  • 线缆类型:用双绞线,绞距越密越好。我习惯用AWG22或AWG24的屏蔽双绞线。

好了,这一章的内容就到这里。物理层是CAN总线的地基,地基不稳,上层协议再花哨也没用。下一章咱们聊聊CAN的数据链路层,看看报文是怎么在总线上跑的。

课后小作业:拿万用表量一下你手头CAN设备的CAN_H和CAN_L对地电压。如果总线空闲时不是2.5V左右,说明你的终端电阻或者收发器可能有问题。试试看?