第2章 CAN物理层:差分信号原理、CAN_H与CAN_L电平定义、总线拓扑结构、终端电阻的作用与匹配

各位同学,欢迎来到第二章。上一章我们聊了CAN协议的整体框架,今天咱们把镜头拉近,看看最底层的物理层。

物理层这东西,说白了就是信号怎么在线上跑。很多初学者觉得它枯燥,上来就啃协议栈。但我得说一句:物理层搞不明白,后面遇到总线故障,你连排查方向都没有。我在项目里见过太多人,软件写得飞起,结果一根线没接对,折腾了两天。

2.1 差分信号原理

CAN总线为什么抗干扰能力强?核心秘密就是差分信号。

你想想看,传统的单端信号,比如UART,一根线对地传数据。如果外界有个电磁干扰,信号线上电压一跳,接收端就懵了——这到底是数据变了还是干扰?

CAN不一样。它用两根线:CAN_H和CAN_L。信号不是对地测量的,而是看两根线之间的电压差。

核心公式:

Vdiff = V(CAN_H) - V(CAN_L)

接收器只认这个差值,不关心绝对电压。

为什么会这样?我举个例子。假设有个强电磁脉冲打过来,两根线上同时被叠加了+2V的噪声。单端信号就废了,但差分信号呢?CAN_H涨了2V,CAN_L也涨了2V,差值不变。接收器完全不受影响。

这就是共模抑制。我个人习惯把差分信号比作「跷跷板」——两根线一高一低,差值决定一切。外界干扰就像把整个跷跷板抬起来,但两端的相对高度没变。

实战经验:

我在测试一款车载控制器时,发现总线偶尔丢帧。示波器一挂,发现CAN_H和CAN_L的共模电压在漂移。查了半天,是某个节点的地线接触不良。记住:差分信号抗共模干扰,但前提是两根线的路径要尽量一致。布线时一定要走在一起,别分开。

2.2 CAN_H与CAN_L电平定义

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

咱们直接看电平值:

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

嗯,这里要注意:CAN的逻辑和常规思维是反的。显性(0)才是主动驱动的状态,隐性(1)反而是总线空闲状态。我刚入行时也搞混过,后来记住了——「显性就是有人说话,隐性就是没人吭声」。

具体怎么实现的?

  • 隐性状态:收发器的输出级处于高阻态,两根线都被偏置到2.5V。这时候总线是「放松」的,谁都可以发言。
  • 显性状态:收发器内部把CAN_H拉到3.5V,CAN_L拉到1.5V。差分电压约2V,强行覆盖隐性状态。

这就是CAN总线仲裁的物理基础——多个节点同时发送时,显性位会「压过」隐性位。谁先发0,谁就赢了。

避坑指南:

我曾经遇到过一个案例,某节点在隐性状态下CAN_H只有2.3V,CAN_L有2.7V。看起来差值不大,但总线就是间歇性通信失败。原因是收发器的偏置电阻老化,导致共模电压偏移。所以测量总线时,别只看差分电压,共模电压也得在范围内(通常1.5V~3.5V)。

2.3 总线拓扑结构

CAN总线最常见的拓扑就是线性总线,也叫干线-支线结构。

线性拓扑:

  • 一根主干线贯穿所有节点
  • 每个节点通过短支线(<30cm最佳)连接到主干
  • 主干两端各接一个120Ω终端电阻

为什么推荐线性?说白了,信号在线上传输时,遇到阻抗突变就会反射。线性结构阻抗最均匀,反射最小。我在项目中测试过,支线超过1米,总线速率降到125kbps以下才能稳定。

星型拓扑:

  • 所有节点汇聚到一个中心点
  • 中心点可以是集线器或特殊节点
  • 终端电阻需要仔细计算

星型拓扑在汽车里用得少,但在工业设备里偶尔见到。它的好处是布线方便,坏处是信号反射问题更复杂。每个分支的长度不同,反射回来的时间点也不同,容易造成信号畸变。

我的建议:

能用线性就别用星型。如果非要用星型,每个分支长度尽量相等,终端电阻放在分支末端而不是中心点。我见过一个项目,星型拓扑中心点只放了一个120Ω电阻,结果总线完全没法用——反射太严重了。

2.4 终端电阻的作用与匹配

终端电阻,就是总线两端那两个120Ω的电阻。很多人觉得它就是「标配」,装上就行。其实不然。

终端电阻三个核心作用:

  1. 消除信号反射:信号传到总线末端,如果阻抗不匹配,会反弹回来干扰原信号。120Ω匹配了双绞线的特性阻抗,让信号被吸收掉。
  2. 提供隐性电平偏置:收发器内部有偏置电路,但终端电阻配合总线电容,能稳定隐性状态下的共模电压。
  3. 保证差分电压幅值:显性状态下,收发器驱动电流流过两个终端电阻,产生足够的差分电压。

咱们算一笔账:标准CAN收发器(如TJA1050)在显性状态下输出约30mA电流。两个120Ω电阻并联是60Ω。30mA × 60Ω = 1.8V。嗯,差不多就是2V差分电压的来源。

匹配原则:

  • 标准CAN(ISO 11898-2):两个120Ω电阻,分别位于总线两端
  • 低速CAN(ISO 11898-3):每个节点一个电阻,总阻值约100~500Ω
  • CAN FD:同样两个120Ω,但要求电阻精度更高(±1%)

我曾经遇到一个故障:某ECU内部集成了120Ω终端电阻,但设计人员没注意,又在总线上外挂了一个。结果两个电阻并联成60Ω,显性电压掉到1V左右,总线完全无法通信。排查了整整一天,最后用万用表一量才发现。

重要提醒:

测量CAN总线电阻时,一定要断电!用万用表在CAN_H和CAN_L之间量。正常值应该是60Ω(两个120Ω并联)。如果量到120Ω,说明只有一个终端电阻;如果量到0Ω,说明短路了;如果量到无穷大,说明电阻开路或总线断了。

另外,有些节点内部有可切换的终端电阻,比如诊断接口。上电后电阻才接入,断电时量不到。别被这个坑了。

好了,物理层的内容就这些。下一章我们进入数据链路层,看看CAN帧是怎么组织的。到时候你会明白,物理层的这些设计,全是为了数据链路层的可靠传输服务的。

记住一句话:物理层稳了,上面才能稳。别嫌基础,动手测一测你的总线,比看十遍书都管用。