• 正文
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

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

3小時(shí)前
226
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

一、引言

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

-CAN 2.0 標(biāo)準(zhǔn)協(xié)議

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

-報(bào)文過濾、FIFO 緩沖、硬件時(shí)戳等

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

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

1. 硬件選型

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

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

-STM32CubeIDE / STM32CubeMX

-HAL 驅(qū)動庫(含 FDCAN HAL)

-可選:Keil 或 IAR + HAL

三、FDCAN 核心特性簡述

特性 說明
支持 CAN/CAN-FD 協(xié)議 向后兼容 CAN2.0,支持 BRS/FDCAN 特性
多 FIFO 支持 支持 RX FIFO0 / FIFO1,TX FIFO
報(bào)文過濾機(jī)制 支持 128 條標(biāo)準(zhǔn) ID + 128 條擴(kuò)展 ID 過濾器
硬件時(shí)戳 每條接收報(bào)文自動附帶時(shí)間信息
多種工作模式 Normal / Loopback / Silent 等

四、CubeMX 初始化配置詳解

1. 啟用 FDCAN 外設(shè)

-打開 CubeMX,啟用 FDCAN1 / FDCAN2

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

2. 設(shè)置時(shí)鐘和速率

項(xiàng)目 配置說明
Nominal Bitrate 500 kbps(兼容傳統(tǒng) CAN 仲裁)
Data Bitrate 2 Mbps(CAN-FD 數(shù)據(jù)段傳輸)
Enable BRS 使能速率切換
Frame Format CAN FD mode

3. 配置接收 FIFO

-FIFO0 → 分配 64 條接收緩存

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

4. 報(bào)文過濾器配置

設(shè)置過濾器為 “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ā)機(jī)制實(shí)現(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. 接收回調(diào)函數(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ù)據(jù)
uint32_t id = RxHeader.Identifier;
uint8_t dlc = RxHeader.DataLength;
// 后續(xù)處理邏輯...
}

六、多通道同步收發(fā)設(shè)計(jì)

場景:FDCAN1 + FDCAN2 同時(shí)通信

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

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

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

實(shí)現(xiàn)要點(diǎn):

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

七、調(diào)試技巧與錯(cuò)誤處理

1. 報(bào)文不接收常見原因

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

2. 報(bào)文損壞或奇怪?jǐn)?shù)據(jù)

-是否配置 BRS 正確

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

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

八、應(yīng)用案例:CAN-FD 數(shù)據(jù)采集節(jié)點(diǎn)設(shè)計(jì)

系統(tǒng)目標(biāo):

-STM32G474 采集 6 路模擬量、1 路溫度、故障標(biāo)志

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

報(bào)文內(nèi)容規(guī)劃(每幀):

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

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

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

十、總結(jié)與展望

STM32 FDCAN 外設(shè)提供了強(qiáng)大的:

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

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

-靈活的 FIFO 緩沖與過濾機(jī)制

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

未來可拓展方向:

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

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

-多 MCU CAN 網(wǎng)絡(luò)構(gòu)建(環(huán)網(wǎng)、中繼)801

相關(guān)推薦