• 正文
  • 相關推薦
申請入駐 產業(yè)圖譜

基于 STM32FDCAN 外設的多通道 CAN-FD 收發(fā)系統(tǒng)設計與實現(xiàn)實戰(zhàn)

06/25 10:43
1005
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

一、引言

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

-CAN 2.0 標準協(xié)議

-CAN-FD 協(xié)議(含速率切換)

-報文過濾、FIFO 緩沖、硬件時戳等

相比早期 bxCAN(如 STM32F103),F(xiàn)DCAN 提供更強的 實時性、帶寬與可編程,適用于構建多通道、高帶寬的 CAN 網絡應用,如電池管理系統(tǒng)(BMS)、車載網關、數(shù)據采集平臺等。

二、硬件平臺與開發(fā)環(huán)境

1. 硬件選型

模塊 說明
主控 MCU STM32G474RE / STM32H743
收發(fā)器芯片 TJA1051T / SN65HVD230(支持 CAN-FD)
通信拓撲 雙路 CAN 收發(fā):FDCAN1 + FDCAN2

2. 開發(fā)環(huán)境

-STM32CubeIDE / STM32CubeMX

-HAL 驅動庫(含 FDCAN HAL)

-可選:Keil 或 IAR + HAL

三、FDCAN 核心特性簡述

特性 說明
支持 CAN/CAN-FD 協(xié)議 向后兼容 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(兼容傳統(tǒng) CAN 仲裁)
Data Bitrate 2 Mbps(CAN-FD 數(shù)據段傳輸)
Enable BRS 使能速率切換
Frame Format CAN FD mode

3. 配置接收 FIFO

-FIFO0 → 分配 64 條接收緩存

-FIFO1 可用于高優(yōu)先報文隔離(如診斷、事件幀)

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);

五、收發(fā)機制實現(xiàn)(中斷模式)

1. 啟動 FDCAN 模塊

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

2. 發(fā)送幀函數(shù)

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. 接收回調函數(shù)

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 和數(shù)據
uint32_t id = RxHeader.Identifier;
uint8_t dlc = RxHeader.DataLength;
// 后續(xù)處理邏輯...
}

六、多通道同步收發(fā)設計

場景:FDCAN1 + FDCAN2 同時通信

-分別配置 2 個實例的收發(fā)中斷

-在調度層建立統(tǒng)一消息隊列(如 ring buffer)

-實現(xiàn)消息轉發(fā)、中繼、冗余發(fā)送等功能

實現(xiàn)要點:

項目 建議做法
中斷處理優(yōu)先級 設置為高優(yōu)先,避免丟包
RX FIFO 使用 FIFO0 專用于數(shù)據,F(xiàn)IFO1 用于控制類報文
多路冗余轉發(fā) 接收 FDCAN1 報文 → 復制發(fā)給 FDCAN2
故障檢測機制 檢測 FDCAN 錯誤幀 / 硬件錯誤中斷處理

七、調試技巧與錯誤處理

1. 報文不接收常見原因

問題 解決方式
報文過濾未放行 檢查過濾器配置是否覆蓋目標 ID
沒啟用接收中斷 確保 HAL_FDCAN_ActivateNotification 啟動
電平不穩(wěn)定 檢查收發(fā)器供電、布線干擾等

2. 報文損壞或奇怪數(shù)據

-是否配置 BRS 正確

-數(shù)據段比特率是否匹配

-注意 CAN-FD 和傳統(tǒng) CAN 的混用兼容性

八、應用案例:CAN-FD 數(shù)據采集節(jié)點設計

系統(tǒng)目標:

-STM32G474 采集 6 路模擬量、1 路溫度、故障標志

-每 10ms 打包發(fā)送 CAN-FD 報文(64 字節(jié))

報文內容規(guī)劃(每幀):

數(shù)據項 長度(字節(jié))
電壓(6 路) 12
電流(6 路) 12
溫度 2
故障位 1
時間戳 4
保留/擴展 33
合計 64 字節(jié)

九、優(yōu)化建議與工程實踐

項目 優(yōu)化建議
報文發(fā)送效率 使用 TX FIFO(非 Mailbox),可打包多幀
多任務處理 收發(fā)線程與數(shù)據計算分離,使用 RTOS 管理
報文優(yōu)先級區(qū)分 合理設置 ID 優(yōu)先級,防止擁堵
電磁干擾問題 加強濾波電容、差分布線長度等 EMC 策略

十、總結與展望

STM32 FDCAN 外設提供了強大的:

-多通道并發(fā)處理能力

-CAN/CAN-FD 混發(fā)支持

-靈活的 FIFO 緩沖與過濾機制

結合 CubeMX 工具和 HAL 驅動庫,可快速構建穩(wěn)定、高效、可移植的車載 CAN-FD 通信系統(tǒng)。

未來可拓展方向:

-支持 ISO-TP 層封裝(用于 OTA

-與 UDS 診斷協(xié)議結合刷寫控制器

-多 MCU CAN 網絡構建(環(huán)網、中繼)801

相關推薦