You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32 Nucleo-G431RB无法发送CAN FD信号的技术求助

解决Nucleo-G431RB FDCAN Tx引脚无信号输出的问题

1. 最关键:FDCAN引脚未配置复用功能

你的MX_GPIO_Init()函数完全没有初始化FDCAN1的Tx/Rx引脚(Nucleo-G431RB上FDCAN1对应PB9为Tx,PB8为Rx)。引脚默认处于普通GPIO状态,未切换到FDCAN的复用功能,导致Tx引脚一直保持3.3V死电平,无法输出信号。

在MX_GPIO_Init()的USER CODE BEGIN MX_GPIO_Init_2部分添加以下配置:

// 配置FDCAN1 Tx/Rx引脚为复用推挽模式
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

2. 代码存在语法错误

MX_FDCAN1_Init()的USER CODE BEGIN FDCAN1_Init 2区域有一个无效的ee字符,会导致编译失败,直接删除该字符即可。

3. FDCAN位时序配置非标准

当前配置的标称波特率约为418kbps,属于非标准值,容易与其他设备不兼容,也可能超出外接CAN收发器的支持范围。建议调整为标准波特率(以500kbps为例,基于PCLK1=144MHz):
修改MX_FDCAN1_Init()中的时序参数:

hfdcan1.Init.NominalPrescaler = 1;
hfdcan1.Init.NominalSyncJumpWidth = 16;
hfdcan1.Init.NominalTimeSeg1 = 111;
hfdcan1.Init.NominalTimeSeg2 = 32;
// 若需高速数据阶段(如2Mbps),可配置如下数据时序
hfdcan1.Init.DataPrescaler = 1;
hfdcan1.Init.DataSyncJumpWidth = 16;
hfdcan1.Init.DataTimeSeg1 = 111;
hfdcan1.Init.DataTimeSeg2 = 32;

波特率计算公式:波特率 = PCLK1 / (Prescaler * (SyncJumpWidth + TimeSeg1 + TimeSeg2 + 1))

4. 必须外接CAN收发器

Nucleo-G431RB板载未集成CAN收发器,需外接TJA1050这类模块:

  • 开发板PB9(Tx)连接收发器TXD引脚,PB8(Rx)连接收发器RXD引脚
  • 收发器VCC接3.3V,GND接开发板GND
  • 示波器需测量收发器的CANH/CANL差分信号,单端测量Tx引脚无法看到标准CAN波形(CAN为差分总线)

5. 可选:添加发送状态验证

发送后检查FDCAN发送FIFO状态,确认消息已被调度发送:

if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData) != HAL_OK){
    Error_Handler();
}
// 等待发送FIFO清空,确认消息已发送完成
while(HAL_FDCAN_GetTxFifoFreeLevel(&hfdcan1) != 3){
    // 可添加超时逻辑避免死等
}

内容的提问来源于stack exchange,提问作者96FUZZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:10:53