第一章:CAN总线基础回顾

各位同学,咱们正式开始。做Bootloader刷写,说白了就是在CAN总线上玩数据传输。你要是对CAN帧结构、ID仲裁这些基础不熟,后面写代码肯定会踩坑。我当年刚入行时,就因为搞混了标准帧和扩展帧,差点把ECU刷成砖头。嗯,咱们今天就把这些基础夯实。

1.1 CAN 2.0帧结构

CAN总线上的数据,是以“帧”为单位传输的。就像寄快递,你得把东西打包好,贴上标签,才能发出去。CAN 2.0规范里,主要分两种帧:标准帧和扩展帧。

标准帧(CAN 2.0A):ID长度11位。你想想看,11位二进制能表示多少ID?2^11 = 2048个。对于大多数车载网络来说,够用了。我早期做的一个项目,整个车身网络也就用了200多个ID。

扩展帧(CAN 2.0B):ID长度29位。2^29 = 5亿多个,基本用不完。什么时候用扩展帧?比如一些诊断协议(UDS on CAN)或者J1939协议,它们习惯用29位ID来编码更多信息。

咱们来看看标准帧的结构长什么样:

| SOF | 11位ID | RTR | IDE | r0 | DLC | 数据段(0-8字节) | CRC | ACK | EOF |
|-----|--------|-----|-----|----|-----|----------------|-----|-----|-----|
| 1bit | 11bit  | 1bit| 1bit|1bit| 4bit| 0-64bit        |15bit| 2bit| 7bit|

这里有几个关键字段,我重点说一下:

  • SOF(Start of Frame):帧起始,1个显性位。告诉总线上所有节点:“我要发数据了!”
  • ID(Identifier):标识符。它不光标识消息,还决定优先级。数值越小,优先级越高。
  • RTR(Remote Transmission Request):远程帧请求位。0是数据帧,1是远程帧。远程帧说白了就是“我要数据,你发给我”。
  • DLC(Data Length Code):数据长度。0到8字节。注意,DLC可以写0,但数据段就不存在了。
  • 数据段:0~8字节。Bootloader刷写时,一帧最多带8字节数据。这就是为什么刷写大文件要分包。

重点记忆:CAN帧数据段最多8字节。这是硬限制,所有Bootloader协议都得遵守。

1.2 CAN ID与仲裁

CAN总线有个很牛的特性:多主通信。也就是说,任何节点都可以随时往总线上发数据。那问题来了:如果两个节点同时发,会不会冲突?

答案是:不会。CAN总线用“非破坏性逐位仲裁”来解决冲突。说白了,就是看谁的ID小,谁就赢。

举个例子:

  • 节点A发ID = 0x100(二进制:001 0000 0000)
  • 节点B发ID = 0x200(二进制:010 0000 0000)

当它们同时发送时,从最高位开始比较。A的第一位是0(显性),B的第一位是1(隐性)。显性位会覆盖隐性位,所以A赢了,B自动退出发送。整个过程没有数据损坏,这就是“非破坏性”的含义。

我在项目中遇到过一个问题:两个ECU的CAN ID设得太接近,导致高优先级节点一直占着总线,低优先级节点发不出去。后来我们调整了ID分配策略,把刷写相关的ID设得比普通报文低(优先级高),这样刷写时不会被其他报文干扰。

个人经验:设计Bootloader时,建议把刷写相关的CAN ID设为0x700~0x7FF范围。这个范围优先级高,而且不容易和普通报文冲突。

关于ID,还有一点要注意:标准帧和扩展帧的仲裁规则略有不同。扩展帧的29位ID中,前11位(Base ID)和后18位(Extended ID)是分开仲裁的。实际项目中,我建议尽量统一用一种帧格式,混用容易出问题。

1.3 CAN网络拓扑

CAN网络长什么样?说白了就是一条总线,所有节点都挂在这条线上。典型的拓扑结构如下:

ECU1 ──┐
ECU2 ──┼── [CAN_H] ──── 终端电阻(120Ω)
ECU3 ──┼── [CAN_L] ──── 终端电阻(120Ω)
ECU4 ──┘

关键点:

  • 双线差分:CAN_H和CAN_L。信号靠两根线的电压差来传输。抗干扰能力强,这就是为什么汽车上用它。
  • 终端电阻:总线两端各一个120Ω电阻。作用是消除信号反射。没有终端电阻,高速通信时波形会振铃,数据就乱了。
  • 最大节点数:理论上可以挂很多,但实际受驱动能力限制。一般建议不超过30个节点。我见过一个项目挂了40多个节点,结果总线负载率太高,刷写时老超时。

避坑指南:我曾经调试一个Bootloader刷写失败的问题,查了两天,最后发现是终端电阻没焊。没有终端电阻,总线信号反射严重,CRC校验经常失败。所以,硬件设计时一定要检查终端电阻。

再说说总线长度。CAN总线的最大长度和通信速率有关:

速率(kbps) 最大总线长度(m)
1000 40
500 100
250 250
125 500

车载网络常用500kbps,总线长度控制在几十米内完全没问题。但如果你在做商用车或工程机械,总线可能更长,那就得降低速率。

嗯,到这里,CAN总线的基础就回顾完了。帧结构、ID仲裁、网络拓扑,这三块是Bootloader刷写的基石。下一章咱们开始讲Bootloader的启动流程,到时候你会看到这些基础概念怎么用起来。