嵌入式开发笔记:CAN与CAN FD完全指南------从帧格式差异到MCU选型实战
文章目录
- [嵌入式开发笔记:CAN与CAN FD完全指南------从帧格式差异到MCU选型实战](#嵌入式开发笔记:CAN与CAN FD完全指南——从帧格式差异到MCU选型实战)
-
- [1. 前言:为什么需要CAN FD](#1. 前言:为什么需要CAN FD)
- [2. CAN数据帧格式回顾](#2. CAN数据帧格式回顾)
- [3. CAN FD帧格式详解------与传统CAN的核心差异](#3. CAN FD帧格式详解——与传统CAN的核心差异)
-
- [3.1 帧格式总览对比](#3.1 帧格式总览对比)
- [3.2 控制位升级:FDF、BRS、ESI三大新位](#3.2 控制位升级:FDF、BRS、ESI三大新位)
-
- [(1)FDF位(Flexible Data Format)------帧类型标识](#(1)FDF位(Flexible Data Format)——帧类型标识)
- [(2)BRS位(Bit Rate Switch)------双速率切换](#(2)BRS位(Bit Rate Switch)——双速率切换)
- [(3)ESI位(Error State Indicator)------错误状态指示](#(3)ESI位(Error State Indicator)——错误状态指示)
- (4)RRS位替换RTR位------取消远程帧
- [3.3 DLC编码:从线性到非线性](#3.3 DLC编码:从线性到非线性)
- [3.4 CRC校验:从15位到17/21位](#3.4 CRC校验:从15位到17/21位)
- [3.5 帧格式差异总结表](#3.5 帧格式差异总结表)
- [4. 兼容性与混合通信](#4. 兼容性与混合通信)
-
- [4.1 传统CAN控制器无法识别CAN FD帧](#4.1 传统CAN控制器无法识别CAN FD帧)
- [4.2 向下兼容:CAN FD控制器可以处理传统CAN帧](#4.2 向下兼容:CAN FD控制器可以处理传统CAN帧)
- [4.3 STM32的混合模式支持](#4.3 STM32的混合模式支持)
- [5. 主流MCU对CAN FD的支持情况](#5. 主流MCU对CAN FD的支持情况)
-
- [5.1 STM32系列支持概况](#5.1 STM32系列支持概况)
- [5.2 STM32G4系列详解](#5.2 STM32G4系列详解)
- [5.3 STM32H7系列详解](#5.3 STM32H7系列详解)
- [5.4 其他厂商支持情况](#5.4 其他厂商支持情况)
- [6. 性能提升的实际意义](#6. 性能提升的实际意义)
-
- [6.1 带宽效率](#6.1 带宽效率)
- [6.2 OTA升级效率](#6.2 OTA升级效率)
- [6.3 可靠性增强](#6.3 可靠性增强)
- [7. CAN FD配置要点(STM32 HAL库)](#7. CAN FD配置要点(STM32 HAL库))
-
- [7.1 CubeMX中的关键配置](#7.1 CubeMX中的关键配置)
- [7.2 兼容经典CAN的配置](#7.2 兼容经典CAN的配置)
- [7.3 ISO vs NON-ISO模式](#7.3 ISO vs NON-ISO模式)
- [8. 选型决策树](#8. 选型决策树)
- [9. 常见问题与避坑指南](#9. 常见问题与避坑指南)
- [10. 总结](#10. 总结)
1. 前言:为什么需要CAN FD
CAN总线自1986年由博世推出以来,凭借其卓越的可靠性和实时性,成为汽车电子和工业控制领域的事实标准。然而,随着汽车电子、工业自动化的蓬勃发展,CAN总线上的设备数量和数据量都大大增加,传统CAN总线在传输速率和带宽方面越来越力不从心。
以电动汽车为例,ADAS(高级驾驶辅助系统)、车载信息娱乐系统、OTA升级等场景对数据吞吐量提出了更高的要求。传统CAN的1Mbps最高速率 和8字节最大数据负载已经成为瓶颈。
CAN FD(CAN with Flexible Data-Rate) 应运而生,由ISO 11898-1:2015标准正式定义。它在保持CAN核心优势的同时,实现了三大突破:

| 突破 | 说明 |
|---|---|
| 双速率模式 | 仲裁段保持1Mbps,数据段最高可达8Mbps |
| 数据扩容 | 单帧最大支持64字节数据 |
| 增强校验 | 采用17/21位CRC算法,降低未检测错误的风险 |
本文将从帧格式层面深入剖析CAN与CAN FD的核心差异,并详细讨论STM32G4、H7等主流MCU对CAN FD的支持情况。
2. CAN数据帧格式回顾
在深入CAN FD之前,先快速回顾传统CAN的数据帧结构。
CAN总线上传输的信息称为报文(Message) ,通过以下5种类型的帧进行通信:
- 数据帧:携带数据从发送节点到接收节点
- 遥控帧:请求其他节点发送数据
- 错误帧:检测到错误时发送
- 过载帧:通知接收方尚未准备好
- 帧间隔:分隔前一帧和后一帧
数据帧由7个段构成:
| 段 | 说明 |
|---|---|
| 帧起始(SOF) | 1个显性位,表示数据帧开始 |
| 仲裁段 | 11位(标准帧)或29位(扩展帧)标识符 + RTR位 |
| 控制段 | IDE位、r0保留位、4位DLC(数据长度码) |
| 数据段 | 0~8字节数据 |
| CRC段 | 15位CRC校验 |
| ACK段 | 确认正常接收 |
| 帧结束(EOF) | 7个隐性位 |
标准帧和扩展帧的主要区别在于仲裁段ID长度不同------标准帧11位,扩展帧29位。
3. CAN FD帧格式详解------与传统CAN的核心差异
CAN FD在传统CAN帧格式基础上进行了多处关键改进。以下从帧结构对比入手,逐一解析每个差异点。
3.1 帧格式总览对比
两种帧从帧起始(SOF)位到整个11位仲裁位都相同 。差异从控制段开始显现。

3.2 控制位升级:FDF、BRS、ESI三大新位
CAN FD在控制场新增了EDL位(即FDF位)、BRS位、ESI位三个关键位。
(1)FDF位(Flexible Data Format)------帧类型标识
FDF位是区分CAN帧和CAN FD帧的核心标志。
| FDF位值 | 含义 |
|---|---|
| 显性(0) | 传统CAN帧 |
| 隐性(1) | CAN FD帧 |
在传统CAN标准帧中,这个位置原本是r0保留位(始终为显性)。CAN FD将其重新定义为FDF位,隐性值表示"这不是传统CAN帧,而是CAN FD帧"。
💡 关键洞察 :传统CAN控制器会将FDF=隐性的CAN FD帧误判为错误帧。因此,传统CAN控制器和CAN FD控制器不能直接混用在同一个网络中发送FD帧。
(2)BRS位(Bit Rate Switch)------双速率切换
BRS位是CAN FD双速率模式的核心控制位。
| BRS位值 | 含义 |
|---|---|
| 显性(0) | 数据段采用与仲裁段相同的速率 |
| 隐性(1) | 数据段切换到更高的速率 |
当BRS为隐性时,从BRS位之后到CRC界定符之前的数据段采用高速率传输。仲裁段和帧结束部分仍使用标准速率。
这种设计让CAN FD在保持与传统CAN兼容的仲裁机制的同时,在数据传输阶段获得更高的吞吐量。
(3)ESI位(Error State Indicator)------错误状态指示
ESI位用于指示发送节点的错误状态。
| ESI位值 | 含义 |
|---|---|
| 显性(0) | 发送节点处于主动错误状态(Error Active) |
| 隐性(1) | 发送节点处于被动错误状态(Error Passive) |
通过ESI位,网络中的其他节点可以实时了解发送节点的错误状态,提升了网络的可管理性。
(4)RRS位替换RTR位------取消远程帧
传统CAN中,RTR(Remote Transmission Request)位用于区分数据帧和远程帧。
CAN FD取消了远程帧的支持 ,将RTR位替换为RRS(Remote Request Substitution)位 。在CAN FD数据帧中,RRS位始终为显性(0) 。
⚠️ 重要 :CAN FD协议不支持远程帧。
3.3 DLC编码:从线性到非线性
这是CAN FD最直观的升级之一。
| 协议 | DLC编码方式 | 最大数据长度 |
|---|---|---|
| 传统CAN | 线性编码(DLC值=数据字节数) | 8字节 |
| CAN FD | 非线性编码 | 64字节 |
CAN FD的DLC仍然使用4位 编码。当数据长度**≤8字节**时,编码方式与传统CAN相同。当数据长度**>8字节**时,采用非线性映射:
| DLC值 | 实际数据字节数 |
|---|---|
| 9 | 12 |
| 10 | 16 |
| 11 | 20 |
| 12 | 24 |
| 13 | 32 |
| 14 | 48 |
| 15 | 64 |
3.4 CRC校验:从15位到17/21位
传统CAN采用15位CRC校验。CAN FD根据数据长度选择不同的CRC多项式:
| 数据长度 | CRC多项式 | 适用场景 |
|---|---|---|
| ≤16字节 | CRC_17(17位) | 帧长小于210位 |
| >16字节 | CRC_21(21位) | 帧长小于1023位 |
CAN FD的CRC计算包含填充位 ,并引入了固定填充位(FSB)和填充位计数机制,进一步降低了错误漏检的风险。
3.5 帧格式差异总结表
| 字段/特性 | 传统CAN | CAN FD |
|---|---|---|
| FDF位 | r0保留位(显性) | 隐性=CAN FD帧 |
| RTR/RRS | RTR(支持远程帧) | RRS(不支持远程帧) |
| BRS位 | 不存在 | 控制数据段速率切换 |
| ESI位 | 不存在 | 指示发送节点错误状态 |
| 最大数据长度 | 8字节 | 64字节 |
| DLC编码 | 线性 | 非线性(>8字节时) |
| CRC位数 | 15位 | 17位或21位 |
| CRC计算范围 | 不含填充位 | 包含填充位 |
| 远程帧支持 | ✅ 支持 | ❌ 不支持 |
4. 兼容性与混合通信
4.1 传统CAN控制器无法识别CAN FD帧
由于FDF位在传统CAN帧中原本是r0保留位(始终为显性) ,传统CAN控制器会将FDF=隐性的CAN FD帧误判为错误帧。
这意味着:在同一个网络中,传统CAN控制器和CAN FD帧不能共存------如果总线上有传统CAN节点,发送CAN FD帧会导致传统节点报错。
4.2 向下兼容:CAN FD控制器可以处理传统CAN帧
好消息是:所有CAN FD控制器都可以处理传统CAN帧和CAN FD帧的混合。
这意味着在实际项目中,可以逐步升级:
- 先替换部分节点为CAN FD控制器(仍发送传统CAN帧)
- 当所有节点都升级为CAN FD控制器后,再启用CAN FD帧
4.3 STM32的混合模式支持
STM32的FDCAN控制器完美支持这种混合模式 。以STM32G4系列为例,其内置的FDCAN模块可以独立配置两个实例,一个工作在CAN FD模式,另一个保持经典CAN模式 。这种设计让开发者无需外接桥接芯片即可实现混合通信。
5. 主流MCU对CAN FD的支持情况
5.1 STM32系列支持概况
ST官方应用笔记显示,以下STM32系列集成了FDCAN外设,支持CAN FD:
| 系列 | CAN FD支持 | 备注 |
|---|---|---|
| STM32G0系列 | ✅ 支持 | 入门级CAN FD方案 |
| STM32G4系列 | ✅ 支持(3个FDCAN实例) | 工业控制首选 |
| STM32H5系列 | ✅ 支持 | 新一代高性能系列 |
| STM32H7系列 | ✅ 支持(2个FDCAN控制器) | 高性能首选 |
| STM32L5系列 | ✅ 支持 | 安全+低功耗 |
| STM32U5系列 | ✅ 支持 | 超低功耗 |
| STM32F4系列 | ❌ 不支持 | 仅bxCAN(经典CAN) |
| STM32L4系列 | ❌ 大部分不支持 | 仅少数型号支持 |
| STM32C0系列 | ⚠️ 部分支持(如STM32C092) | 新系列,性价比高 |
5.2 STM32G4系列详解
STM32G4是工业电机控制和数字电源领域的明星产品,其对CAN FD的支持非常出色:
- 多达3个FDCAN接口(如STM32G473)
- 可独立配置不同实例的工作模式
- 每个FDCAN实例都支持Tx buffer/queue/FIFO 和Rx buffer/FIFO三种传输/接收机制
- 最佳FDCAN模块时钟频率约为80MHz
💡 选型建议 :如果你的项目需要多路CAN FD通信(如同时连接多个伺服驱动器),STM32G473/474的3个FDCAN实例是理想选择。
⚠️ 工程注意事项 :当FDCAN配置为CAN FD模式传输DLC > 8 的帧时,Tx buffer中超过前8字节的数据会被填充0xCC ;接收时,超过前8字节的数据会被丢弃 。因此,发送大于8字节的数据时,必须正确填写完整的Tx buffer。
5.3 STM32H7系列详解
STM32H7是高性能计算的代表,其FDCAN特性如下:
- 2个FDCAN控制器
- 支持ISO 11898-1:2015标准
- 同时兼容Bosch CAN FD Specification V1.0(通过NISO位配置)
- 数据段波特率实测可达2Mbps以上
- 社区实测中,有开发者尝试将数据段速率提升至**>1.92Mbps**
💡 选型建议 :如果你的项目需要高性能计算 + CAN FD通信(如机器人控制器、高端工业设备),STM32H7是理想选择。
典型配置示例(基于H7-TOOL工具):
- 帧类型:CAN FD双波特率
- 仲裁段波特率:500Kbps
- 数据段波特率:2Mbps
- 最大数据长度:64字节
5.4 其他厂商支持情况
NXP S32K系列 :S32K汽车通用MCU广泛支持CAN FD ,部分型号支持多达6个CAN FD端口 。S32K344等型号还集成了硬件安全引擎(HSE) 和CAN SIC(信号质量提升) 功能。
TI系列 :TI的CAN FD标准允许数据段速率最高达8Mbps。
6. 性能提升的实际意义
6.1 带宽效率
CAN FD通过可变速率 和扩展数据长度 ,将总线负载率从传统CAN的70%降低至30%以下。
6.2 OTA升级效率
对于固件OTA升级场景,CAN FD的优势尤为明显------升级效率提升5-8倍。传统CAN升级一个较大固件包可能需要数十分钟,而CAN FD可以大幅缩短这个时间。
6.3 可靠性增强
CRC校验覆盖填充位 ,加上固定填充位计数机制,进一步减少了错误漏检的概率。
7. CAN FD配置要点(STM32 HAL库)
7.1 CubeMX中的关键配置
- 激活FDCAN外设:在Pinout & Configuration中启用FDCAN
- 选择模式 :
- 正常模式(Normal):标准CAN FD通信
- 受限操作模式(Restricted Operation):限制性模式
- 配置波特率 :
- 仲裁段波特率(Nominal Bit Rate):通常500Kbps或1Mbps
- 数据段波特率(Data Bit Rate):最高可达8Mbps
- 配置BRS使能:启用Bit Rate Switching功能
- 配置消息RAM:分配Tx buffer和Rx FIFO的地址和大小
7.2 兼容经典CAN的配置
如果需要在CAN FD控制器上仅发送/接收经典CAN帧:
- 在CubeMX中将帧格式设置为传统模式(Classic CAN)
- 将模式设置为正常模式(Normal Mode)
- 配置与经典CAN兼容的波特率和采样位置参数
7.3 ISO vs NON-ISO模式
STM32的FDCAN支持两种CAN FD标准:
- ISO模式(NISO=0):遵循ISO 11898-1:2015标准
- NON-ISO模式(NISO=1):遵循Bosch CAN FD Specification V1.0
💡 建议 :新项目优先使用ISO模式,确保与最新标准的兼容性。
8. 选型决策树
需要CAN FD通信?
├── 是 → 需要高性能计算?
│ ├── 是 → STM32H7(2个FDCAN,最高性能)
│ └── 否 → 需要多路CAN FD(≥3路)?
│ ├── 是 → STM32G4(3个FDCAN实例)
│ └── 否 → STM32G0 / STM32H5(入门/中端)
├── 否 → 使用经典CAN即可
│ ├── 低成本 → STM32F0/F1/F4(bxCAN)
│ └── 低功耗 → STM32L4(bxCAN)
└── 需要在CAN FD和经典CAN间切换?
└── STM32G4/H7(FDCAN可配置为经典CAN模式)
9. 常见问题与避坑指南
| 问题 | 原因 | 解决方案 |
|---|---|---|
| CAN FD帧发送失败 | 传统CAN控制器无法识别FDF=隐性 | 确认总线上所有节点都支持CAN FD |
| 数据段速率无法提升 | 时钟配置不当或PHY芯片限制 | 检查FDCAN时钟源;确认PHY支持高速率 |
| DLC>8的数据被截断 | Tx buffer配置不正确 | 正确配置完整的Tx buffer |
| CAN FD与经典CAN混合通信失败 | 模式配置错误 | 将FDCAN实例配置为经典CAN模式 |
| ISO与NON-ISO不兼容 | 双方标准不一致 | 统一使用ISO模式(NISO=0) |
10. 总结
| 对比维度 | 传统CAN | CAN FD |
|---|---|---|
| 最高速率 | 1Mbps | 仲裁段1Mbps / 数据段8Mbps |
| 最大数据 | 8字节 | 64字节 |
| CRC位数 | 15位 | 17/21位 |
| 远程帧 | ✅ 支持 | ❌ 不支持 |
| 代表MCU | STM32F4(bxCAN) | STM32G4/H7(FDCAN) |
| 典型场景 | 车身控制、底盘系统 | ADAS、车载娱乐、OTA |
CAN FD不是对CAN的颠覆,而是在保持CAN核心优势基础上的自然进化 。它通过帧格式的精细化改进 ------FDF位标识帧类型、BRS位实现双速率、增强的CRC保障可靠性------在兼容现有CAN生态的同时,大幅提升了总线的数据吞吐能力。
对于嵌入式开发者来说,理解CAN与CAN FD的帧格式差异是正确配置和使用的基础。而选择合适的MCU平台(如STM32G4的3路FDCAN或STM32H7的高性能FDCAN),则是项目成功的关键。
根据行业调研,2025年新上市车型中CAN FD渗透率已超过60%。掌握CAN FD,不仅是技术储备,更是顺应行业发展方向的必要技能。
📚 参考资料
- ISO 11898-1:2015(CAN FD标准)
- STM32G4/H7参考手册(FDCAN章节)
- ST应用笔记:Implementation of CAN-FD in STM32 devices
- CAN FD规范(CiA)
- CSDN/51Testing社区技术文章