2. CAN总线物理层:差分信号原理、CAN_H与CAN_L电平逻辑、总线拓扑结构、终端电阻的作用与计算

大家好,欢迎来到第二章。上一章我们聊了CAN总线能干什么,这一章咱们得把它的“身体”搞清楚——物理层。

说白了,物理层就是信号怎么在线上跑。我见过不少工程师,软件协议栈写得飞起,结果一接上示波器,波形惨不忍睹。为什么?物理层没搞透。咱们今天就把这事掰扯清楚。

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

你可能会问:RS232一根线传数据,CAN非得用两根,是不是浪费?

嗯,这里有个关键问题:抗干扰。

工业现场什么最多?电机、变频器、继电器。这些东西一动作,电磁干扰满天飞。单端信号(比如TTL电平)在这种环境里,信号很容易被“污染”。

差分信号就不一样了。它用两根线传同一路信号,但相位相反。接收端只看两根线的电压差,不看它们对地的绝对值。

举个例子:

  • CAN_H = 3.5V,CAN_L = 1.5V,差分电压 = 2.0V → 逻辑“显性”
  • CAN_H = 2.5V,CAN_L = 2.5V,差分电压 = 0V → 逻辑“隐性”

如果外界来个共模干扰,两根线同时被抬高0.5V:

  • CAN_H = 4.0V,CAN_L = 2.0V,差分电压还是2.0V

看到了吗?干扰被抵消了。这就是差分信号的魅力。

核心要点:CAN总线靠的是差分电压传递信息,不是对地电压。这是它能在强干扰环境下稳定工作的根本原因。

2.2 CAN_H与CAN_L的电平逻辑

咱们把电平逻辑拆开看。CAN总线只有两种状态:显性(Dominant)和隐性(Recessive)。

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

这里有个容易搞混的地方:隐性对应逻辑1,显性对应逻辑0。为什么这么设计?

我个人习惯这样理解:总线空闲时是隐性(1),谁要发数据就把总线拉成显性(0)。这跟I²C总线的“线与”逻辑有点像——谁先拉低谁赢。

避坑指南:我曾经在一个项目里,用示波器量CAN_H对地电压,发现只有2.0V,以为信号有问题。后来才反应过来——得看差分电压!单端测量在CAN总线里基本没有意义。

2.3 总线拓扑结构

CAN总线的拓扑,说白了就是怎么把各个节点连起来。最常见的就两种:线性和星型。

2.3.1 线性拓扑(推荐)

这是CAN总线的标准玩法。一根主干线,所有节点通过短支线挂上去。

  • 主干线:从一端到另一端,长度由通信速率决定
  • 支线:越短越好,一般不超过0.3米
  • 终端电阻:主干线两端各一个

为什么推荐线性?信号反射最小。我在调试一个500kbps的系统时,支线长了20厘米,波形就出现了明显的振铃。剪短后,问题消失。

2.3.2 星型拓扑(慎用)

星型拓扑就是把所有节点接到一个中心点。看起来方便,但问题不少:

  • 中心点容易产生信号反射
  • 终端电阻不好放——放中心还是放末端?
  • 一旦中心点故障,整个网络瘫痪

警告:除非万不得已(比如空间布局限制),不要用星型拓扑。如果非用不可,建议在中心点加中继器或使用CAN Hub专用芯片。

下面这张图把两种拓扑和电平逻辑串在一起,方便你理解整体结构:

CAN总线物理层核心结构 线性拓扑(推荐) CAN_H CAN_L 120Ω 120Ω 节点1 节点2 节点3 星型拓扑(慎用) HUB 节点A 节点B 节点C CAN_H / CAN_L 电平逻辑 隐性(Recessive) CAN_H=2.5V CAN_L=2.5V 显性(Dominant) CAN_H=3.5V CAN_L=1.5V 差分电压=0V → 逻辑1 差分电压=2.0V → 逻辑0 终端电阻:线性拓扑两端各一个120Ω,用于匹配阻抗、抑制信号反射

2.4 终端电阻的作用与计算

终端电阻,说白了就是防止信号在总线末端“弹回来”。

信号在线上跑,遇到阻抗突变就会反射。反射回来的信号跟原信号叠加,波形就乱了。终端电阻的作用就是“吃掉”这个反射。

2.4.1 为什么是120Ω?

CAN总线用的双绞线,特性阻抗大约是120Ω。为了匹配这个阻抗,终端电阻也得是120Ω。

你想想看:如果线的特性阻抗是120Ω,终端接120Ω,信号到了末端就像进了“无底洞”,没有反射。

计算公式:终端电阻 RT = 双绞线特性阻抗 Z0。标准CAN总线使用120Ω,因为双绞线的Z0典型值就是120Ω。

2.4.2 终端电阻怎么放?

规则很简单:总线两端各放一个。

  • 两个120Ω并联,等效电阻60Ω——这是CAN收发器驱动总线的负载
  • 如果只放一个,反射抑制不彻底
  • 如果放多了(比如每个节点都放),总线负载太重,信号摆幅不够

我曾经踩过的坑:在一个12个节点的系统里,有人每个节点都焊了120Ω电阻。结果总线差分电压只有0.8V,节点死活收不到数据。拆掉多余的电阻,只留两端两个,问题解决。

2.4.3 不同速率下的终端电阻选择

通信速率 最大总线长度 终端电阻 备注
1 Mbps 40 m 120 Ω 标准CAN,严格匹配
500 kbps 100 m 120 Ω 工业现场最常见
250 kbps 250 m 120 Ω 楼宇、车辆常用
125 kbps 500 m 120 Ω 远距离传输
低速(< 125 kbps) 可达1 km 120 Ω 或更大 需考虑线缆电容

小技巧:调试时怎么判断终端电阻有没有接对?用万用表量CAN_H和CAN_L之间的电阻。系统断电时,如果两端都接了120Ω,你应该量到60Ω左右。如果量到120Ω,说明只接了一端。如果量到接近0Ω,说明短路了。