针对TC397的CAN总线Busoff无法恢复的问题,结合您的描述(CANH/L短接后重新初始化寄存器无效),以下是系统性的解决方案:
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标志清除
}INIT位写1后真正进入模式(读回验证)。INIT位和CCE位均清零。BOFF(Bit 15):Busoff状态标志是否清除。INIT(Bit 11):是否成功退出初始化模式。 // 示例:控制收发器复位引脚
setGpioLow(TRANSCEIVER_RESET_PIN); // 拉低复位
delay_ms(10);
setGpioHigh(TRANSCEIVER_RESET_PIN); // 释放复位
delay_ms(5); // 等待收发器初始化 canModule->CTL.B.SILENT = 1; // 启用静默模式
// ...执行恢复流程...
canModule->CTL.B.SILENT = 0; // 恢复后关闭CANx_CTL、CANx_PSR、CANx_ECNT canModule->CLC.B.DISR = 1; // 禁用模块
delay_ms(10);
canModule->CLC.B.DISR = 0; // 重新使能
// 然后重新初始化所有寄存器
总结流程:断开短接 → 复位收发器 → 软件强制初始化 → 清除错误状态 → 退出初始化 → 验证寄存器 → 网络协同恢复。务必结合TC397勘误手册验证硬件限制,优先在单节点隔离测试。
举报
更多回帖