2. 标定基础概念

各位好,我是老周。今天咱们聊点硬核的——CAN 2.0 和 CAN FD 到底差在哪?

说实话,我入行那会儿还在跟 CAN 2.0 死磕。后来 CAN FD 出来,第一反应是「又来个新协议,学不动了」。但真正用上之后,嗯,真香。尤其是做标定的时候,数据量一大,CAN FD 的优势就全出来了。

CAN 2.0 vs CAN FD:不只是「更快」那么简单

很多人以为 CAN FD 就是 CAN 2.0 的「加速版」。其实没那么简单。我列个表,你一看就明白。

对比项 CAN 2.0(经典 CAN) CAN FD(灵活数据速率)
最大数据场长度 8 字节 64 字节
波特率(数据段) 固定(如 500 kbps) 可切换(最高 8 Mbps)
帧格式 标准帧 / 扩展帧 兼容 CAN 2.0,新增 FDF 标志位
CRC 校验 15 位 / 17 位 17 位 / 21 位(更安全)
向后兼容 — 同一总线可混用(需谨慎)

核心差异一句话:CAN FD 在仲裁段用经典波特率保证兼容,在数据段切到高速率,同时把数据包从 8 字节撑到 64 字节。标定场景下,一次能塞进一整条 MAP 数据。

波特率切换:到底怎么「切」的?

这个点我当年也迷糊过。CAN FD 的波特率切换,不是你想切就切,它有一套严格的时序。

看帧结构就清楚了:

  • 仲裁段:用标准波特率(比如 500 kbps),保证所有节点都能参与总线仲裁。
  • BRS 位(波特率切换标志):发送方把这一位置为隐性,告诉总线「我要加速了」。
  • 数据段:切换到高速率(比如 2 Mbps 甚至更高),快速把 64 字节甩出去。
  • CRC 段 + ACK 段:切回标准速率,确保接收方能正确应答。

为什么会这样设计?你想想看,如果全程跑高速,老节点根本听不懂。仲裁段用低速,是为了让所有节点都能参与「谁先说话」的竞争。数据段切高速,是为了抢时间。

我个人的习惯:做标定工具链配置时,数据段波特率不要一上来就拉满。先跑 1 Mbps 试试,稳定了再往上提。我曾经在某个项目里直接设 5 Mbps,结果总线上一堆错误帧,排查了两天才发现是线束阻抗不匹配。

数据场长度:8 字节到 64 字节的「质变」

CAN 2.0 的 8 字节限制,做标定的人应该深有体会。传一个标定参数还好,传一张 2D 表格就得拆成十几帧,还得自己拼数据、管序号。烦不烦?烦。

CAN FD 直接把数据场撑到 64 字节。这意味着什么?

  • 一次传输可以塞下 8 个 float 或 16 个 int16。
  • 标定过程中,刷写一个 256 字节的 MAP 只需要 4 帧(原来要 32 帧)。
  • 总线负载率直线下降,留给其他信号的空间就大了。

但注意,64 字节不是白给的。数据场越长,CRC 校验就越重要。CAN FD 用了 17 位或 21 位 CRC,比经典 CAN 的 15 位更可靠。我见过有人图省事,把 64 字节塞满但 CRC 配置不对,结果总线上一堆 CRC 错误,数据全废了。

避坑指南:我曾经在一个项目中,ECU 和标定工具都支持 CAN FD,但工具链的 DBC 文件里数据场长度配的是 8 字节。结果工具发出来的帧全是 CAN 2.0 格式,ECU 根本不认。排查了半天,最后发现是 DBC 里没加「FD=1」的属性。记住:DBC 文件必须显式声明 CAN FD 使能。

网络拓扑与终端电阻:别小看这根「线」

CAN 网络拓扑,说白了就是一条差分总线,所有节点挂上去。但挂的方式有讲究。

常见的拓扑就两种:

  • 直线型(主干-分支):主干线两端各一个 120 Ω 终端电阻,分支尽量短(< 0.3 m)。这是最推荐的做法。
  • 星型:所有节点汇聚到一个点。这种拓扑在 CAN FD 下很容易出问题,因为分支过长会导致信号反射。

终端电阻为什么是 120 Ω?因为 CAN 总线是差分对,特性阻抗大约 120 Ω。两端各接一个,并联后就是 60 Ω,刚好匹配总线阻抗。少了它,信号会在末端反射,波形畸变,通信就崩了。

我遇到过最离谱的事:某供应商的 ECU 内部集成了 120 Ω 电阻,但没在手册里写。我们又在总线两端各加了一个,结果等效阻抗变成 40 Ω,CAN 信号幅值直接掉了一半。嗯,从那以后我养成了习惯——先拿万用表量一下 CAN_H 和 CAN_L 之间的电阻,确认总线阻抗在 60 Ω 左右。

一张图看懂本章知识体系

下面这张 SVG 图,把 CAN 2.0 和 CAN FD 的核心差异、波特率切换逻辑、以及网络拓扑的关键点串起来了。建议你保存下来,做标定配置时对照着看。

CAN 2.0 vs CAN FD 知识结构图 CAN 协议进阶:核心知识结构 CAN 2.0 经典 CAN FD 进阶 网络拓扑 数据场:8 字节 波特率:固定 CRC:15 位 帧格式:标准/扩展 适用:小数据量信号 数据场:64 字节 波特率切换:BRS 位 CRC:17/21 位 向后兼容 CAN 2.0 适用:标定/刷写大数据 直线型拓扑(推荐) 终端电阻:120 Ω × 2 分支长度 < 0.3 m 星型拓扑慎用(FD) 万用表测总线阻抗 演进 依赖 标定工具链实战要点:DBC 需显式声明 FD 使能,数据段波特率从 1 Mbps 起步,终端电阻先测后配 CAN FD 不是万能药,线束质量和节点兼容性决定成败

实战中容易踩的坑

最后,我把自己这些年踩过的坑总结一下,你遇到了能少走弯路。

  1. DBC 文件没配 FD 属性:工具链发出来的还是 CAN 2.0 帧,ECU 不认。检查 DBC 里有没有 FD=1 或 CANFD=true。
  2. 终端电阻重复或缺失:用万用表量 CAN_H 和 CAN_L 之间的电阻,正常应在 60 Ω 左右。如果接近 120 Ω,说明少了一个;如果接近 40 Ω,说明多了。
  3. 数据段波特率设太高:线束质量不好时,高速率下信号畸变严重。我建议从 1 Mbps 开始,稳定后再往上调。
  4. 64 字节塞满但 CRC 没跟上:CAN FD 的 CRC 长度跟数据场长度有关,配置工具时要选对 CRC 算法(17 位或 21 位)。
  5. 分支线太长:CAN FD 对分支长度更敏感,超过 0.3 m 就可能出现反射。实在避不开,用中继器或 CAN 集线器。

一个小技巧:做标定前,先用 CANape 或 INCA 的「Bus Statistics」功能看一下总线错误帧计数。如果错误帧率超过 1%,先别急着调参数,回头检查物理层——大概率是终端电阻或线束的问题。