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

能否用外部回环模式测试CAN收发器?STM32H753测试异常求助

CAN总线故障排查测试咨询

我使用搭载STM32H753的自定义PCB,目前仅有示波器、万用表和逻辑分析仪,无CAN分析仪。CAN总线通信出现异常,怀疑是CAN收发器问题,但尚未找到根因。

STM32H7支持CAN的外部与内部回环测试模式,该模式下可观测CAN TX发送的报文。我有两款采用不同STM32H753型号的产品,一款正常工作,另一款故障,二者收发器引脚定义和特性相近。

我的假设是:若CAN TX能观测到报文,CAN H和CAN L也应出现信号。为此我编写了测试代码并在两款设备上测试:

  • 正常设备的CAN TX有报文,CAN H/L有受无终端电阻影响的抑制信号;
  • 故障设备的CAN TX有报文,但CAN H/L无任何变化。

请问我的测试是否有效?是否存在遗漏点?该测试能否说明问题?

测试代码

HAL_Delay(100);
if(HAL_FDCAN_AddMessageToTxBuffer(&hfdcan1, &TxHeader, TxData_Node1_To_Node2, FDCAN_TX_BUFFER0) != HAL_OK)
{
    Error_Handler();
}
/* Send Tx buffer message */
if(HAL_FDCAN_EnableTxBufferRequest(&hfdcan1, FDCAN_TX_BUFFER0) != HAL_OK)
{
    Error_Handler();
}
while(HAL_FDCAN_IsTxBufferMessagePending(&hfdcan1, FDCAN_TX_BUFFER0) == 1);

/* Polling for reception complete on buffer index 0 */
while(HAL_FDCAN_IsRxBufferMessageAvailable(&hfdcan1, FDCAN_RX_BUFFER0) == 0);

/* Retrieve message from Rx buffer 0. Rec msg from Node 2 */
if(HAL_FDCAN_GetRxMessage(&hfdcan1, FDCAN_RX_BUFFER0, &RxHeader, RxData_From_Node2) != HAL_OK)
{
    Error_Handler();
}

hfdcan1.Instance = FDCAN1;
hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;
hfdcan1.Init.Mode = FDCAN_MODE_EXTERNAL_LOOPBACK;
hfdcan1.Init.AutoRetransmission = DISABLE;
hfdcan1.Init.TransmitPause = DISABLE;
hfdcan1.Init.ProtocolException = DISABLE;
hfdcan1.Init.NominalPrescaler = 1;
hfdcan1.Init.NominalSyncJumpWidth = 13;
hfdcan1.Init.NominalTimeSeg1 = 86;
hfdcan1.Init.NominalTimeSeg2 = 13;
hfdcan1.Init.DataPrescaler = 2;
hfdcan1.Init.DataSyncJumpWidth = 12;
hfdcan1.Init.DataTimeSeg1 = 12;
hfdcan1.Init.DataTimeSeg2 = 12;
hfdcan1.Init.MessageRAMOffset = 0;
hfdcan1.Init.StdFiltersNbr = 1;
hfdcan1.Init.ExtFiltersNbr = 0 ;
hfdcan1.Init.RxFifo0ElmtsNbr = 0;
hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;
hfdcan1.Init.RxFifo1ElmtsNbr = 0;
hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;
hfdcan1.Init.RxBuffersNbr = 1;
hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;
hfdcan1.Init.TxEventsNbr = 0;
hfdcan1.Init.TxBuffersNbr = 1;
hfdcan1.Init.TxFifoQueueElmtsNbr = 32;
hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;
hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;
if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
{
  Error_Handler();
}

测试波形图

CAN TX波形
CANH波形


测试有效性判断

你的测试逻辑成立,测试有效。外部回环模式下STM32的CAN TX能输出正常报文,说明CAN控制器的发送通路正常;通过正常设备与故障设备的对比,故障设备CAN TX正常但CAN H/L无信号,已经把故障范围缩小到CAN收发器及其关联电路。

遗漏的排查点

  • 用万用表测量故障设备上CAN收发器的供电引脚电压,确认是否满足收发器的工作电压要求,排查是否存在供电断路、欠压情况
  • 检查收发器的模式控制引脚(如STB/EN引脚),确认没有被误设置为休眠/关断模式
  • 排查STM32的CAN_TX引脚到收发器TX输入引脚之间的线路:用万用表测通断,或用逻辑分析仪直接测量收发器的TX输入端电平,确认信号是否真的传递到了收发器
  • 测量故障设备CAN H和CAN L之间的电阻,排查是否存在总线短路、断路;如果挂载了终端电阻,确认电阻阻值是否正常(标称120Ω)
  • 再次核对两款设备的CAN收发器型号参数,确认是否存在兼容性差异(比如供电范围、支持的CAN速率)

测试结论

这个测试能够说明核心问题:排除了STM32内部CAN控制器的发送故障,故障点大概率出在CAN收发器本身、收发器的供电/控制电路、STM32到收发器的TX信号链路,或者CAN总线本身。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:40:35