2、CAN FD诞生背景:传统CAN带宽瓶颈(1Mbps)、大数据时代的需求(OTA升级、ADAS传感器数据)、博世与汽车厂商的联合推动

2.1 传统CAN的带宽天花板

说实话,我在2015年刚接触CAN FD时,第一反应是:「1Mbps还不够用?」

后来被打脸了。

经典CAN协议,最高速率就是1Mbps。注意,这是理论值。实际项目中,考虑到线缆长度、节点数量、EMC等因素,大多数车厂只敢跑到500kbps,甚至250kbps。我做过一个商用车项目,总线长度超过40米,最后只能降到125kbps才能稳定通信。

为什么会这样?

经典CAN的仲裁机制决定了它的带宽上限。CAN总线采用CSMA/CA+逐位仲裁,每个位都需要足够的时间让所有节点同步采样。位时间一短,同步窗口就窄,总线长度就得缩短。这是个物理层面的硬约束。

核心矛盾:1Mbps的带宽,在2010年前够用。但到了2015年之后,车载数据量翻了不止10倍。

2.2 大数据时代,谁在吃掉带宽?

我列几个真实场景,你感受一下:

  • OTA升级:一个ECU的固件包,少则几MB,多则上百MB。用经典CAN传?以500kbps算,传1MB需要16秒。整车几十个ECU升级一遍,车主得在车里等半小时。这体验,你想想看。
  • ADAS传感器数据:摄像头、毫米波雷达、激光雷达。一个高清摄像头每秒产生几十MB的原始数据。虽然大部分在域控制器内部处理,但标定数据、诊断数据、配置参数,动不动就是几KB到几MB。经典CAN的8字节数据场,传一个标定参数要拆成几十帧,效率极低。
  • 车载以太网过渡期:很多车厂在2018-2022年间,并没有全面铺开车载以太网。CAN FD成了「性价比最高的升级方案」——不改线束、不改物理层,只换控制器和软件,带宽就能翻4-8倍。

我个人习惯:判断一个项目是否需要CAN FD,就看两点——单帧数据是否超过8字节?总线负载率是否超过40%?如果两个都中,赶紧上CAN FD。

2.3 博世与车厂的联合推动

CAN FD不是某家公司拍脑袋想出来的。

2011年,博世开始着手研究CAN的升级方案。当时有几个方向:

  • 直接上车载以太网?成本高,生态不成熟。
  • 改CAN物理层?兼容性差,车厂不接受。
  • 在CAN框架内做优化?嗯,这个靠谱。

博世的做法很聪明:保留经典CAN的物理层和仲裁机制,只改数据段。这样,现有的CAN收发器、线束、连接器基本不用动。车厂只需要升级控制器和软件。

我记得2012年,博世联合了宝马、大众、戴姆勒等几家大厂,开始制定CAN FD规范。宝马是最积极的,因为他们的高端车型已经开始出现带宽瓶颈。2015年,CAN FD规范正式发布(ISO 11898-1:2015)。

我曾经踩过一个坑:早期CAN FD控制器和经典CAN控制器混用,如果配置不当,CAN FD节点发送的「快速帧」会被经典CAN节点误判为错误帧。后来加了「CAN FD使能位」和「EDL位」才解决。嗯,兼容性设计从来不是小事。

2.4 CAN FD到底带来了什么?

说白了,CAN FD就两个核心改进:

特性 经典CAN CAN FD 提升幅度
数据场长度 8字节 64字节 8倍
数据段速率 最高1Mbps 最高8Mbps(实际常用2-5Mbps) 2-8倍
有效数据吞吐量 约400kbps(1Mbps总线,负载50%) 约3.2Mbps(5Mbps数据段,负载50%) 约8倍

注意,数据段速率和仲裁段速率是分开的。仲裁段仍然用经典CAN的速率(保证兼容性),数据段可以切换到高速模式。这个设计,我个人觉得非常巧妙——既保留了CAN的确定性,又突破了带宽瓶颈。

2.5 一个真实的项目案例

2017年,我参与了一个L2级ADAS项目。域控制器需要从三个摄像头接收标定数据,每个摄像头每次标定产生约4KB的数据。

用经典CAN传:

  • 每帧8字节,4KB需要512帧
  • 每帧加上开销约130位,总位数为512 × 130 = 66560位
  • 以500kbps算,耗时约133ms
  • 三个摄像头轮流传,总共约400ms

用CAN FD传:

  • 每帧64字节,4KB只需要64帧
  • 数据段用4Mbps,仲裁段用500kbps
  • 总耗时约30ms
  • 三个摄像头总共约90ms

你看,差距是4倍以上。而且这还是纯数据量对比。实际项目中,CAN FD还能减少总线负载率,降低延迟抖动。对于ADAS这种实时性要求高的系统,这个提升是质的飞跃。

总结一下:CAN FD的诞生,本质上是「摩尔定律在车载网络上的映射」。数据量在涨,带宽就得跟着涨。博世和车厂的选择,是在不颠覆现有生态的前提下,做了一次「优雅的升级」。

下一章,我会详细讲CAN FD的帧结构——那个「BRS位」和「ESI位」到底怎么用?为什么数据段可以跑那么快?嗯,到时候见。