2. CAN总线基础回顾:CAN 2.0与CAN FD的区别、CAN报文帧结构、CAN网络拓扑与终端电阻
做Bootloader开发,CAN总线是绕不开的基础。你想想看,刷写升级全靠它来传输数据。如果CAN总线的基本概念没吃透,后面写代码、调bug会非常痛苦。这一节,我带你快速过一遍CAN的核心知识点,重点放在CAN 2.0和CAN FD的区别上,这是目前项目中最常见的两个版本。
2.1 CAN 2.0与CAN FD:到底差在哪?
很多刚入行的朋友问我:“老师,CAN FD是不是就是速度更快的CAN?”
嗯,这么说对了一半。CAN FD(CAN with Flexible Data-Rate)确实更快,但它最大的改进其实是数据场长度和灵活性。
我直接给你列个对比表,一目了然:
| 对比项 | CAN 2.0(经典CAN) | CAN FD |
|---|---|---|
| 最大数据场长度 | 8字节 | 64字节 |
| 最大传输速率(数据段) | 1 Mbps | 最高 8 Mbps(典型 2-5 Mbps) |
| 帧格式 | 标准帧/扩展帧 | 兼容CAN 2.0,新增FDF标志位 |
| CRC校验 | 15位 CRC | 17位/21位 CRC(更强纠错) |
| 总线利用率 | 较低(8字节限制) | 高(单帧可传64字节) |
| 向后兼容 | — | 可与CAN 2.0节点共存于同一总线 |
核心差异一句话总结:CAN FD在仲裁段保持与CAN 2.0相同的速率和协议,但在数据段可以切换到更高速度,并且单帧能携带最多64字节数据。这对Bootloader刷写来说,意味着单次传输的数据量翻了8倍,刷写时间大幅缩短。
我在一个量产项目中遇到过这样的情况:用CAN 2.0刷写一个256KB的应用程序,每帧8字节,加上协议开销,耗时接近3分钟。后来切换到CAN FD,同样条件下,刷写时间直接压缩到40秒以内。你想想看,产线上每台车省下2分钟,一天能多刷多少台?
2.2 CAN报文帧结构:你得看懂这几位
不管CAN 2.0还是CAN FD,报文帧的基本骨架是类似的。我习惯把帧结构拆成几个关键段来讲,这样好记。
2.2.1 标准帧 vs 扩展帧
区别就在ID长度上:
- 标准帧:11位ID,帧头更短,适合节点较少的网络。
- 扩展帧:29位ID,帧头更长,适合多节点、多消息的复杂网络。
我个人习惯在Bootloader项目中优先使用扩展帧。为什么?因为刷写过程中需要区分大量不同的诊断消息(请求、响应、流控、数据),29位ID能提供更灵活的过滤和优先级分配。
2.2.2 数据帧的关键位
我画了一张图,帮你把帧结构串起来:
实战小技巧:在Bootloader的CAN驱动初始化时,我建议你把过滤器配置成只接收与刷写相关的ID。比如UDS诊断请求ID 0x7E0、响应ID 0x7E8。这样可以避免总线上的其他消息干扰刷写流程,减少CPU中断开销。
2.3 CAN网络拓扑与终端电阻
CAN总线是多主总线,所有节点都挂在两根线上——CAN_H和CAN_L。拓扑结构很简单,就是一条直线,两端各接一个终端电阻。
2.3.1 标准拓扑
我直接给你画个图:
2.3.2 终端电阻的作用
终端电阻为什么是120Ω?说白了,就是为了匹配传输线的特性阻抗,防止信号反射。CAN总线用的双绞线特性阻抗大约就是120Ω。两端各接一个,并联后等效电阻60Ω,这就是你用万用表在总线上量到的值。
我曾经踩过的坑:有一次在台架上调试Bootloader,发现刷写总是随机失败。排查了两天,最后拿万用表一量,总线电阻只有40Ω。原来有个同事在调试时多接了一个节点,那个节点内部也带了120Ω终端电阻。三个120Ω并联,可不就是40Ω嘛。信号反射严重,CRC错误频发。去掉多余的终端电阻后,刷写一次通过。
教训:一个CAN网络只能有两个终端电阻,且必须位于物理距离最远的两端。中间节点绝对不能使能内部终端电阻。
2.4 小结:这些基础你得刻在脑子里
- CAN FD 是Bootloader刷写的首选,64字节数据场能显著提升刷写速度。
- 帧结构中,ID决定优先级,DLC告诉你有多少数据,CRC保证没错。
- 终端电阻必须且只能有两个,位置在总线两端。