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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 16:25:09