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 甚至更高。说白了就是:争抢总线的时候我们慢点走,一旦拿到发送权,立马加速把数据倒进去。
好,协议层面说完了。但大家注意,数据段速率上去了,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 位隐性 |
关键差异在哪?我重点说三个:
- EDL 位:这是 CAN FD 的标志。EDL = 隐性,代表当前是 CAN FD 帧;显性则是传统 CAN 帧。所以 CAN FD 控制器收到一帧时,先看 EDL 位判断格式。
- BRS 位:这就是速率切换开关。BRS 为隐性时,从该位之后切换到高速率数据段;显性则全程用仲裁段速率。我个人习惯在设计时默认 BRS = 1,除非总线拓扑特别长或终端节点特别多。
- CRC 增强:数据场最大 64 字节,原来 15 位 CRC 扛不住了。CAN FD 用了 17 位(数据场 ≤ 16 字节)或 21 位(数据场 > 16 字节),还加了填充位计数器。我在一个项目中遇到过数据场 48 字节时 CRC 校验强度不够导致的偶发错误帧,后来换用 21 位 CRC 就完全消除了。
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 的偏差。同步段和相位缓冲段就是用来吃掉这个偏差的。
同步规则也很重要:
- 硬同步:只在帧起始发生时触发,每个节点把当前 bit 的同步段对齐到该跳变沿。
- 重同步:在帧内每次隐性到显性跳变时触发,调整相位缓冲段 1 和 2 的长度来匹配接收边沿。
这里有个坑:CAN FD 的数据段速率跳变前后,BRS 位前后各有一段固定的长度用于重新同步。如果位定时配置不合理,高速段的首个 bit 可能采样错误。我曾经遇到一个客户,CAN FD 在数据段第一个 bit 总是出错,查了两天才发现是相位缓冲段 2 设得太短,没有给重同步留够余量。
最后提一句,位定时与总线 EMI 也有关系。采样点越靠后,bit 后半段的信号质量对 EMI 越敏感。如果共模扼流圈的插入损耗在数据段频率附近不够高,采样点附近的共模噪声可能直接影响位判决。这部分我们在后面章节会详讨论。