2、CAN总线物理层:差分信号原理、CAN_H与CAN_L电平定义、显性电平与隐性电平、总线拓扑结构
各位同学,咱们今天聊聊CAN总线的物理层。说实话,很多工程师做CAN开发,上来就写代码、调报文,结果一上实车就出问题——波形乱跳、通信中断。为什么?物理层没吃透。
物理层是CAN通信的基石。你想想看,信号在线上怎么跑、电平怎么定义、节点怎么连,这些搞不清楚,上层协议栈写得再漂亮也是空中楼阁。我个人习惯,接手任何一个CAN项目,第一件事就是拿示波器看总线波形,确认物理层没问题,再谈别的。
2.1 差分信号:为什么CAN要用两根线?
CAN总线用两根线传输信号:CAN_H(高线)和CAN_L(低线)。这不是为了多卖一根线,而是为了抗干扰。
差分信号的核心思想很简单:信号不是对地测量的,而是两根线之间的电压差。发送端让CAN_H和CAN_L的电压朝相反方向变化,接收端只关心Vdiff = CAN_H - CAN_L。
为什么会这样?因为外部电磁干扰(EMI)通常同时作用在两根线上(共模干扰)。干扰来了,CAN_H和CAN_L同时升高或降低相同的量,但它们的差值基本不变。这就叫共模抑制。
我在项目中遇到过一件事:某次在电机控制器附近布线,单端信号(比如UART)完全被干扰淹没,但同一束线里的CAN总线纹丝不动。差分信号就是这么硬气。
差分信号优势总结:
- 抗共模干扰:外部噪声同时耦合到两根线上,差值不变
- 电磁辐射低:两根线电流方向相反,磁场相互抵消
- 信号摆幅小:差分电压仅约2V,功耗低、速率高
- 共模电压范围宽:允许地电位偏移,适合恶劣环境
2.2 CAN_H与CAN_L电平定义
CAN总线在静默状态(总线空闲)时,CAN_H和CAN_L都稳定在2.5V左右。这时候差分电压Vdiff ≈ 0V。这叫隐性电平(Recessive)。
当有节点要发送数据时,它会驱动CAN_H升高、CAN_L降低。标准CAN(ISO 11898-2)要求:
- CAN_H:从2.5V拉到3.5V(升高1V)
- CAN_L:从2.5V拉到1.5V(降低1V)
- 差分电压Vdiff = 3.5V - 1.5V = 2.0V
这个状态叫显性电平(Dominant)。
| 参数 | 隐性电平(Recessive) | 显性电平(Dominant) |
|---|---|---|
| CAN_H电压 | 2.5V | 3.5V |
| CAN_L电压 | 2.5V | 1.5V |
| 差分电压Vdiff | ≈ 0V | ≈ 2.0V |
| 逻辑值 | 1(高电平) | 0(低电平) |
嗯,这里要注意:CAN总线的逻辑电平跟常规TTL/CMOS是反的。隐性对应逻辑1,显性对应逻辑0。我第一次用CAN时就被这个坑过——以为显性是高电平,结果逻辑分析仪解析全反了。
2.3 显性电平与隐性电平:总线仲裁的基础
为什么CAN要定义显性和隐性?因为总线仲裁需要。
CAN总线是“线与”逻辑:多个节点可以同时发送,但显性电平会覆盖隐性电平。也就是说,只要有一个节点输出显性(0),总线就是显性;只有所有节点都输出隐性(1),总线才是隐性。
这跟I²C总线的“线与”原理类似,但CAN用差分信号实现,抗干扰能力更强。
仲裁过程是这样的:多个节点同时发送,每个节点在发送位的同时监听总线。如果它发送的是隐性(1),但总线上是显性(0),说明有更高优先级的节点在发送,它立即退出竞争。这就是CAN的非破坏性逐位仲裁。
避坑指南:我曾经调试过一个项目,总线偶尔出现错误帧。查了三天,最后发现是某个节点的CAN收发器驱动能力不足,显性电平只能拉到3.2V(标准要求3.5V)。虽然也能通信,但噪声容限大幅降低,稍微有点干扰就出错。所以,设计时一定要保证收发器输出电平满足ISO 11898标准。
2.4 总线拓扑结构
CAN总线采用多主总线拓扑。所有节点都挂在同一条总线上,没有主从之分。任何节点都可以随时发起通信。
物理连接上,CAN总线是线性总线(也叫干线-支线拓扑):
- 干线:一条主电缆,两端各接一个120Ω终端电阻
- 支线:从干线引出到各个节点的短接线,长度尽量短(建议< 0.3m)
- 节点:通过CAN收发器连接到总线
终端电阻为什么是120Ω?因为CAN总线使用的双绞线特性阻抗约为120Ω。终端电阻的作用是吸收信号反射,防止波形振铃。没有终端电阻,高速通信时波形会严重畸变。
重要提醒:终端电阻必须接在总线两端,不能只接一端,也不能接在中间。我见过有人把两个120Ω电阻都焊在一个节点上,结果信号反射依然存在,通信距离缩短了一半。
标准CAN(ISO 11898-2)的拓扑参数:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 最大节点数 | 30(标准)/ 110(改进) | 受收发器驱动能力限制 |
| 最大总线长度 | 40m @ 1Mbps | 速率越低,长度越长 |
| 终端电阻 | 120Ω ±1% | 两端各一个 |
| 支线长度 | < 0.3m(推荐) | 过长会导致信号反射 |
| 双绞线特性阻抗 | 120Ω | 与终端电阻匹配 |
下面这张图展示了CAN总线的典型拓扑结构:
实际项目中,总线拓扑有几个常见变体:
- 星型拓扑:不推荐。信号反射点多,终端匹配困难。我见过一个星型CAN网络,通信速率只能降到50kbps才能稳定工作。
- 树型拓扑:可以接受,但分支长度要严格控制。每个分支末端最好加终端电阻。
- 环型拓扑:CAN标准不支持。环型结构会形成信号环路,导致振荡。
我的经验:设计CAN总线布局时,记住三个原则:
- 总线越短越好——长度每增加10m,最大速率下降约一个数量级
- 支线越短越好——超过0.3m的支线必须加中继器或CAN网桥
- 终端电阻必须匹配——用万用表量总线两端,阻值应为60Ω(两个120Ω并联)
好了,物理层的内容就这些。差分信号、显隐性电平、总线拓扑,这三个概念是CAN通信的根基。下一层我们就要进入数据链路层,看看CAN帧是怎么组装的。但那是后话了——先把物理层吃透,示波器上能看懂波形,才算真正入门。