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 数据帧的关键位

我画了一张图,帮你把帧结构串起来:

CAN 2.0 标准数据帧结构 SOF 11位 ID 控制段 数据场 (0-8字节) CRC ACK EOF 各段说明: • SOF (Start of Frame):帧起始,同步所有节点。 • 11位 ID:决定消息优先级,数值越小优先级越高。 • 控制段:包含IDE位、DLC(数据长度码)。 • 数据场:0-8字节,Bootloader刷写时放的就是应用程序数据。 • CRC:循环冗余校验,保证数据完整性。 • ACK:应答位,接收节点拉低表示收到。 • EOF:帧结束,7个隐性位。

实战小技巧:在Bootloader的CAN驱动初始化时,我建议你把过滤器配置成只接收与刷写相关的ID。比如UDS诊断请求ID 0x7E0、响应ID 0x7E8。这样可以避免总线上的其他消息干扰刷写流程,减少CPU中断开销。

2.3 CAN网络拓扑与终端电阻

CAN总线是多主总线,所有节点都挂在两根线上——CAN_H和CAN_L。拓扑结构很简单,就是一条直线,两端各接一个终端电阻。

2.3.1 标准拓扑

我直接给你画个图:

CAN总线典型拓扑(直线型) CAN_H / CAN_L 双绞线 120Ω 120Ω ECU 1 ECU 2 ECU 3 ECU 4

2.3.2 终端电阻的作用

终端电阻为什么是120Ω?说白了,就是为了匹配传输线的特性阻抗,防止信号反射。CAN总线用的双绞线特性阻抗大约就是120Ω。两端各接一个,并联后等效电阻60Ω,这就是你用万用表在总线上量到的值。

我曾经踩过的坑:有一次在台架上调试Bootloader,发现刷写总是随机失败。排查了两天,最后拿万用表一量,总线电阻只有40Ω。原来有个同事在调试时多接了一个节点,那个节点内部也带了120Ω终端电阻。三个120Ω并联,可不就是40Ω嘛。信号反射严重,CRC错误频发。去掉多余的终端电阻后,刷写一次通过。

教训:一个CAN网络只能有两个终端电阻,且必须位于物理距离最远的两端。中间节点绝对不能使能内部终端电阻。

2.4 小结:这些基础你得刻在脑子里

  • CAN FD 是Bootloader刷写的首选,64字节数据场能显著提升刷写速度。
  • 帧结构中,ID决定优先级,DLC告诉你有多少数据,CRC保证没错。
  • 终端电阻必须且只能有两个,位置在总线两端。