能否用外部回环模式测试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(); }
测试波形图


测试有效性判断
你的测试逻辑成立,测试有效。外部回环模式下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
相关产品推荐
相关产品推荐

