嵌入式开发笔记:CAN与CAN FD完全指南——从帧格式差异到MCU选型实战

嵌入式开发笔记: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种类型的帧进行通信:

  1. 数据帧:携带数据从发送节点到接收节点
  2. 遥控帧:请求其他节点发送数据
  3. 错误帧:检测到错误时发送
  4. 过载帧:通知接收方尚未准备好
  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帧的混合

这意味着在实际项目中,可以逐步升级

  1. 先替换部分节点为CAN FD控制器(仍发送传统CAN帧)
  2. 当所有节点都升级为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/FIFORx 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中的关键配置

  1. 激活FDCAN外设:在Pinout & Configuration中启用FDCAN
  2. 选择模式
    • 正常模式(Normal):标准CAN FD通信
    • 受限操作模式(Restricted Operation):限制性模式
  3. 配置波特率
    • 仲裁段波特率(Nominal Bit Rate):通常500Kbps或1Mbps
    • 数据段波特率(Data Bit Rate):最高可达8Mbps
  4. 配置BRS使能:启用Bit Rate Switching功能
  5. 配置消息RAM:分配Tx buffer和Rx FIFO的地址和大小

7.2 兼容经典CAN的配置

如果需要在CAN FD控制器上仅发送/接收经典CAN帧

  1. 在CubeMX中将帧格式设置为传统模式(Classic CAN)
  2. 将模式设置为正常模式(Normal Mode)
  3. 配置与经典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社区技术文章
相关推荐
木木_王1 小时前
嵌入式学习 | STM32 裸板驱动开发(Day06) | DHT11温湿度传感器超详解(单总线时序+全套驱动代码+智能温湿度报警项目)
驱动开发·stm32·学习
奥莱维2 小时前
酒店客控系统与消防系统联动设计
网络
FellAveal2 小时前
【Go语言入门学习笔记】Part19.速率控制、原子计数器、互斥锁(Mutex)、状态协程
笔记·学习·golang
你怎么知道我是队长2 小时前
经典蓝牙(Bluetooth Classic / BR/EDR)学习计划
学习
论迹复利2 小时前
蓝牙 OTA 升级断连、升级失败底层链路问题定位
嵌入式硬件·安全·bt
极地野狼 音乐哔哔2 小时前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
学习·microsoft
2401_868534782 小时前
《论单元测试及其应用》
网络·网络协议
小此方2 小时前
Linux网络(一):揭秘从网络发展哲学到 TCP/IP 协议栈分层设计的设计哲学
linux·网络·tcp/ip
星野爱8953 小时前
远程控制哪家安全性更高?ToDesk、UU远程、向日葵隐私屏深度测评!
linux·运维·网络