1. 课程导入
大家好,我是你们这趟CAN通信之旅的向导。咱们今天聊的,是整个课程的地基——CAN总线基础。别小看这第一章,我见过不少老手,在差分信号和总线电平上栽过跟头。咱们一步步来,把底子打扎实。
1.1 CAN协议的起源:为什么会有它?
上世纪80年代,汽车里的电子设备越来越多。空调、ABS、发动机控制、仪表盘……每个模块都靠一堆独立的线连来连去。你想想看,一辆车光线束就有几十公斤重,又贵又容易出故障。
当时德国博世(Bosch)的工程师们坐不住了。他们想要一种总线——只用两根线,就能让所有电子控制单元(ECU)互相通信。于是,1986年,CAN(Controller Area Network)协议诞生了。
核心目标就三个:
- 可靠性高——抗干扰,能检测错误
- 实时性好——优先级高的消息不耽误
- 成本低——两根线搞定一切
我个人习惯把CAN比作一个“会议室”:谁想发言都可以,但只有优先级最高的人能拿到话筒。这就是CAN的“多主从”架构——没有老大,谁都能抢总线。
1.2 物理层特性:两根线走天下
CAN总线物理层,说白了就是一对双绞线:CAN_H(高线)和CAN_L(低线)。为什么用两根?因为要传差分信号。这个咱们后面细说。
先看几个关键参数:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 总线电平 | 显性:CAN_H≈3.5V,CAN_L≈1.5V 隐性:CAN_H≈2.5V,CAN_L≈2.5V |
显性位覆盖隐性位 |
| 最大速率 | 1 Mbps(40米以内) | 距离越长,速率越低 |
| 最大节点数 | 理论110个(实际建议≤32) | 受驱动能力限制 |
| 终端电阻 | 120Ω(两端各一个) | 消除信号反射 |
| 总线长度 | 1 Mbps时≤40m 125 kbps时≤500m |
速率与距离成反比 |
避坑指南:我曾经在一个项目中,终端电阻只加了一端,结果总线信号反射得一塌糊涂,通信时好时坏。查了两天才找到原因。记住:终端电阻必须加在总线两端,且阻值要精确到120Ω。
1.3 差分信号:抗干扰的秘密武器
为什么CAN要用差分信号?因为汽车里电磁干扰太严重了。点火线圈、电机、继电器……到处都是噪声源。
差分信号的工作原理很简单:
- 发送端:在CAN_H和CAN_L上输出一对相反的电压
- 接收端:计算CAN_H - CAN_L的差值
举个例子:
- 显性位(逻辑0):CAN_H=3.5V,CAN_L=1.5V,差值=2.0V
- 隐性位(逻辑1):CAN_H=2.5V,CAN_L=2.5V,差值=0V
如果外界有个强电磁干扰,同时作用在两根线上,比如都增加了1V:
- 显性位变成:CAN_H=4.5V,CAN_L=2.5V,差值还是2.0V
- 接收端完全不受影响!
这就是差分信号的魅力——共模抑制。干扰是“共模”的,信号是“差模”的,一减就没了。
注意:双绞线不是随便绞的。每英寸绞合次数有讲究,绞得越密,抗干扰越好。我见过有人用普通平行线代替双绞线,结果通信距离直接缩水一半。别省这点成本。
1.4 总线电平与位仲裁
CAN总线有两种电平状态:
- 隐性(Recessive):CAN_H=CAN_L=2.5V,差值为0V。代表逻辑1。
- 显性(Dominant):CAN_H=3.5V,CAN_L=1.5V,差值为2.0V。代表逻辑0。
关键规则:显性位会覆盖隐性位。也就是说,只要有一个节点发送显性位,总线就是显性的。
这个特性被用来做位仲裁——当多个节点同时发送时,谁先发显性位,谁就赢。仲裁场里的ID越小,优先级越高。
举个例子:
- 节点A发送ID=0x123(二进制:0001 0010 0011)
- 节点B发送ID=0x456(二进制:0100 0101 0110)
- 从最高位开始比,A的第一位是0(显性),B的第一位是1(隐性)
- A赢了,B自动退出发送,转为接收
整个过程在几个微秒内完成,不浪费任何带宽。
我建议你在设计系统时,把最紧急的消息(比如刹车、气囊)分配最小的ID。这样它们永远能抢到总线。这是CAN协议最优雅的设计之一。
1.5 知识体系总览
下面这张图,把本章的核心知识点串起来了。你可以把它当作一个“地图”,后面每章都会在这个地图上添加新的内容。
1.6 本章小结
咱们这一章,把CAN总线的根扎下去了:
- 起源:博世为了解决汽车线束过多的问题,1986年推出CAN协议
- 物理层:一对双绞线,CAN_H和CAN_L,两端各加120Ω终端电阻
- 差分信号:通过计算两根线的电压差来传输数据,天然抗共模干扰
- 总线电平:显性(0)覆盖隐性(1),利用这个特性实现无冲突的位仲裁
嗯,到这里,CAN总线的“骨架”你已经有了。下一章咱们会深入CAN的数据帧结构,看看消息到底是怎么打包发送的。不过那是后话,先把今天的内容消化掉。
课后小练习:找一块CAN分析仪(比如PCAN或Kvaser),接上两个节点,用示波器看看CAN_H和CAN_L的波形。亲眼看到显性和隐性电平的变化,比看一百遍书都管用。我当年就是这么入门的。