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专用芯片。
下面这张图把两种拓扑和电平逻辑串在一起,方便你理解整体结构:
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Ω,说明短路了。