单片机/MCU论坛
直播中

刘英

8年用户 1180经验值
私信 关注
[问答]

TC397的busoff无法恢复怎么解决?


  • 我现在使用4个397芯片产品,在一个CAN网络里;将CANH、L短接,仿真发现一台控制器的CAN Init寄存器一直是Init,重新初始化CAN寄存器都不行;

回帖(1)

kasdlak

2025-8-18 16:42:34

针对TC397的CAN总线Busoff无法恢复的问题,结合您的描述(CANH/L短接后重新初始化寄存器无效),以下是系统性的解决方案:


1. 核心问题分析



  • Busoff后恢复失败通常由以下原因导致:

    • 总线物理层未恢复(仍处于短路状态)

    • 软件恢复流程不完整

    • 寄存器状态未正确清除

    • 芯片固件缺陷(需检查勘误手册)



2. 关键解决步骤


(1) 解除总线短路



  • 立即行动:断开CANH/L的短接线,确保总线恢复正常电平(用示波器验证空闲状态为隐性电平)。

  • 终端电阻检查:确认总线两端有120Ω终端电阻。


(2) 完整Busoff恢复流程


   void CAN_BusOffRecover(Ifx_CAN *canModule)
   {
       // 1. 强制进入初始化模式
       canModule->CTL.B.INIT = 1;      // 请求初始化模式
       while(canModule->CTL.B.INIT == 0); // 等待INIT生效
       canModule->CTL.B.CCE = 1;       // 允许配置变更

       // 2. 复位错误计数器(关键!)
       // 错误计数器位于ECNT寄存器,但通常进入初始化模式会自动清零
       // 显式清除状态寄存器标志:
       canModule->STAT.U = 0xFFFFFFFF; // 清除所有状态位(根据手册操作)
       canModule->PSR.U   = 0xFFFFFFFF; // 清除协议状态寄存器标志

       // 3. 重新配置CAN核心(可选但推荐)
       // - 重新设置波特率、验收过滤器等
       // - 示例:设置波特率寄存器(CAN_BDR)
       canModule->BDR.B.BRP = ...;     // 按实际配置填写

       // 4. 退出初始化模式
       canModule->CTL.B.INIT = 0;      // 退出初始化
       while(canModule->CTL.B.INIT == 1); // 等待退出完成

       // 5. 等待总线同步
       while(canModule->PSR.B.BOFF == 1); // 等待Busoff标志清除
   }

(3) 关键寄存器操作验证



  • CTL寄存器状态

    • 确保INIT位写1后真正进入模式(读回验证)。

    • 退出时确认INIT位和CCE位均清零。


  • PSR寄存器监控

    • 检查BOFF(Bit 15):Busoff状态标志是否清除。

    • 检查INIT(Bit 11):是否成功退出初始化模式。



(4) 硬件辅助恢复



  • 收发器复位:在软件恢复前,通过GPIO复位CAN收发器芯片。
     // 示例:控制收发器复位引脚
    setGpioLow(TRANSCEIVER_RESET_PIN); // 拉低复位
    delay_ms(10);
    setGpioHigh(TRANSCEIVER_RESET_PIN); // 释放复位
    delay_ms(5); // 等待收发器初始化

  • 电源循环:如问题持续,短暂切断TC397的CAN模块电源(如有独立供电)。


(5) 网络级处理



  • 静默模式:恢复期间将节点设为静默模式,避免发送干扰:
     canModule->CTL.B.SILENT = 1; // 启用静默模式
    // ...执行恢复流程...
    canModule->CTL.B.SILENT = 0; // 恢复后关闭

  • 其他节点协调:确保网络中其他节点发送数据帧,提供总线同步所需的连续隐性位。


3. TC397特定注意事项



  • 勘误手册检查:查阅TC397勘误表(Errata Sheet),确认是否存在CAN模块硬件缺陷(如Errata CAN_1.1)。

  • 时钟配置:确认CAN时钟源(fSPB)稳定且在数据手册允许范围内。

  • 中断处理:在Busoff中断服务程序中直接调用恢复函数,避免上下文切换延迟。


4. 调试手段



  • 寄存器快照:在恢复前后打印以下寄存器值:

    • CANx_CTLCANx_PSRCANx_ECNT


  • 逻辑分析仪:捕获总线电平,验证退出初始化后是否出现TX波形。

  • 最小化测试:断开其他节点,单独测试故障芯片的恢复能力。


5. 备选方案



  • 软件复位整个CAN模块
     canModule->CLC.B.DISR = 1;  // 禁用模块
    delay_ms(10);
    canModule->CLC.B.DISR = 0;  // 重新使能
    // 然后重新初始化所有寄存器

  • 芯片替换:若单颗TC397始终无法恢复,可能硬件损坏,需更换芯片。



总结流程:断开短接 → 复位收发器 → 软件强制初始化 → 清除错误状态 → 退出初始化 → 验证寄存器 → 网络协同恢复。务必结合TC397勘误手册验证硬件限制,优先在单节点隔离测试。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分