1. CAN总线基础:CAN协议起源、物理层特性、差分信号与总线拓扑
1.1 CAN协议的诞生——从一堆线束说起
说起CAN总线,得回到上世纪80年代。那时候汽车电子刚起步,ECU越来越多,每个模块之间都用独立的铜线连接。你想想看,一个高端车型的线束总长能超过2公里,重量几十公斤。不仅成本高,故障率也上去了——接头松动、线束磨损,修车师傅都头疼。
1983年,德国Bosch公司开始研发一种新的串行通信协议。1986年,CAN(Controller Area Network)正式发布。我最早接触CAN是在2008年做车身控制项目,那时候国内用CAN的还不多,资料全是英文的。啃了两个月协议文档,才把CANopen协议栈调通。
CAN协议的核心目标很简单:用两根线,让多个节点可靠地交换数据。它不依赖主从关系,任何节点都可以主动发消息。这种多主架构,在当时是非常前卫的设计。
CAN协议的关键设计目标:
- 实时性——优先级高的报文不等待
- 可靠性——错误检测与自动重发
- 灵活性——增减节点不改硬件
- 低成本——两根双绞线搞定
1.2 物理层特性——两根线背后的硬功夫
CAN的物理层,说白了就是一对差分线:CAN_H和CAN_L。但别小看这两根线,里面的门道不少。
1.2.1 差分信号——为什么CAN能扛干扰?
CAN用的是差分电压传输。什么意思呢?就是信号不是对地测量的,而是看两根线之间的电压差。
| 信号状态 | CAN_H电压 | CAN_L电压 | 差分电压 |
|---|---|---|---|
| 显性(Dominant) | 3.5V | 1.5V | 2.0V |
| 隐性(Recessive) | 2.5V | 2.5V | 0V |
显性位对应逻辑0,隐性位对应逻辑1。总线空闲时是隐性状态。一旦有节点拉出显性位,总线就被驱动为显性。这就是CAN的线与机制——多个节点同时发送时,显性位覆盖隐性位。
为什么差分信号抗干扰?因为外部电磁干扰会同时作用在两根线上,产生的共模噪声在差分电压中被抵消了。我在一个电机驱动项目里遇到过CAN通信丢包严重的问题,后来发现是CAN线跟动力线走同一个线槽。把CAN线换成双绞屏蔽线,问题就解决了。
经验之谈:CAN线一定要用双绞线,绞距越密抗干扰越好。我一般推荐每米至少30绞。屏蔽层单端接地,不要两端都接,否则容易形成地环路。
1.2.2 总线电平与终端电阻
CAN总线两端必须各接一个120Ω的终端电阻。为什么是120Ω?因为CAN双绞线的特性阻抗大约是120Ω。终端电阻的作用是吸收信号反射,防止波形畸变。
没有终端电阻会怎样?信号会在总线末端反射回来,跟后面的信号叠加,导致误码。我见过一个现场,工程师忘了接终端电阻,总线长度才2米,通信时好时坏。接上电阻后,一切正常。
注意:终端电阻必须接在总线的最远端。如果节点是星形连接,终端电阻要接在分支的最末端。分支长度不要超过0.3米,否则反射问题会很麻烦。
1.3 总线拓扑——CAN能走多远?
CAN总线最常用的拓扑是直线型(总线型)。所有节点都挂在一根主干线上,每个节点通过短分支接入。
不同速率下的最大总线长度:
| 波特率 | 最大总线长度 | 典型应用 |
|---|---|---|
| 1 Mbps | 40 m | 动力系统、高速控制 |
| 500 kbps | 100 m | 车身控制、诊断 |
| 250 kbps | 250 m | 工业自动化 |
| 125 kbps | 500 m | 楼宇控制、远距离 |
| 50 kbps | 1000 m | 船舶、大型设备 |
为什么会有限制?因为CAN的位时序要求采样点在位时间的70%左右。总线越长,信号传播延迟越大,采样点就会偏移。速率越高,位时间越短,对延迟越敏感。
我做过一个项目,总线长度80米,速率设成1 Mbps,结果通信完全不通。把速率降到500 kbps,问题解决。后来查手册才发现,1 Mbps下最大长度就是40米。
1.4 CAN知识体系总览
下面这张图把CAN总线的基础知识结构梳理了一下。你可以把它当作本章的思维导图。
1.5 常见问题与避坑指南
做CAN项目这么多年,踩过的坑不少。挑几个典型的说说。
我曾经犯过的错:
- 终端电阻位置不对——把电阻接在节点内部,而不是总线末端。结果总线反射严重,通信不稳定。
- CAN_H和CAN_L接反——这个低级错误我犯过一次。两根线对调后,所有节点都收不到数据。因为差分电压反了,显性位变成隐性位。
- 共地问题——CAN是差分信号,但节点之间必须有共同的参考地。如果地电位差太大,共模电压会超出收发器的承受范围。我建议用隔离CAN收发器,尤其是跨设备通信时。
调试小技巧:用示波器看CAN_H和CAN_L的波形。正常波形应该是方波,幅值约2V(显性)和0V(隐性)。如果波形圆角严重,说明总线负载太重或终端电阻有问题。如果波形上有毛刺,检查接地和屏蔽。
1.6 小结
CAN总线的基础,说白了就是三件事:差分信号怎么传、物理层怎么搭、拓扑怎么布。理解这些,后面的协议层、应用层才能学得扎实。
我个人习惯,每接触一个新项目,先画总线拓扑图,标出节点位置、线缆长度、终端电阻位置。这张图画清楚了,后面调试能省一半时间。
嗯,这一章就到这里。记住:CAN的物理层是通信的基石,基础不牢,地动山摇。