1. CAN FD 协议基础与硬件环境搭建
各位同学,咱们开始第一讲。做嵌入式这么多年,CAN 总线我接触得最早的是 CAN 2.0,后来项目里数据量越来越大,CAN FD 就慢慢成了主流。说实话,我第一次接触 CAN FD 时也有点懵——这玩意儿跟传统 CAN 到底差在哪?别急,咱们一步步拆开看。
1.1 CAN 2.0 与 CAN FD 的区别
先看一张对比表,心里有个底:
| 对比项 | CAN 2.0 | CAN FD |
|---|---|---|
| 最大数据长度 | 8 字节 | 64 字节 |
| 数据段速率 | 固定(与仲裁段相同) | 可切换高速率(最高 8 Mbps+) |
| 帧格式 | 标准帧 / 扩展帧 | 兼容 CAN 2.0 + FD 特有格式 |
| CRC 校验 | 15 位 CRC | 17/21 位 CRC(更强纠错) |
| 向后兼容 | — | 可与 CAN 2.0 节点共存 |
说白了,CAN FD 就是在 CAN 2.0 的骨架上做了两件事:数据段提速和数据长度翻倍。我有个项目是做车载电池包监控,传统 CAN 一帧只能传 8 字节,电压、温度、电流分好几帧发,总线负载高得吓人。换成 CAN FD 后,一帧搞定,爽快多了。
1.2 CAN FD 帧结构
CAN FD 的帧结构跟 CAN 2.0 很像,但多了几个关键位。咱们以数据帧为例:
- SOF(帧起始):1 个显性位,同步用。
- 仲裁段:ID + RTR + IDE + 扩展 ID(如果有)。注意,CAN FD 里 RTR 位被替换为 EDL 位,用来标识这是 FD 帧还是传统帧。
- 控制段:包含 DLC(数据长度码)和 BRS 位(波特率切换标志)。BRS = 1 时,数据段切换到高速率。
- 数据段:0~64 字节,速率可以比仲裁段快好几倍。
- CRC 段:17 位或 21 位 CRC,覆盖范围更大。
- ACK 段:应答位,跟 CAN 2.0 一样。
- EOF(帧结束):7 个隐性位。
关键点:EDL 位和 BRS 位是 CAN FD 的“身份证”。EDL = 1 表示这是 FD 帧,BRS = 1 表示数据段要提速。这两个位如果解析错了,整个帧就废了。
1.3 数据段速率提升原理
为什么会这样?传统 CAN 的整个帧都用同一个波特率,因为仲裁段需要所有节点同步,速率不能太高(一般 1 Mbps 封顶)。CAN FD 聪明在哪?它把帧分成两段:
- 仲裁段:用标准速率(比如 500 kbps),保证所有节点都能参与仲裁。
- 数据段:BRS 位之后,切换到高速率(比如 2 Mbps、5 Mbps),只传数据。
我刚开始做 CAN FD 驱动时,踩过一个坑:数据段速率设得太高,导致信号反射严重,误码率飙升。后来加了终端电阻匹配,才稳定下来。嗯,这里要注意——速率越高,对硬件布线的要求也越高。
个人经验:数据段速率建议从 2 Mbps 起步,先跑通再往上提。别一上来就怼 8 Mbps,除非你的 PCB 走线跟教科书一样标准。
1.4 STM32H7 系列 FDCAN 外设简介
STM32H7 系列集成了 FDCAN 外设,这是 Bosch 的 M_CAN 内核的变体。说白了,它就是专门为 CAN FD 设计的硬件模块。咱们看看它的核心特性:
| 特性 | 说明 |
|---|---|
| 支持 CAN 2.0 和 CAN FD | 可配置为经典 CAN 或 FD 模式 |
| 双时钟域 | 仲裁段时钟 + 数据段时钟,独立配置 |
| 64 字节专用 RAM | 每个 FDCAN 实例有独立的消息 RAM |
| 硬件时间戳 | 基于 16 位定时器,精度高 |
| 自动重传 | 发送失败自动重试,省 CPU 资源 |
我个人习惯用 FDCAN1 和 FDCAN2 两个实例,一个做主节点,一个做监听。调试时特别方便,一个发数据,另一个抓包分析。
1.5 开发板与调试器连接
咱们课程用的是 STM32H743 开发板 + J-Link 调试器。连接方式很简单:
- J-Link 的 SWD 接口接到开发板的 SWD 排针(SWDIO、SWCLK、GND、VCC)。
- CAN FD 收发器(比如 TJA1044)接到 FDCAN 的 TX/RX 引脚。
- 收发器的 CANH/CANL 接到 CAN 总线。
- 总线两端各加一个 120 Ω 终端电阻。
注意:CAN FD 对终端电阻很敏感。我遇到过好几次,因为忘记接终端电阻,导致通信时好时坏。别问我怎么知道的……
下面这张图展示了咱们的硬件连接结构:
连接好之后,用 J-Link 的调试软件确认一下 SWD 能识别到芯片。如果识别不到,先检查接线,再查供电。我有个习惯——先量电压,再查信号,能省一半的排查时间。
小技巧:调试 CAN FD 时,建议先用 CAN 2.0 模式跑通基本通信,再切到 FD 模式。这样能快速定位问题是出在硬件连接还是协议配置上。
好了,这一章的基础知识就到这。记住:CAN FD 不是颠覆性的新技术,它是在 CAN 2.0 基础上做了“数据段提速”和“数据长度扩展”两个优化。理解了这个核心,后面的驱动开发就好办了。