一、CAN总线物理层基础:差分信号原理、CAN_H与CAN_L电平定义、显性与隐性电平、终端电阻的作用与匹配

各位工程师朋友,咱们开始第一课。CAN总线这东西,搞过汽车电子的都不陌生。但说实话,很多人调了一辈子CAN,遇到干扰还是抓瞎。我个人习惯,不管多复杂的问题,先回到物理层把基础夯扎实。今天咱们就从最底层的差分信号讲起。

1.1 差分信号原理——为什么CAN要用两根线?

你想想看,汽车里电磁环境多恶劣?发动机点火、电机启停、各种继电器噼里啪啦。单端信号在这种环境里,就像在菜市场里说悄悄话——根本听不清。

CAN总线用了两根线:CAN_H和CAN_L。它们传输的不是各自独立的信号,而是一对互补的信号。什么意思呢?

  • CAN_H上的电压上升时,CAN_L上的电压就下降
  • 接收端只看两根线的电压差:V_diff = CAN_H - CAN_L

这样做的好处太明显了。外界干扰通常是共模的——同时加到两根线上。比如一个电磁脉冲打过来,CAN_H涨了2V,CAN_L也涨了2V,但它们的差值基本不变。这就是差分信号的抗干扰本质。

核心要点:差分传输只关心两根线之间的电压差,不关心它们对地的绝对电压。共模干扰被自然抵消。

我在项目中遇到过一件事。有个同事死活调不通CAN通信,示波器一看,CAN_H和CAN_L波形都挺漂亮,但就是收不到数据。我让他把探头改成差分模式,结果发现两根线对地都有5V的共模噪声,但差分信号完全正常。最后查出来是收发器参考地虚焊了。嗯,这就是典型的只看单端波形被坑的案例。

2.2 CAN_H与CAN_L电平定义——显性与隐性

CAN总线定义了两种逻辑状态:显性(Dominant)隐性(Recessive)

说白了,这就是总线上的“0”和“1”。但跟普通逻辑不一样,CAN的显性电平会“覆盖”隐性电平。谁抢到总线,谁说了算。

状态 CAN_H电压 CAN_L电压 差分电压 逻辑含义
隐性 2.5V 2.5V 0V 逻辑1(总线空闲)
显性 3.5V 1.5V 2V 逻辑0(数据有效)

注意看,隐性时两根线都是2.5V,差分电压为0。显性时CAN_H拉到3.5V,CAN_L拉到1.5V,差分电压约2V。这个2V的压差,就是接收器判断“有数据来了”的依据。

调试小技巧:用示波器测CAN总线时,一定要用差分探头,或者用两个通道做数学减法(CH1-CH2)。直接测单端波形,你看到的全是共模噪声,根本看不出信号质量。

我曾经调试过一个项目,总线在怠速时通信正常,一踩油门就丢帧。用差分探头一看,隐性电平从2.5V漂到了3.0V,显性电平的压差也从2V缩到了1.2V。为什么?因为电源纹波太大,收发器的参考电压被干扰了。你想想看,接收器的阈值是固定的,电平一漂,误判就来了。

3.3 终端电阻的作用与匹配——为什么必须是120Ω?

终端电阻,这是CAN总线里最容易被人忽视,但又最关键的东西。

它的作用有两个:

  1. 阻抗匹配——防止信号反射
  2. 提供差分负载——让收发器能正常驱动总线

为什么是120Ω?因为CAN总线用的双绞线,其特征阻抗典型值就是120Ω。在总线两端各接一个120Ω电阻,并联后就是60Ω。这个60Ω就是收发器看到的负载阻抗。

⚠️ 常见错误:

  • 只在一端接120Ω——反射没消除干净,信号质量差
  • 两端都接但阻值不对——比如用了100Ω或150Ω,阻抗不匹配
  • 接了多个终端电阻——比如每个节点都接了,总负载低于60Ω,驱动能力下降

我记得有一次,客户反映一条1米长的CAN线,通信时好时坏。我让他们测终端电阻,结果发现两端都没接!收发器直接驱动一根开路线,信号在末端全反射回来,波形乱成一团。接上两个120Ω后,问题立刻消失。

怎么判断终端电阻是否匹配?很简单:

  • 总线断电,用万用表测CAN_H和CAN_L之间的电阻
  • 如果测到约60Ω——两端都接了,正确
  • 如果测到约120Ω——只接了一端,有问题
  • 如果测到远大于120Ω——可能没接,或者接触不良

实战经验:我建议在PCB设计时,把终端电阻做成可选的(用0Ω电阻或跳线)。这样调试时可以根据实际节点数灵活配置。特别是开发阶段,节点数量经常变,焊死的电阻改起来太麻烦。

还有一个细节:终端电阻的功率。普通CAN总线用1/4W的贴片电阻就够了。但如果总线有短路故障,电阻上可能流过较大电流。我见过有人用0603封装的120Ω电阻,结果总线对电源短路时,电阻直接烧成开路。嗯,这里要注意,至少用0805封装,或者用两个240Ω并联,既提高功率又保持等效120Ω。

好了,第一课就到这里。物理层是CAN总线的地基,差分信号、电平定义、终端电阻,这三样东西搞不明白,后面排查干扰就是瞎忙活。下一课咱们讲CAN收发器的选型与电气特性,到时候我会分享一些选型踩坑的经历。