4、CAN FD协议:从经典CAN到CAN FD的进化

说实话,我刚接触CAN FD的时候,心里是有点抵触的。经典CAN用了这么多年,稳定可靠,干嘛要换?直到我在一个项目里遇到了瓶颈——那台高端SUV的OTA升级,用经典CAN要刷40分钟,客户投诉不断。嗯,从那以后,我才真正开始研究CAN FD。

这一节,我就把CAN FD和经典CAN的区别、数据场长度与速率切换、配置要点,掰开了跟你讲清楚。

4.1 CAN FD与经典CAN的核心区别

先看一张对比表,一目了然:

对比项 经典CAN (CAN 2.0) CAN FD
数据场长度 最多8字节 最多64字节
最大波特率(数据段) 1 Mbps(固定) 最高8 Mbps(可切换)
帧格式 标准帧/扩展帧 兼容经典帧 + FD帧(新增FDF标志位)
CRC校验 15位 CRC 17位/21位 CRC(根据数据场长度选择)
总线利用率 较低(受限于8字节) 高(大包传输,减少帧头开销)
向后兼容 — 同一总线可混跑经典CAN节点和CAN FD节点

你想想看,经典CAN一次最多带8个字节,传个诊断数据或者刷写固件,得拆成几十上百帧。CAN FD一帧就能塞64字节,效率直接翻倍。

我个人习惯:在网关项目中,只要MCU支持CAN FD,我优先启用。不是为了炫技,而是实测下来,OTA刷写时间能缩短60%以上。

4.2 数据场长度与速率切换

CAN FD最核心的两个特性:可变数据场长度和速率切换。这两个是绑在一起的。

4.2.1 数据场长度:从8到64的飞跃

经典CAN的数据场长度固定为0~8字节。CAN FD支持0~64字节,步长是1字节。为什么是64?我记得当时看ISO 11898-1:2015标准时,设计者考虑过更大的长度,但受限于CRC保护能力和收发器延迟,64字节是个平衡点。

实际项目中,我常用的数据场长度:

  • 诊断请求/响应:通常用8~32字节,够用
  • OTA刷写块:直接拉满64字节,减少帧数
  • 周期性信号:如果信号少,还是用8字节,没必要浪费

避坑指南:我曾经在一个项目里,把所有报文都设成64字节,结果总线负载反而高了。为什么?因为很多信号根本填不满,空字节也得传。数据场长度按需配置,别盲目拉满。

4.2.2 速率切换:仲裁段慢,数据段快

CAN FD的速率切换机制,说白了就是:仲裁段用经典速率(比如500 kbps),数据段切换到高速率(比如2 Mbps甚至5 Mbps)。

为什么会这样设计?因为仲裁段需要所有节点同步,速率不能太高,否则位采样容易出错。数据段只有发送节点在占用总线,可以跑快一点。

看这个时序图:

CAN FD帧速率切换示意图 SOF + ID 控制场 数据场(高速) CRC ACK EOF 仲裁段:500 kbps 数据段:2~5 Mbps 仲裁段:500 kbps 速率切换关键点 • BRS位(Bit Rate Switch)= 1 时,进入高速数据段 • 数据段结束后,通过ESI位切换回仲裁速率 • 收发器必须支持高速模式,否则会丢帧

实际配置时,仲裁段速率通常和经典CAN保持一致(比如500 kbps),数据段速率根据总线物理层质量来定。我见过最激进的是5 Mbps,但线束稍微差一点就出错。

注意:速率切换不是想切就切。收发器必须支持CAN FD,且数据段速率不能超过收发器的最高速率。比如TJA1044T/3只能到2 Mbps,TJA1463可以到5 Mbps。选型时看清楚。

4.3 CAN FD配置要点

配置CAN FD,不是简单地把经典CAN的代码改个宏定义就完事。我踩过的坑,列出来给你参考:

4.3.1 采样点配置

