STM32H750的FDCAN外设仅发送无数据的部分CAN帧求助排查
STM32H750 FDCAN发送无数据帧问题排查
我正在尝试让STM32H750的FDCAN外设在标准1Mbps CAN网络中通信,发送测试消息后,总线逻辑分析仪仅捕获到无数据的部分CAN帧,但外设能正常接收格式正确的现有帧,寻求故障排查方向。
逻辑分析仪捕获结果:仅能看到CAN帧的起始部分,无数据段内容。
发送测试消息代码
FDCAN_TxHeaderTypeDef txheader; txheader.Identifier = 69; txheader.IdType = FDCAN_STANDARD_ID; txheader.TxFrameType = FDCAN_DATA_FRAME; txheader.DataLength = FDCAN_DLC_BYTES_8; txheader.BitRateSwitch = FDCAN_BRS_OFF; txheader.FDFormat = FDCAN_CLASSIC_CAN; txheader.TxEventFifoControl = FDCAN_NO_TX_EVENTS; txheader.MessageMarker = 0; testdata[0] = 'b'; testdata[1] = 'l'; testdata[2] = 'a'; testdata[3] = 'r'; testdata[4] = 'g'; testdata[5] = 'f'; testdata[6] = 'o'; testdata[7] = 'o'; HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txheader, testdata);
FDCAN初始化代码
hfdcan1.Instance = FDCAN1; hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; hfdcan1.Init.AutoRetransmission = ENABLE; hfdcan1.Init.TransmitPause = DISABLE; hfdcan1.Init.ProtocolException = DISABLE; hfdcan1.Init.NominalPrescaler = 20; hfdcan1.Init.NominalSyncJumpWidth = 1; hfdcan1.Init.NominalTimeSeg1 = 5; hfdcan1.Init.NominalTimeSeg2 = 4; hfdcan1.Init.DataPrescaler = 20; hfdcan1.Init.DataSyncJumpWidth = 1; hfdcan1.Init.DataTimeSeg1 = 5; hfdcan1.Init.DataTimeSeg2 = 4; hfdcan1.Init.MessageRAMOffset = 0; hfdcan1.Init.StdFiltersNbr = 1; hfdcan1.Init.ExtFiltersNbr = 0; hfdcan1.Init.RxFifo0ElmtsNbr = 2; hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64; hfdcan1.Init.RxFifo1ElmtsNbr = 0; hfdcan1.Init.RxBuffersNbr = 64; hfdcan1.Init.TxEventsNbr = 0; hfdcan1.Init.TxBuffersNbr = 64; hfdcan1.Init.TxFifoQueueElmtsNbr = 2; hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_64; if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) { Error_Handler(); }
已尝试操作
- 将
DataLength改为数值8,而非FDCAN_DLC_BYTES_8(展开为0x00080000U) - 尝试使用
FDCAN_DATA_BYTES_8(展开为4)
排查方向
1. 波特率配置正确性验证
经典CAN帧仅使用标称波特率,当前配置的波特率计算需匹配1Mbps目标:
波特率公式:标称波特率 = FDCAN时钟 / (NominalPrescaler * (NominalSyncJumpWidth + NominalTimeSeg1 + NominalTimeSeg2))
当前参数计算:20*(1+5+4)=200,若FDCAN时钟为200MHz则刚好1Mbps,若时钟为100MHz则实际波特率为500kbps,波特率不匹配会导致帧格式错误,逻辑分析仪无法解析数据段。需确认FDCAN外设时钟源及频率是否正确。
2. DLC字段配置验证
FDCAN的DataLength字段对经典帧有特定格式要求:
- 必须使用
FDCAN_DLC_BYTES_x宏(x为0-8),这类宏将DLC值左移16位(如FDCAN_DLC_BYTES_8=0x00080000U),因为字段高16位对应DLC,低16位在经典帧中保留。直接赋值8会被解析为无效DLC,导致数据段不发送。
3. 发送FIFO状态检查
- 检查
HAL_FDCAN_AddMessageToTxFifoQ的返回值是否为HAL_OK,排除FIFO已满或写入失败的情况。 - 查看FDCAN寄存器
FDCAN1->TXFS,确认发送FIFO状态,是否存在待发送请求;检查FDCAN1->CCCR寄存器的TXEN位是否为1(发送使能)。
4. 硬件与引脚配置检查
- 确认FDCAN TX/RX引脚是否正确配置为复用功能,无浮空或错误配置。
- 检查CAN总线是否接入120Ω终端电阻,排除总线阻抗不匹配导致的信号失真。
- 验证逻辑分析仪的采样率、差分信号连接是否正确,确保能准确捕获CAN帧完整内容。
5. 错误状态与中断检查
- 开启FDCAN发送错误中断(
FDCAN_IT_TX_ERR),查看错误代码,排除总线错误、仲裁丢失等异常导致的发送终止。 - 检查FDCAN错误计数器(
FDCAN1->ECR),确认发送错误计数是否过高。
内容的提问来源于stack exchange,提问作者ethan
相关产品推荐
相关产品推荐

