第3章:CAN总线基础:CAN 2.0与CAN FD的区别,报文格式,位时序与同步机制
好,咱们进入CAN总线这个硬核话题。说实话,做Bootloader升级,CAN总线是绕不开的坎。你想想看,ECU之间怎么通信?靠的就是这根双绞线。我最早接触CAN是在一个车身控制项目里,当时被位时序折腾得够呛,后来才慢慢摸出门道。
3.1 CAN 2.0与CAN FD:到底差在哪?
先说说经典CAN 2.0。它分两种:标准帧(11位ID)和扩展帧(29位ID)。数据段最多8个字节,波特率最高1Mbps。嗯,这个速度在十年前够用,但现在嘛——你升级一个几百KB的固件,得发多少帧?
CAN FD(Flexible Data-rate)就是来解决这个痛点的。它有两个核心变化:
- 数据长度翻倍:从8字节扩展到64字节。我算过一笔账,同样传512字节数据,CAN 2.0要发64帧,CAN FD只要8帧。效率提升可不是一星半点。
- 速率可切换:仲裁段用标准速率(比如500kbps),数据段可以飙到2Mbps甚至更高。为什么这么设计?因为仲裁需要所有节点同步,速率不能太快;但数据传输阶段,只有发送方在讲话,可以跑快点。
关键区别一览
| 特性 | CAN 2.0 | CAN FD |
|---|---|---|
| 最大数据长度 | 8字节 | 64字节 |
| 最大波特率 | 1 Mbps | 数据段可达8 Mbps |
| 帧格式 | 标准/扩展 | 兼容CAN 2.0 + FD帧 |
| CRC校验 | 15位 | 17位(≤16字节)/ 21位(>16字节) |
| 向后兼容 | - | 可与CAN 2.0混用 |
我在一个OBD升级项目中遇到过坑:客户要求用CAN FD,但老ECU只支持CAN 2.0。结果呢?必须加网关做协议转换。所以选型时一定要确认所有节点都支持FD,否则老老实实用CAN 2.0。
3.2 报文格式:一帧数据里藏着什么?
CAN报文的结构,说白了就是一套严格的通信协议。咱们以标准数据帧为例,逐段拆解:
SOF | 11位ID | RTR | IDE | r0 | DLC | 0~8字节数据 | CRC | ACK | EOF
每个字段都有讲究:
- SOF(Start of Frame):1个显性位,告诉所有节点“我要发数据了”。
- ID(标识符):11位,决定优先级。数值越小,优先级越高。我习惯把Bootloader相关的ID设成低值,确保升级过程中不被其他报文打断。
- RTR(Remote Transmission Request):区分数据帧和远程帧。远程帧是用来请求数据的,没有数据段。
- DLC(Data Length Code):4位,表示数据长度。注意:CAN FD的DLC编码和CAN 2.0不一样,比如DLC=9在CAN 2.0里是无效的,但在CAN FD里表示12字节。
- 数据段:0~8字节(CAN 2.0)或0~64字节(CAN FD)。Bootloader升级时,这里放的就是固件分块数据。
- CRC:15位校验,CAN FD则用17或21位。我曾经因为CRC计算错误,导致ECU反复请求重传,排查了半天才发现是校验算法没对齐。
- ACK:2位,接收节点在ACK Slot位发送显性位确认。如果没人确认,发送方会重发。
我的小技巧:在Bootloader中,建议把固件分块大小设为4字节或8字节的整数倍。这样DLC字段刚好能对齐,解析起来也省事。别问我怎么知道的——踩过坑的人自然懂。
3.3 位时序与同步机制:为什么CAN能抗干扰?
这个问题很有意思。CAN总线没有时钟线,全靠节点自己同步。怎么做到的?靠的是位时序。
一个CAN位被分成四段:
- 同步段(Sync_Seg):1个Tq(时间量子),用于检测边沿。
- 传播段(Prop_Seg):补偿物理延迟,通常1~8个Tq。
- 相位缓冲段1(Phase_Seg1):用于重同步,可延长。
- 相位缓冲段2(Phase_Seg2):用于重同步,可缩短。
采样点就在Phase_Seg1和Phase_Seg2之间。我一般把采样点设在87.5%左右,这样抗干扰能力最强。为什么?因为越靠近位末端,信号越稳定。
同步机制分两种:
- 硬同步:每个帧的SOF下降沿触发,所有节点强制对齐。
- 重同步:帧内遇到边沿时,调整Phase_Seg1或Phase_Seg2的长度。说白了就是微调,让节点时钟和发送方保持一致。
我曾经踩过的坑:在一个多节点项目中,总线长度超过40米,波特率设成了1Mbps。结果呢?传播延迟太大,采样点根本采不到正确电平。后来把波特率降到500kbps,同时把Prop_Seg调到最大值,问题才解决。记住:位时序参数要根据总线长度和节点数来算,别照搬参考设计。
嗯,这里要注意:CAN FD的位时序和CAN 2.0略有不同。FD在数据段会切换到更快的速率,所以仲裁段和数据段的位时序参数是分开配置的。我习惯用工具(比如CANoe或PCAN-View)先仿真一下,确认采样点位置没问题再烧录。
3.4 实战建议:Bootloader中的CAN配置
最后给几个实在的建议:
- 波特率选500kbps:这是最通用的值,兼容性好。除非你确定所有节点都支持1Mbps,否则别冒险。
- ID分配要留余量:Bootloader用的ID和正常通信的ID分开,避免冲突。我习惯用0x7xx系列,优先级高且不常用。
- CAN FD慎用:如果老车型多,建议先做兼容性测试。有些CAN收发器不支持FD的高速模式。
- 位时序参数写死在代码里:别用自动配置,万一某个节点算错了,整个网络就崩了。
好了,CAN总线的基础就聊到这儿。下一章咱们讲Bootloader的启动流程,到时候会用到这些知识。记住:CAN不是玄学,是数学和经验的结合。多动手,多测试,你也能成为专家。