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
相关产品推荐
相关产品推荐

