3. CAN总线物理层:差分信号原理、CAN_H与CAN_L电平、终端电阻作用、总线拓扑与节点

大家好,我是你们的老朋友。今天咱们来聊聊CAN总线物理层。说实话,很多刚入行的工程师觉得物理层就是些电压、电阻,没啥好学的。但我告诉你,恰恰是这些“基础”的东西,最容易在实车上出问题。我见过太多因为终端电阻没焊好、或者线束接反导致整车网络瘫痪的案例了。所以,这一章咱们把它彻底搞明白。

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

CAN总线用两根线——CAN_H和CAN_L,而不是像普通串口那样一根信号线加一根地线。为什么?说白了,就是为了抗干扰。

你想想看,汽车发动机舱里电磁环境多恶劣。点火线圈、电机、继电器,哪个不是干扰源?如果只用单端信号,地线上的噪声很容易把信号淹没。但差分信号就不一样了。

差分信号的原理很简单:

  • 发送端:把逻辑电平转换成CAN_H和CAN_L上的电压差。
  • 接收端:只关心两根线之间的电压差,而不是对地的绝对电压。

举个例子。假设CAN_H是3.5V,CAN_L是1.5V,差值是2V。这时候如果有个强电磁脉冲打过来,两根线上同时被干扰,都升高了1V。那CAN_H变成4.5V,CAN_L变成2.5V,差值还是2V。你看,干扰被抵消了。这就是差分信号最牛的地方——共模抑制

核心公式:总线电平 = CAN_H - CAN_L

显性电平(逻辑0):CAN_H ≈ 3.5V,CAN_L ≈ 1.5V,差值 ≈ 2V

隐性电平(逻辑1):CAN_H ≈ 2.5V,CAN_L ≈ 2.5V,差值 ≈ 0V

我在项目中遇到过一件事。一台试验车,CAN通信时好时坏。查了半天,发现是CAN_H和CAN_L在接插件处被拧在一起了,线束工图省事没按双绞线要求做。结果两根线受到的干扰不一样,差分信号的优势全没了。嗯,从那以后我每次验收线束,都会专门检查双绞情况。

3.2 CAN_H与CAN_L电平:显性与隐性

CAN总线有两种状态:显性(Dominant)隐性(Recessive)

  • 隐性电平:CAN_H和CAN_L都是2.5V,差值为0。这时候总线处于空闲状态,或者表示逻辑“1”。
  • 显性电平:CAN_H被拉高到3.5V,CAN_L被拉低到1.5V,差值为2V。这时候表示逻辑“0”。

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

状态 CAN_H电压 CAN_L电压 差分电压 逻辑值
隐性 2.5V 2.5V 0V 1
显性 3.5V 1.5V 2V 0

小技巧:用示波器看CAN总线时,我习惯把CH1接CAN_H,CH2接CAN_L,然后用数学通道做CH1-CH2。这样一眼就能看出差分信号的质量。如果差分信号的上升沿不够陡,或者幅值不够2V,那就要检查收发器或者线束了。

3.3 终端电阻作用:为什么是120Ω?

终端电阻,说白了就是防止信号反射的。CAN总线是高速通信,信号在线上传输时,如果遇到阻抗不连续的地方,就会产生反射。反射信号叠加在原信号上,轻则导致误码,重则让整个网络瘫痪。

为什么是120Ω?因为CAN总线用的双绞线,特性阻抗大约是120Ω。在总线两端各接一个120Ω电阻,并联起来就是60Ω。这样做的目的是让信号走到总线末端时,能量被电阻吸收掉,不会反弹回来。

我个人的习惯是:

  • 每个CAN网络必须且只能有两个终端电阻,分别放在总线的最远端。
  • 如果网络是星型拓扑(虽然不推荐),终端电阻要放在最远的两个分支末端。
  • 千万不要在中间节点加电阻,否则总线阻抗会变低,驱动能力下降。

避坑指南:我曾经遇到过一个案例,某供应商的ECU内部集成了120Ω终端电阻,而且没有跳线或软件配置。结果这个ECU被装在了总线中间位置,相当于总线上有三个120Ω电阻并联,总阻抗只有40Ω。CAN收发器驱动不动,通信距离缩短了一半。从那以后,我要求所有ECU的终端电阻必须通过外部跳线或软件使能。

3.4 总线拓扑与节点

CAN总线推荐的是直线型拓扑,也叫总线型。就是一根主干线,所有节点都挂在这根线上,每个节点用尽量短的支线连接。

为什么是直线型?因为信号在直线型拓扑中传播最均匀,反射最小。星型拓扑虽然布线方便,但信号会在星型中心点产生复杂的反射,很难控制。

节点数量方面,标准CAN(ISO 11898-2)规定最多支持30个节点。但实际上,我建议控制在16个以内。为什么?因为节点越多,总线负载电容越大,信号边沿会变缓,通信速率就上不去。

参数 推荐值 极限值
节点数量 ≤16 30
支线长度 ≤0.3m 1m(低速时)
总线长度(500kbps) ≤40m 100m

经验之谈:设计CAN网络时,我习惯先画一个拓扑图,标出每个节点的物理位置和支线长度。然后估算总线的总长度和节点电容。如果总电容超过收发器的驱动能力,就要考虑加CAN中继器或者降低波特率。

好了,这一章的内容就到这里。物理层是CAN总线的基石,看似简单,但每个细节都值得深究。下一章咱们会进入数据链路层,看看CAN帧是怎么组织的。到时候我会分享一些抓包分析的经验,敬请期待。