4. CAN物理层:差分信号原理、CAN_H与CAN_L电平定义、终端电阻的作用、总线拓扑结构
各位同学,咱们今天聊聊CAN总线的物理层。说实话,很多工程师做CAN开发,上来就写代码、调报文,却忽略了最底层的物理层。我见过不少项目,问题就出在线上——信号反射、电平不对、终端电阻没配好。嗯,咱们先把地基打牢。
4.1 差分信号原理:为什么CAN要用两根线?
你想想看,地铁车门控制器旁边就是大功率电机、变频器,电磁干扰特别强。如果只用一根信号线对地传输,干扰一上来,0和1就分不清了。CAN总线用了差分信号,说白了就是两根线拧在一起传。
差分信号的核心思想:信号不依赖对地电压,而是看两根线之间的电压差。CAN_H和CAN_L是一对双绞线,外界干扰同时作用在两根线上,差值基本不变。我在地铁项目现场调试时,有一次车门控制器离牵引逆变器只有半米远,普通串口根本没法用,换成CAN总线就稳得很。
差分信号的优势:
- 抗干扰强:共模噪声被抵消
- 抑制电磁辐射:双绞线自身抵消磁场
- 检测可靠:只需判断CAN_H与CAN_L的电位差
4.2 CAN_H与CAN_L电平定义:显性与隐性
CAN总线定义了两种总线状态:显性(Dominant)和隐性(Recessive)。这个设计很巧妙,我刚开始学的时候觉得有点绕,其实记住一句话就行:显性电平“覆盖”隐性电平。
| 状态 | CAN_H电压 | CAN_L电压 | 差分电压 (CAN_H - CAN_L) | 逻辑值 |
|---|---|---|---|---|
| 隐性 | 2.5V | 2.5V | ≈0V | 1(逻辑高) |
| 显性 | 3.5V | 1.5V | ≈2V | 0(逻辑低) |
为什么会这样设计?你想想看,如果多个节点同时发送,显性位(0)会“压过”隐性位(1)。这就是CAN总线仲裁的基础——谁先发0,谁就赢得总线控制权。我在车门系统中调试过多个门控器同时发送紧急报文,靠的就是这个机制保证高优先级报文不丢。
个人经验:测量CAN总线波形时,我习惯用差分探头直接看CAN_H和CAN_L的差值。如果示波器只有单端探头,就分别测两根线对地,然后手动相减。注意:隐性时两根线都是2.5V左右,显性时CAN_H跳到3.5V,CAN_L降到1.5V。如果看到电压偏差太大,比如隐性时只有2.0V,那就要检查共模电压了。
4.3 终端电阻的作用:为什么是120Ω?
终端电阻,说白了就是防止信号反射。信号在总线末端如果遇到阻抗突变,就会反弹回来,干扰正常数据。我遇到过最典型的问题:某次车门调试,总线长度不到20米,没加终端电阻,结果波特率500kbps时偶尔丢帧。加上120Ω电阻后,问题立刻消失。
为什么偏偏是120Ω?因为CAN总线用的双绞线特性阻抗大约是120Ω。在总线两端各并联一个120Ω电阻,等效电阻就是60Ω。这个值刚好匹配收发器的输出阻抗,信号到了末端就被吸收,不会反弹。
避坑指南:我曾经见过一个项目,工程师在总线上加了4个120Ω电阻,结果总线负载太重,显性电平都拉不上去。记住:标准CAN总线只需要两个终端电阻,分别放在最远的两端。中间节点绝对不要加。
终端电阻的计算也很简单:
R_total = 120Ω // 2 = 60Ω
(两个120Ω并联)
如果总线长度很短(比如小于1米),不加终端电阻也能工作。但地铁车门系统总线长度往往几十米,我建议不管多短,都加上。这是规范,也是习惯。
4.4 总线拓扑结构:直线型才是王道
CAN总线推荐直线型(总线型)拓扑。所有节点都挂在一条主干线上,每个节点用尽量短的支线连接。为什么?因为支线会产生信号反射,支线越长,反射越严重。
我见过最离谱的拓扑:有人把CAN总线接成了星型,结果通信时好时坏。查了半天,发现是支线长度加起来超过30米,信号反射得一塌糊涂。后来改成直线型,问题解决。
| 拓扑类型 | 是否推荐 | 说明 |
|---|---|---|
| 直线型(总线型) | ✅ 强烈推荐 | 主干线贯穿所有节点,支线尽量短 |
| 星型 | ❌ 不推荐 | 中心节点故障会导致全网瘫痪 |
| 环型 | ❌ 不推荐 | CAN协议不支持环型冗余 |
地铁车门系统的典型拓扑:
- 主干线:贯穿整列车厢,使用屏蔽双绞线
- 支线:每个门控器(DCU)通过短支线接入,长度不超过0.3米
- 终端电阻:列车两端各一个120Ω电阻
- 节点数:一列车通常20-40个门控器
嗯,这里要注意:支线长度不是随便定的。波特率越高,允许的支线越短。500kbps时,支线最好控制在0.3米以内。如果实在没办法,可以用CAN中继器或网关来延长。
4.5 实战经验总结
最后,我把自己在地铁车门项目中积累的物理层检查清单分享给你:
- 量静态电压:总线空闲时,CAN_H对地2.5V,CAN_L对地2.5V
- 量差分电压:显性时CAN_H - CAN_L ≈ 2V
- 测终端电阻:断电状态下,总线两端之间电阻应为60Ω
- 看波形:用示波器看隐性到显性的跳变沿,应该干净利落,没有回勾
- 查拓扑:确保是直线型,支线不超过0.3米
我曾经在调试一列新车时,发现总线波形有毛刺,查了三天才发现是某个门控器的CAN收发器供电滤波电容虚焊。从那以后,我每次调试都先看波形,再读报文。物理层没问题,上层协议才能跑得稳。
下一章咱们聊CAN数据链路层,讲讲帧格式和仲裁机制。到时候你会发现,物理层这些基础搞懂了,上层的东西理解起来就顺理成章了。