第4章:CAN FD协议——从经典CAN到CAN FD的演进之路

各位工程师朋友,今天我们来聊聊CAN FD。说实话,我刚接触CAN FD时也觉得它不过是经典CAN的升级版,但真正深入项目后才发现——这其中的门道远比想象中多。我个人习惯把CAN FD看作是经典CAN的"涡轮增压版",保留了可靠性,又大幅提升了吞吐量。

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

先说说最直观的区别。经典CAN的速率上限是1Mbps,数据场最多8字节。而CAN FD呢?数据场可以到64字节,速率最高能到8Mbps甚至更高。你想想看,这意味着什么?

我在一个车载网关项目中遇到过这样的场景:用经典CAN传输一个OTA升级包,每次只能塞8个字节,来回握手、应答,效率低得让人抓狂。换成CAN FD后,一次能传64字节,整个升级时间缩短了将近60%。

具体差异我整理成了表格,方便大家对照:

特性 经典CAN CAN FD
最大数据场长度 8字节 64字节
最大波特率(数据段) 1 Mbps 8 Mbps(典型值)
帧格式 标准/扩展帧 标准/扩展帧 + FD帧
CRC算法 15位CRC 17位/21位CRC(可配置)
速率切换 不支持 支持(仲裁段/数据段不同速率)
向后兼容 - 兼容经典CAN节点

核心要点:CAN FD并不是要取代经典CAN,而是为高带宽需求场景提供了一种选择。在同一个网络中,经典CAN节点和CAN FD节点可以共存——前提是你得把速率切换机制搞对。

4.2 CAN FD帧结构的变化

嗯,这里要仔细看。CAN FD的帧结构和经典CAN相比,有几个关键变化点。

首先是控制场的变化。经典CAN的控制场只有IDE、r0、DLC这几位。CAN FD在控制场里新增了:

  • EDL位(Extended Data Length):显性表示经典CAN帧,隐性表示CAN FD帧。说白了,这就是CAN FD的"身份证"。
  • BRS位(Bit Rate Switch):隐性表示进入高速数据段,显性表示保持仲裁段速率。这个位是速率切换的开关。
  • ESI位(Error State Indicator):发送节点主动错误时为隐性,被动错误时为显性。我习惯用它来快速判断节点健康状态。

我记得第一次调试CAN FD时,就因为BRS位没配置对,导致整个网络上的经典CAN节点全部报错。后来才意识到——经典CAN节点看到BRS位是隐性时,会直接认为帧格式错误。

再来看CRC的变化。经典CAN用15位CRC,CAN FD根据数据场长度选择17位或21位CRC。为什么?因为数据场变长了,原来的CRC算法碰撞概率会上升。说白了,就是怕数据传错了还发现不了。

我的小技巧:在实际项目中,如果数据场长度不超过8字节,我建议用17位CRC;超过8字节时,强制用21位CRC。虽然多占几个位,但安全性提升明显。

4.3 CAN FD速率切换机制

这个机制是CAN FD最核心的设计之一。为什么需要速率切换?

你想想看,CAN总线是共享介质,所有节点都在同一对线上通信。如果所有段都用高速率,仲裁阶段就会出问题——因为高速率下,位时序的容差变小,多个节点同时发送时容易产生仲裁错误。

CAN FD的解决方案是:仲裁段用标准速率(通常125kbps~1Mbps),数据段切换到高速率(最高8Mbps)。具体切换流程如下:

// 速率切换时序示意
// 仲裁段:标准速率(如500kbps)
// 数据段:高速率(如2Mbps)

帧起始 → 仲裁场 → 控制场(EDL=1, BRS=1) → 切换点 → 数据场(高速) → CRC场(高速) → 切换点 → ACK场(标准速率) → 帧结束

这里有个关键点:切换点必须在BRS位之后,且在CRC分隔符之前切回标准速率。我曾经见过一个案例,某供应商的CAN FD控制器在CRC场末尾才切回标准速率,结果ACK位采样出错,整个帧被重传了3次才成功。

避坑指南:我曾经在测试中发现,有些CAN FD收发器在速率切换瞬间会产生毛刺。解决方案是在BRS位前后各加一个"过渡位"(即保持原速率多一个位时间),让收发器有足够时间锁相环重新锁定。这个细节在ISO 11898-2:2016中有明确要求。

4.4 CAN FD一致性测试要点

做CAN FD一致性测试,我建议重点关注以下几个方面:

  1. 速率切换时序测试
    • 测量BRS位到数据段第一个位的切换时间
    • 测量数据段最后一个位到ACK位的切换时间
    • 切换时间容差:±2个位时间(以数据段位时间计)
  2. CRC算法验证
    • 17位CRC:多项式0x3C86,初始值0x0000
    • 21位CRC:多项式0x102899,初始值0x000000
    • 需要验证CRC计算是否正确,尤其是数据场长度变化时
  3. 位填充规则
    • 经典CAN:每5个相同位插入一个相反位
    • CAN FD:数据段采用"固定位填充"(每4个相同位插入一个相反位)
    • 这个变化很多人会忽略,但测试时一定要覆盖
  4. 错误处理机制
    • 格式错误:EDL位、BRS位、ESI位组合错误时的响应
    • CRC错误:数据场长度与CRC类型不匹配时的处理
    • 位错误:高速数据段发生位错误时的重传机制

测试经验分享:我建议用CANoe或PCAN-USB FD这类工具做自动化测试。手动测试太容易漏掉边界条件了。比如数据场长度为0、1、8、9、64这些边界值,每个都要单独测一遍CRC和位填充。

最后说一句,CAN FD的测试不能只盯着协议层。物理层的信号质量也很关键——高速率下,总线终端电阻、线缆长度、分支长度都会影响信号完整性。我习惯在测试前先用示波器抓一下CAN FD数据段的眼图,确保眼宽和眼高都满足要求再开始协议测试。

好了,这一章的内容就到这里。下一章我们会深入CAN FD的物理层设计,聊聊那些容易踩坑的细节。