一、CAN总线基础:CAN协议起源、物理层特性、数据帧结构
大家好,我是老李。做汽车电子这行十几年了,CAN总线可以说是我最熟悉的"老伙计"。今天咱们就来聊聊CAN总线的底子——它的起源、物理层长什么样,以及数据帧到底怎么组织的。
说实话,我刚入行那会儿,CAN总线还是个"新玩意儿"。现在呢?每辆车里少说几十个ECU,全靠它串起来。你想想看,没有CAN,汽车电子就是一堆孤岛。
1.1 CAN协议的起源——为什么会有它?
上世纪80年代,汽车越来越"聪明"。但问题来了:每个电子单元都自己拉一堆线,线束又重又贵,还容易出故障。
我记得当时有个项目,光车门上的线束就有30多根。开关个窗户,信号要绕一大圈。工程师们都在想:能不能用两根线,把所有设备串起来?
1983年,德国Bosch公司开始搞这个事。1986年,CAN(Controller Area Network)协议正式发布。说白了,就是给汽车电子装了个"共享电话线"——谁有话要说,就在线上喊一声,大家都能听到。
核心思想:多主机、广播式通信。任何节点都可以随时发送,不需要主节点调度。
后来ISO把它标准化了,就是ISO 11898。现在几乎所有汽车、工业设备都在用。我做过一个农机项目,拖拉机里也是CAN,可见它有多普及。
1.2 CAN总线物理层特性——两根线撑起一片天
物理层,说白了就是信号怎么在线上跑。CAN总线物理层有几个关键点,我一个个说。
1.2.1 差分信号传输
CAN用两根线:CAN_H和CAN_L。信号靠两根线的电压差来传递。
- 显性电平(Dominant):CAN_H比CAN_L高2V左右。逻辑上代表"0"。
- 隐性电平(Recessive):CAN_H和CAN_L电压相等(约2.5V)。逻辑上代表"1"。
为什么会用差分?抗干扰啊!我遇到过好几次,车间里电机一启动,单端信号就乱跳。但CAN总线纹丝不动。因为干扰同时作用在两根线上,电压差不变。
我的经验:布线时,CAN_H和CAN_L一定要绞在一起。绞得越密,抗干扰越好。我曾经见过一个项目,线没绞,结果通信老是丢包。绞了之后,问题全没了。
1.2.2 总线电平与终端电阻
CAN总线两端各需要接一个120Ω的终端电阻。为什么是120Ω?因为双绞线的特性阻抗大约就是120Ω。不接的话,信号会在末端反射,波形就乱了。
| 参数 | 高速CAN(ISO 11898-2) | 低速CAN(ISO 11898-3) |
|---|---|---|
| 最大速率 | 1 Mbps | 125 kbps |
| 总线长度 | ≤ 40 m @ 1 Mbps | ≤ 500 m |
| 终端电阻 | 120Ω(两端) | 不需要 |
| 显性电平 | CAN_H=3.5V, CAN_L=1.5V | CAN_H=5V, CAN_L=0V |
嗯,这里要注意:高速CAN和低速CAN的物理层不兼容。我见过有人把低速CAN节点接到高速总线上,结果通信时好时坏。排查了半天才发现是混用了。
1.2.3 总线拓扑与节点数
CAN总线是总线型拓扑,所有节点挂在两根线上。理论上最多可以挂110个节点,但实际中我建议别超过30个。为什么?节点多了,总线负载就高,实时性会下降。
我曾经做过一个项目,挂了40多个节点,结果总线利用率到了80%以上。优先级低的报文经常发不出去。后来只好拆成两路CAN。
1.3 CAN总线数据帧结构——报文长什么样?
数据帧是CAN通信的基本单位。标准格式(CAN 2.0A)有11位ID,扩展格式(CAN 2.0B)有29位ID。咱们先看标准格式。
1.3.1 标准数据帧结构
一个标准数据帧,由以下几个部分组成:
SOF | 11位ID | RTR | IDE | r0 | DLC | 数据段(0-8字节) | CRC | ACK | EOF
我来拆开讲:
- SOF(Start of Frame):1位显性电平。告诉所有节点:"我要开始发了"。
- ID(Identifier):11位。用来标识报文优先级。数值越小,优先级越高。
- RTR(Remote Transmission Request):1位。显性表示数据帧,隐性表示远程帧。
- IDE(Identifier Extension):1位。显性表示标准格式,隐性表示扩展格式。
- r0:保留位,显性。
- DLC(Data Length Code):4位。表示数据段有多少字节。范围0-8。
- 数据段:0到8字节。真正要传的数据。
- CRC(Cyclic Redundancy Check):15位CRC校验 + 1位隐性分隔符。
- ACK(Acknowledge):2位。发送方发隐性,接收方在ACK Slot位拉成显性,表示收到了。
- EOF(End of Frame):7位隐性电平。表示帧结束。
重点:ID决定了谁能抢到总线。我调试时经常用CAN分析仪看ID,数值小的报文总是先发。这就是CAN的"非破坏性逐位仲裁"机制。
1.3.2 扩展数据帧(CAN 2.0B)
扩展帧就是把11位ID扩展成29位。结构上多了SRR、IDE和18位扩展ID。
SOF | 11位基础ID | SRR | IDE | 18位扩展ID | RTR | r1 | r0 | DLC | 数据段 | CRC | ACK | EOF
SRR位替代了标准帧的RTR位。IDE位现在是隐性,表示这是扩展帧。
我个人习惯:能用标准帧就用标准帧。扩展帧虽然ID多,但帧长,总线利用率低。只有在节点特别多、ID不够用时才用扩展帧。
1.3.3 其他帧类型
除了数据帧,还有三种帧:
- 远程帧:RTR位为隐性。用来请求对方发送数据。我很少用,因为大多数场景下,节点主动发数据就够了。
- 错误帧:由6个显性位组成。任何节点检测到错误,就发错误帧,把总线"搞乱",让所有节点重发。
- 过载帧:节点忙不过来时发,让对方等一等。
避坑指南:我曾经遇到过一个bug,某个节点老是发错误帧,把总线堵死了。查了半天,发现是它的晶振频率不准,导致位时序不对。所以,CAN节点的时钟精度一定要够,至少±1.5%以内。
1.4 位时序与同步——数据怎么在线上对齐?
CAN总线没有单独的时钟线。所有节点靠"位同步"来对齐时钟。每个位被分成4段:
- 同步段(Sync_Seg):1个时间量子(Tq)。用于同步。
- 传播段(Prop_Seg):1-8 Tq。补偿物理延迟。
- 相位缓冲段1(Phase_Seg1):1-8 Tq。用于重同步。
- 相位缓冲段2(Phase_Seg2):1-8 Tq。用于重同步。
采样点通常在Phase_Seg1和Phase_Seg2之间。我一般把采样点设在87.5%左右。这样抗干扰能力最强。
举个例子,1 Mbps速率下,一个位时间=1 μs。如果Tq=125 ns,那一个位就是8个Tq。分配成:Sync=1, Prop=3, Phase1=3, Phase2=1。采样点在87.5%处。
我的建议:设计CAN节点时,一定要算好位时序。用CAN分析仪看实际波形,确认采样点位置。我见过太多因为位时序不对导致的通信问题。
1.5 小结
好了,CAN总线的基础就这些。总结一下:
- CAN起源于Bosch,解决汽车线束过多的问题。
- 物理层用差分信号,抗干扰强。终端电阻不能少。
- 数据帧有标准帧和扩展帧,ID决定优先级。
- 位时序要算准,采样点位置很关键。
下一章,咱们聊CAN总线信号矩阵的设计方法。那才是真正干活用的东西。到时候我会拿一个实际项目中的矩阵来拆解,保证你听完就能上手。
嗯,今天就到这儿。有问题随时交流。