第2章:CAN总线物理层——信号怎么在线上跑
好,咱们正式开始啃CAN总线。第一章聊了CAN是什么、能干什么。这一章,咱们得钻到线里面去看看——信号到底是怎么在CAN_H和CAN_L这两根线上传输的。
物理层这东西,很多人觉得枯燥。但我跟你说,恰恰是物理层没搞懂,才导致项目现场出各种稀奇古怪的问题。我见过有人把CAN_H和CAN_L接反了,折腾一整天;也见过终端电阻没配好,总线直接罢工。嗯,咱们今天就把这些坑一个个填平。
2.1 差分信号——为什么CAN要用两根线?
先问一个问题:为什么CAN不跟UART一样,用一根线传数据?
答案很简单——抗干扰。
单端信号(比如UART的TX),信号电压是相对于GND测量的。如果外界有个强电磁干扰,线上电压被拉高或拉低,接收端就懵了:这到底是0还是1?
差分信号就不一样。它用两根线传同一路信号,但相位相反:
- CAN_H:高电平线
- CAN_L:低电平线
接收端只看两根线的电压差(Vdiff = CAN_H - CAN_L)。干扰来了?没关系,两根线同时被干扰,差值基本不变。这就是差分信号的底气。
核心结论:差分信号让CAN在工业现场、汽车引擎舱这种强干扰环境里,依然能稳定通信。这是CAN的立身之本。
我在一个电机驱动项目里遇到过这种情况:电机一启动,UART通信就乱码。换成CAN,同样的线束、同样的距离,稳如泰山。从那以后,我对差分信号就特别信任。
2.2 CAN_H和CAN_L的电平定义
CAN总线定义了两种逻辑状态:显性(Dominant)和隐性(Recessive)。
说白了:
- 显性 = 逻辑0(总线被主动拉低)
- 隐性 = 逻辑1(总线处于空闲状态)
具体电平值是这样的(以经典的ISO 11898-2高速CAN为例):
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 (Vdiff) |
|---|---|---|---|
| 隐性(Recessive) | 2.5V | 2.5V | 0V |
| 显性(Dominant) | 3.5V | 1.5V | 2.0V |
你想想看:隐性时两根线都是2.5V,差值为0。显性时CAN_H被拉到3.5V,CAN_L被拉到1.5V,差值2V。接收器只要检测到差分电压大于0.9V左右,就判定为显性。
小技巧:用示波器看CAN总线,把通道1接CAN_H,通道2接CAN_L,然后用数学通道做CH1-CH2。你就能直接看到差分信号波形——排查问题的时候特别好用。
这里有个容易混淆的点:显性会覆盖隐性。如果多个节点同时发送,只要有一个节点发显性位,总线就是显性。这就是CAN总线仲裁的物理基础——咱们后面讲数据链路层的时候会细说。
2.3 总线拓扑结构——线怎么连?
CAN总线推荐什么拓扑?线性总线(直线型)。说白了就是一根主干线,所有节点都挂在这根线上。
为什么必须是线性?因为CAN的电气特性要求信号在线上传播时不能有大的反射。分支太长、星型连接,都会导致信号反射,轻则误码,重则通信瘫痪。
2.3.1 线性拓扑(推荐)
- 一根主干线,两端各接一个120Ω终端电阻
- 节点通过短支线(不超过30cm)连接到主干
- 结构简单,信号质量最好
2.3.2 星型拓扑(不推荐)
- 所有节点汇聚到一个中心点
- 信号反射严重,终端电阻不好配
- 除非用CAN中继器或集线器,否则别这么干
警告:我见过一个项目,现场工程师为了布线方便,把CAN总线接成了星型。结果总线速率降到10kbps才能勉强通信。后来改成线性拓扑,500kbps跑得稳稳的。拓扑结构别乱改,这是血的教训。
下面这张图把线性拓扑和星型拓扑的差异画清楚了:
2.4 终端电阻——为什么是120Ω?
终端电阻是CAN总线里最容易忽略、也最容易出问题的地方。
它的作用有两个:
- 消除信号反射——高速信号在总线末端会反射回来,跟后面的信号叠加,造成波形畸变
- 提供差分负载——显性状态下,收发器需要一定的负载电流来产生正确的差分电压
为什么偏偏是120Ω?
因为CAN总线的双绞线特性阻抗大约是120Ω。终端电阻等于特性阻抗时,反射最小。这不是拍脑袋定的,是传输线理论算出来的。
关键规则:一条CAN总线,且仅需两个120Ω终端电阻,分别放在总线的两个最远端。不多不少,正好两个。
我曾经在一个项目里看到有人每个节点都焊了一个120Ω电阻,结果总线负载太重,显性电压拉不下去,通信时好时坏。拆掉多余的电阻,问题立刻解决。
2.4.1 终端电阻配置速查表
| 场景 | 终端电阻配置 | 说明 |
|---|---|---|
| 标准CAN网络(2个节点) | 每个节点各一个120Ω | 两端各一个,等效60Ω |
| 标准CAN网络(多个节点) | 总线两端各一个120Ω | 中间节点不加电阻 |
| 短距离低速测试(<1m) | 可以不加终端电阻 | 仅限调试,正式产品必须加 |
| 使用CAN FD高速率 | 必须精确匹配120Ω | 速率越高,对终端匹配越敏感 |
避坑指南:我曾经在调试一个5节点CAN网络时,通信总是不稳定。用示波器一看,波形边缘有严重的振铃。查了半天,发现总线末端的节点没焊终端电阻。加上之后,波形干净得像教科书一样。记住:终端电阻不是可选项,是必选项。
2.5 物理层设计检查清单
这一章内容不少,我帮你整理成一个快速检查清单。以后做CAN项目,对着这个清单过一遍,物理层基本不会出问题:
- ☐ 拓扑结构:线性总线,不要星型
- ☐ 支线长度:每个节点支线不超过30cm
- ☐ 终端电阻:总线两端各一个120Ω,不多不少
- ☐ 线缆类型:双绞线(推荐屏蔽双绞线)
- ☐ CAN_H/CAN_L:不要接反,不要跟电源/GND短路
- ☐ 共模电压:确保所有节点的GND电位差不要太大(最好共地)