• 正文
  • 相关推荐
申请入驻 产业图谱

基于 STM32FDCAN 外设的多通道 CAN-FD 收发系统设计与实现实战

06/25 10:43
1万
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、引言

STM32 自 G4 / H7 / L5 / U5 系列开始引入 FDCAN(Flexible Data-rate CAN)控制器,全面支持:

-CAN 2.0 标准协议

-CAN-FD 协议(含速率切换)

-报文过滤、FIFO 缓冲、硬件时戳等

相比早期 bxCAN(如 STM32F103),FDCAN 提供更强的 实时性、带宽与可编程,适用于构建多通道、高带宽的 CAN 网络应用,如电池管理系统(BMS)、车载网关、数据采集平台等。

二、硬件平台与开发环境

1. 硬件选型

模块 说明
主控 MCU STM32G474RE / STM32H743
收发器芯片 TJA1051T / SN65HVD230(支持 CAN-FD)
通信拓扑 双路 CAN 收发:FDCAN1 + FDCAN2

2. 开发环境

-STM32CubeIDE / STM32CubeMX

-HAL 驱动库(含 FDCAN HAL)

-可选:Keil 或 IAR + HAL

三、FDCAN 核心特性简述

特性 说明
支持 CAN/CAN-FD 协议 向后兼容 CAN2.0,支持 BRS/FDCAN 特性
多 FIFO 支持 支持 RX FIFO0 / FIFO1,TX FIFO
报文过滤机制 支持 128 条标准 ID + 128 条扩展 ID 过滤器
硬件时戳 每条接收报文自动附带时间信息
多种工作模式 Normal / Loopback / Silent 等

四、CubeMX 初始化配置详解

1. 启用 FDCAN 外设

-打开 CubeMX,启用 FDCAN1 / FDCAN2

-配置引脚Alternate Function(通常为 PD0/PD1 或 PB8/PB9)

2. 设置时钟和速率

项目 配置说明
Nominal Bitrate 500 kbps(兼容传统 CAN 仲裁)
Data Bitrate 2 Mbps(CAN-FD 数据段传输)
Enable BRS 使能速率切换
Frame Format CAN FD mode

3. 配置接收 FIFO

-FIFO0 → 分配 64 条接收缓存

-FIFO1 可用于高优先报文隔离(如诊断、事件帧)

4. 报文过滤器配置

设置过滤器为 “Accept All” 或添加自定义 ID 表。

c
FDCAN_FilterTypeDef sFilterConfig;
sFilterConfig.IdType = FDCAN_STANDARD_ID;
sFilterConfig.FilterIndex = 0;
sFilterConfig.FilterType = FDCAN_FILTER_MASK;
sFilterConfig.FilterConfig = FDCAN_FILTER_TO_FIFO0;
sFilterConfig.FilterID1 = 0x000;
sFilterConfig.FilterID2 = 0x000;
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig);

五、收发机制实现(中断模式)

1. 启动 FDCAN 模块

c
HAL_FDCAN_Start(&hfdcan1);
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);

2. 发送帧函数

c
FDCAN_TxHeaderTypeDef TxHeader;
uint8_t TxData[64];
TxHeader.Identifier = 0x123;
TxHeader.IdType = FDCAN_STANDARD_ID;
TxHeader.TxFrameType = FDCAN_DATA_FRAME;
TxHeader.DataLength = FDCAN_DLC_BYTES_64;
TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE;
TxHeader.BitRateSwitch = FDCAN_BRS_ON;
TxHeader.FDFormat = FDCAN_FD_CAN;
TxHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
TxHeader.MessageMarker = 0;

HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData);

3. 接收回调函数

c
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
FDCAN_RxHeaderTypeDef RxHeader;
uint8_t RxData[64];
HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader, RxData);

// 解析 ID 和数据
uint32_t id = RxHeader.Identifier;
uint8_t dlc = RxHeader.DataLength;
// 后续处理逻辑...
}

六、多通道同步收发设计

场景:FDCAN1 + FDCAN2 同时通信

-分别配置 2 个实例的收发中断

-在调度层建立统一消息队列(如 ring buffer)

-实现消息转发、中继、冗余发送等功能

实现要点:

项目 建议做法
中断处理优先级 设置为高优先,避免丢包
RX FIFO 使用 FIFO0 专用于数据,FIFO1 用于控制类报文
多路冗余转发 接收 FDCAN1 报文 → 复制发给 FDCAN2
故障检测机制 检测 FDCAN 错误帧 / 硬件错误中断处理

七、调试技巧与错误处理

1. 报文不接收常见原因

问题 解决方式
报文过滤未放行 检查过滤器配置是否覆盖目标 ID
没启用接收中断 确保 HAL_FDCAN_ActivateNotification 启动
电平不稳定 检查收发器供电、布线干扰等

2. 报文损坏或奇怪数据

-是否配置 BRS 正确

-数据段比特率是否匹配

-注意 CAN-FD 和传统 CAN 的混用兼容性

八、应用案例:CAN-FD 数据采集节点设计

系统目标:

-STM32G474 采集 6 路模拟量、1 路温度、故障标志

-每 10ms 打包发送 CAN-FD 报文(64 字节)

报文内容规划(每帧):

数据项 长度(字节)
电压(6 路) 12
电流(6 路) 12
温度 2
故障位 1
时间戳 4
保留/扩展 33
合计 64 字节

九、优化建议与工程实践

项目 优化建议
报文发送效率 使用 TX FIFO(非 Mailbox),可打包多帧
多任务处理 收发线程与数据计算分离,使用 RTOS 管理
报文优先级区分 合理设置 ID 优先级,防止拥堵
电磁干扰问题 加强滤波电容、差分布线长度等 EMC 策略

十、总结与展望

STM32 FDCAN 外设提供了强大的:

-多通道并发处理能力

-CAN/CAN-FD 混发支持

-灵活的 FIFO 缓冲与过滤机制

结合 CubeMX 工具和 HAL 驱动库,可快速构建稳定、高效、可移植的车载 CAN-FD 通信系统

未来可拓展方向:

-支持 ISO-TP 层封装(用于 OTA

-与 UDS 诊断协议结合刷写控制器

-多 MCU CAN 网络构建(环网、中继)801

相关推荐