1. CAN总线基础:从汽车线束到工业通信的逆袭
各位同学好,我是老周。今天咱们聊聊CAN总线的基础。说实话,我最早接触CAN总线是在2008年做电动汽车BMS项目的时候。那时候国内会CAN的人不多,我啃着英文手册一点点摸索,踩了不少坑。今天把这些经验分享给你们,希望能少走弯路。
1.1 CAN协议的起源——为什么会有CAN?
上世纪80年代,汽车电子开始爆发。一辆车里有几十个ECU(电子控制单元),每个ECU之间需要通信。传统的点对点接线方式,线束又重又贵,故障率还高。举个例子,一辆豪华车的线束总长能超过2公里,重量接近50公斤。这显然不合理。
1983年,德国Bosch公司开始研发一种新的串行通信协议。1986年,CAN(Controller Area Network)正式发布。它的设计目标很明确:
- 高可靠性:能在强电磁干扰的汽车环境下稳定工作
- 实时性:优先级高的消息必须及时发送
- 低成本:减少线束,降低整车重量和成本
- 多主架构:任何节点都可以主动发起通信,不需要主站
核心认知:CAN不是为办公室环境设计的,它天生就是为工业现场和车载环境准备的。抗干扰、实时性、可靠性是它的基因。
后来,CAN协议被标准化为ISO 11898。目前主流的是CAN 2.0A(11位标识符)和CAN 2.0B(29位标识符)。再后来有了CAN FD(灵活数据速率),但咱们课程主要基于经典CAN和CANopen协议栈,所以先打好基础。
1.2 物理层特性——CAN是怎么传数据的?
CAN总线的物理层,说白了就是一对双绞线。我习惯叫它们CAN_H和CAN_L。为什么用双绞线?因为抗干扰。我在一个电机驱动项目里遇到过,普通平行线在变频器旁边根本没法用,换成双绞线就好了。
CAN总线的电气特性:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 总线电压(显性) | CAN_H ≈ 3.5V, CAN_L ≈ 1.5V | 差分电压约2V |
| 总线电压(隐性) | CAN_H ≈ 2.5V, CAN_L ≈ 2.5V | 差分电压约0V |
| 最大速率 | 1 Mbps(40米内) | 速率越高,距离越短 |
| 最大距离 | 10 km(5 kbps时) | 速率越低,距离越长 |
| 终端电阻 | 120 Ω(两端各一个) | 匹配阻抗,防止信号反射 |
注意:终端电阻必须加在总线两端,不是每个节点都加。我曾经见过一个项目,每个节点都焊了120Ω电阻,结果总线直接拉垮,信号完全出不来。记住:只有最远的两个节点需要终端电阻。
1.3 差分信号——为什么CAN这么抗干扰?
差分信号是CAN总线的核心优势。它用两根线的电压差来表示逻辑状态:
- 显性位(Dominant):CAN_H比CAN_L高约2V,逻辑上代表"0"
- 隐性位(Recessive):CAN_H和CAN_L电压相等,逻辑上代表"1"
为什么会这样设计?你想想看,如果外界有电磁干扰,它会同时作用在两根线上。因为双绞线绞合紧密,两根线受到的干扰几乎相同。接收器只关心两根线的电压差,共模干扰就被抵消了。这就是所谓的共模抑制。
我在一个焊接车间做过项目,焊机一启动,RS-485直接瘫痪。换成CAN总线后,一点问题没有。差分信号配合双绞线,抗干扰能力就是这么强。
小技巧:布线时,CAN_H和CAN_L一定要绞合在一起,绞距建议2-3厘米。不要分开走线,更不要一根走顶层、一根走底层。我见过有人为了省事,用两根平行线代替双绞线,结果通信误码率飙升。
1.4 总线拓扑——CAN网络长什么样?
CAN总线采用多主总线拓扑。所有节点都挂在同一条总线上,通过CAN收发器连接到物理介质。结构很简单:
┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ 节点 1 │ │ 节点 2 │ │ 节点 3 │ │ 节点 n │
│ CAN收发器│ │ CAN收发器│ │ CAN收发器│ │ CAN收发器│
└────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘
│ │ │ │
└──────────────┴──────────────┴──────────────┘
CAN_H (双绞线)
CAN_L (双绞线)
┌──────────────┴──────────────┐
│ │
┌─┴─┐ ┌─┴─┐
│120Ω│ │120Ω│
└───┘ └───┘
终端电阻1 终端电阻2
拓扑要点:
- 总线型:所有节点并联在总线上,没有分支或星型结构
- 两端终端:总线两端各接一个120Ω电阻
- 最大节点数:标准CAN收发器支持110个节点,实际建议不超过30个
- 总线长度:1 Mbps时不超过40米,125 kbps时可达500米
避坑指南:我曾经在一个项目中,为了布线方便,把CAN总线接成了星型拓扑。结果通信时好时坏,查了两天才发现是信号反射导致的。CAN总线必须走直线拓扑,分支长度越短越好,最好不超过30厘米。
1.5 知识结构总览
下面这张图总结了CAN总线基础的核心知识点,方便你建立整体认知:
1.6 总结与实战要点
好了,这一章的内容就这些。总结几个关键点:
- CAN是为恶劣环境设计的,不是办公室玩具。它的抗干扰能力来自差分信号和双绞线。
- 物理层是基础,终端电阻、总线长度、节点数量这些参数必须严格遵守。我见过太多项目因为物理层没做好,导致通信不稳定。
- 拓扑必须总线型,不要搞星型、树型。分支越短越好。
- 显性位覆盖隐性位,这是CAN总线仲裁的基础,后面讲CANopen协议时会用到。
个人建议:刚开始学CAN,先别急着看协议栈。花点时间把物理层搞明白,拿示波器看看CAN_H和CAN_L的波形,理解显性和隐性的区别。物理层搞透了,上层协议就是水到渠成的事。