经典CAN的采样点通常设在75%~85%。CAN FD的数据段速率高了,采样点需要重新算。

我常用的经验值:

  • 仲裁段(500 kbps):采样点 80%
  • 数据段(2 Mbps):采样点 70%~75%
  • 数据段(5 Mbps):采样点 65%~70%

为什么数据段采样点要降低?因为高速下位时间变短,总线信号反射和振铃的影响更明显。采样点往后挪一点,能避开信号不稳定区。

我建议:用CANscope或者示波器抓一下实际波形,看看边沿抖动情况。别光靠理论计算,物理层差异很大。

4.3.2 收发器配置

CAN FD收发器有几个关键寄存器:

  • 速率切换使能:必须打开,否则数据段不会切高速
  • 环路延迟补偿:高速下,收发器的发送和接收延迟会影响位时序,需要补偿
  • 唤醒模式:CAN FD节点通常支持选择性唤醒,别配错了导致休眠异常

举个例子,NXP的TJA1463配置代码片段:

// TJA1463 CAN FD收发器初始化示例
void TJA1463_Init(void) {
    // 1. 进入配置模式
    WriteRegister(0x00, 0x80);  // 模式寄存器:配置模式
    
    // 2. 使能CAN FD速率切换
    WriteRegister(0x01, 0x02);  // 控制寄存器:BRS使能
    
    // 3. 设置环路延迟补偿
    WriteRegister(0x05, 0x0A);  // 补偿值:10个TQ(根据实测调整)
    
    // 4. 设置唤醒阈值
    WriteRegister(0x06, 0x03);  // 唤醒模式:仅CAN FD帧唤醒
    
    // 5. 返回正常模式
    WriteRegister(0x00, 0x00);
}

4.3.3 滤波器配置

CAN FD的ID滤波器和经典CAN基本一样,但要注意:

  • 如果总线上混跑经典CAN和CAN FD节点,滤波器要同时兼容两种帧格式
  • CAN FD帧的FDF位(第12位)可以用来区分帧类型,有些MCU支持按帧类型过滤

我遇到过一个问题:网关的CAN FD滤波器只配了标准帧ID,结果扩展帧的CAN FD报文全丢了。排查了半天才发现是滤波器掩码没覆盖到位。

4.3.4 错误处理

CAN FD的错误处理比经典CAN复杂一些:

  • CRC错误:数据场长了,CRC出错概率增加。建议开启CRC自动重传
  • 格式错误:如果总线上有经典CAN节点不认识CAN FD帧,会报格式错误。解决办法是确保所有节点都支持CAN FD,或者在网关上做协议转换
  • 位错误:高速下位错误更频繁,检查总线终端电阻和线束质量

我曾经在一个项目中,CAN FD总线频繁出现位错误。查了两天,最后发现是某个节点的DB9连接器接触不良。换了个连接器,问题消失。嗯,物理层的问题往往最隐蔽。

4.4 配置流程总结

最后,我把CAN FD的配置流程整理成一张图:

CAN FD配置流程图 1. 确定总线速率 2. 配置采样点 3. 初始化收发器 4. 配置ID滤波器 5. 验证与调试 配置要点 • 仲裁段:500 kbps • 数据段:2~5 Mbps • 采样点:仲裁80% 数据70%~75% • 收发器:支持CAN FD • 滤波器:兼容两种帧 • 验证工具:CANscope • 常见问题: - 位错误:检查线束 - CRC错误:调整速率 - 格式错误:节点兼容

配置完别急着上线。先用CANscope抓一帧看看,确认BRS位和ESI位对不对,数据段速率有没有切过去。我习惯在调试阶段把CAN FD节点的发送间隔设长一点,方便逐帧分析。

好了,CAN FD的核心内容就这些。记住一句话:CAN FD不是经典CAN的替代,而是升级。在同一个总线上,两者可以共存,但配置细节一个都不能马虎。