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总线的基础知识结构梳理了一下。你可以把它当作本章的思维导图。

CAN总线基础知识体系 CAN总线基础 协议起源 1983年 Bosch 研发 1986年 正式发布 多主架构 · 实时可靠 物理层特性 差分信号 CAN_H / CAN_L 显性 0 / 隐性 1 终端电阻 120Ω 总线拓扑 直线型(总线型) 速率 vs 长度关系 分支长度 ≤ 0.3m 理解这三块,CAN总线的基础就扎实了

1.5 常见问题与避坑指南

做CAN项目这么多年,踩过的坑不少。挑几个典型的说说。

我曾经犯过的错:

  • 终端电阻位置不对——把电阻接在节点内部,而不是总线末端。结果总线反射严重,通信不稳定。
  • CAN_H和CAN_L接反——这个低级错误我犯过一次。两根线对调后,所有节点都收不到数据。因为差分电压反了,显性位变成隐性位。
  • 共地问题——CAN是差分信号,但节点之间必须有共同的参考地。如果地电位差太大,共模电压会超出收发器的承受范围。我建议用隔离CAN收发器,尤其是跨设备通信时。

调试小技巧:用示波器看CAN_H和CAN_L的波形。正常波形应该是方波,幅值约2V(显性)和0V(隐性)。如果波形圆角严重,说明总线负载太重或终端电阻有问题。如果波形上有毛刺,检查接地和屏蔽。

1.6 小结

CAN总线的基础,说白了就是三件事:差分信号怎么传、物理层怎么搭、拓扑怎么布。理解这些,后面的协议层、应用层才能学得扎实。

我个人习惯,每接触一个新项目,先画总线拓扑图,标出节点位置、线缆长度、终端电阻位置。这张图画清楚了,后面调试能省一半时间。

嗯,这一章就到这里。记住:CAN的物理层是通信的基石,基础不牢,地动山摇。