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

CANopenNode主节点调用NMT指令后持续重复发送报文故障排查

STM32L476移植CANopenNode NMT报文循环发送故障排查

已确认的故障基线

  • 软件基线:基于libohiboard作为HAL库移植CANopenNode,CANopen网络包含2个节点:自研主站板卡、商用CANopen从站
  • 正常阶段表现:设备启动时,节点可正常发送心跳(HB)报文、同步(SYNC)报文
  • 故障触发条件:主站执行代码CO_NMT_sendCommand(CO->NMT,CO_NMT_ENTER_OPERATIONAL, 0x0A);后,主站无间断持续发送相同NMT报文,无法停止
  • 已完成排查项:逻辑分析仪接CAN_TX、CAN_RX引脚抓波,观测到报文从TX发出后立即出现在RX引脚;已核查MCU CAN外设配置,环回模式处于关闭状态。

根因排查优先级及处理方案

按出现概率从高到低排序排查:

  • CAN收发器硬件/配置故障(最高发)
    该现象和环回模式表现一致,但已确认MCU侧环回关闭,90%以上概率是板载CAN收发器未进入正常工作模式:
    • 核查CAN收发器的模式控制引脚(如TJA1042/TJA1051的STB引脚、SN65HVD230的RS引脚)电平:若引脚电平配置错误进入待机/静默模式,收发器不会把TX引脚的报文驱动到CAN总线上,反而会通过内部回路把TX信号直接镜像到RX引脚,完全匹配观测到的“TX发完RX立刻收到”的现象。这种状态下报文根本没有发到总线,CANopen协议栈收不到发送成功的确认,会持续触发重发逻辑。
    • 测量CAN总线差分电平:正常发送显性位时CAN_H和CAN_L压差应≥2V,若压差不足1V,直接排查收发器供电、模式引脚、总线接线问题。
    • 核查CAN_H/CAN_L是否接反、虚接、短路,总线两端是否各接1个120Ω终端电阻,总线总直流电阻应在60Ω左右,异常的总线物理层会导致报文发送失败触发重传。
  • 底层CAN驱动适配错误
    • 核查CAN发送中断、接收FIFO中断的回调逻辑:libohiboard驱动对接CANopenNode时,若发送完成中断标志位未正确清除、发送缓冲区未及时释放,协议栈会判定上一帧发送失败,反复加载NMT报文重发。
    • 核查CAN验收滤波器配置:确认滤波器配置没有异常放行所有本地自发报文,正常工作模式下若滤波器配置错误,叠加物理层异常,会把自发报文当成总线外来报文送入协议栈,触发异常重发逻辑。
    • 核对CAN波特率、采样点配置:确认主站和商用从站参数完全一致,波特率不匹配时NMT报文得不到从站应答,部分版本CANopenNode会超时重发NMT指令。
  • CANopenNode移植逻辑错误
    • 检查CO_NMT_sendCommand的调用上下文:该函数禁止在中断服务函数中直接调用,中断上下文执行会导致CAN发送队列调度异常,相同报文反复入队发送。
    • 核查CAN发送缓冲区分配:确认给NMT报文分配的发送缓冲区没有被HB、SYNC发送进程异常占用,缓冲区状态标志位异常会导致报文被重复加载发送。
    • 快速定位测试:断开所有从站节点,单独给主站上电,执行NMT发送指令,若依然出现TX发完RX立刻收到的现象,可直接排除从站相关问题,聚焦主站硬件和底层驱动排查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:42:28