1、CAN FD 通信基础:协议简介、数据帧结构与位定时

1.1 CAN FD 协议简介

各位好,我是老张。咱们开门见山,先聊聊 CAN FD 是个什么东西。

CAN FD,全称 CAN with Flexible Data-Rate,说白了就是传统 CAN 的升级版。传统 CAN 在汽车电子里用了三十多年,稳定是稳定,但速度和新能车的数据量实在跟不上了。我手头一个项目,原来用 CAN 2.0,后来发现几个域控制器一交互,总线利用率经常飙到 70% 以上——再往上加节点就报警了。

CAN FD 主要解决了两个痛点:

  • 数据长度翻倍:传统 CAN 一帧最多 8 字节,CAN FD 可以到 64 字节。你想想看,原来要发 8 帧的数据,现在 1 帧搞定,总线负载瞬间降下来。
  • 速率分段提升:仲裁段保持 500 kbps 或 1 Mbps 不变,数据段可以切换到 2 Mbps、5 Mbps 甚至更高。说白了就是:争抢总线的时候我们慢点走,一旦拿到发送权,立马加速把数据倒进去。
CAN FD 通信基础核心结构 传统 CAN 2.0 数据场:≤ 8 字节 速率:≤ 1 Mbps 升级 CAN FD 数据场:≤ 64 字节 数据段速率:2-8 Mbps 核心技术 数据帧结构 位定时与同步 关键差异:CAN FD 向后兼容传统 CAN,硬件升级后可直接使用 数据段高速率是 EMI 挑战加大的根本原因 数据帧结构 远程帧 错误帧 过载帧 帧类型:本章重点讨论数据帧

好,协议层面说完了。但大家注意,数据段速率上去了,EMI 问题也随之而来。我这些年做过的 CAN FD 整改案例,差不多 80% 的 EMI 超标都跟数据段高速率直接相关。这也是为什么咱们把共模扼流圈放在 CAN FD 课程里讲——速率高了,共模电流的增长非常明显。

1.2 数据帧结构

嗯,这里咱们要细说数据帧。CAN FD 的数据帧和传统 CAN 的主要区别在于控制场和 CRC 场,其他部分大体相似。我建议你先记住下面这张表:

帧段 传统 CAN CAN FD
帧起始(SOF) 1 位显性 1 位显性
仲裁场 11/29 位 ID + RTR 11/29 位 ID + RRS(代替 RTR)
控制场 IDE + r0 + DLC(4 位) IDE + EDL + BRS + ESI + DLC(4 位)
数据场 0-8 字节 0-64 字节
CRC 场 15 位 CRC + 1 位界定符 17/21 位 CRC + 填充位计数器 + 界定符
ACK 场 1 位 + 1 位界定符 1 位 + 1 位界定符
帧结束(EOF) 7 位隐性 7 位隐性

关键差异在哪?我重点说三个:

  1. EDL 位:这是 CAN FD 的标志。EDL = 隐性,代表当前是 CAN FD 帧;显性则是传统 CAN 帧。所以 CAN FD 控制器收到一帧时,先看 EDL 位判断格式。
  2. BRS 位:这就是速率切换开关。BRS 为隐性时,从该位之后切换到高速率数据段;显性则全程用仲裁段速率。我个人习惯在设计时默认 BRS = 1,除非总线拓扑特别长或终端节点特别多。
  3. CRC 增强:数据场最大 64 字节,原来 15 位 CRC 扛不住了。CAN FD 用了 17 位(数据场 ≤ 16 字节)或 21 位(数据场 > 16 字节),还加了填充位计数器。我在一个项目中遇到过数据场 48 字节时 CRC 校验强度不够导致的偶发错误帧,后来换用 21 位 CRC 就完全消除了。
重点提醒:CAN FD 帧的填充位规则与传统 CAN 一样——连续 5 个相同电平后插入一个反相填充位。但由于数据段速率更高,同样的填充位数量在高频下会产生更大的共模电流。这也是为什么共模扼流圈在 CAN FD 上效果比传统 CAN 更明显。

1.3 位定时与同步

好,来到位定时了。这部分很多新人觉得抽象,其实说白了就是:怎么在一个约定的时间窗口里,准确地把每个 bit 读出来。

CAN FD(包括传统 CAN)的每一位被分成四个段:

  • 同步段:每个 bit 的起点,用于总线同步。通常固定为 1 个时间量子(Tq)。
  • 传播段:补偿物理介质中的传播延迟。我一般按 2-3 Tq 起步,总线长度每增加 10 米,我建议多加点余量。
  • 相位缓冲段 1:用于重同步时的位调整。采样点就在这个段和下一个段之间。
  • 相位缓冲段 2:采样点之后的缓冲段。

为什么要分段?因为 CAN 总线是事件触发的,没有主时钟同步。每个节点靠每个 bit 的隐性到显性跳变来对齐自己的时钟。你想想看,如果两个节点的时钟频率差 100 ppm,跑 1 Mbps 时每 10000 个 bit 就会累积 1 个 bit 的偏差。同步段和相位缓冲段就是用来吃掉这个偏差的。

项目经验:我在一个新能车 BMS 项目中,CAN FD 跑 500 kbps/2 Mbps,一开始采样点设在 75% 位置。结果总线负载上到 60% 时偶发错误帧。后来排查发现是线束太长导致信号边沿变缓,采样点需要提前。我把采样点调到 70% 后,问题消失。所以我的建议是:采样点设在 70%-80% 之间,先按 75% 起步,实测再微调。

同步规则也很重要:

  1. 硬同步:只在帧起始发生时触发,每个节点把当前 bit 的同步段对齐到该跳变沿。
  2. 重同步:在帧内每次隐性到显性跳变时触发,调整相位缓冲段 1 和 2 的长度来匹配接收边沿。

这里有个坑:CAN FD 的数据段速率跳变前后,BRS 位前后各有一段固定的长度用于重新同步。如果位定时配置不合理,高速段的首个 bit 可能采样错误。我曾经遇到一个客户,CAN FD 在数据段第一个 bit 总是出错,查了两天才发现是相位缓冲段 2 设得太短,没有给重同步留够余量。

避坑指南:配置位定时时,建议按最差情况设计——晶振误差 ±0.5%、线束延迟 25 ns/m、总线上 10 个节点以上。这样计算出来的 Tq 数和段长度才能确保在量产时不出问题。不要用理想条件去算,否则批次一致性会给你惊喜。

最后提一句,位定时与总线 EMI 也有关系。采样点越靠后,bit 后半段的信号质量对 EMI 越敏感。如果共模扼流圈的插入损耗在数据段频率附近不够高,采样点附近的共模噪声可能直接影响位判决。这部分我们在后面章节会详讨论。