分享

bus off恢复机制研究

 ghostvip 2022-09-17 发布于广东

can模块一共有三种错误,为错误主动,错误被动和总线关闭,总线关闭就是所说的bus off,通常情况下我们也只需要对bus off进行特殊处理。在can模块内部有一个错误计数器,当错误次数超过255时就会导致bus off,如果此时bus off的恢复模式设置为禁止自动恢复,就需要认为介入设置恢复机制。

通常主机厂都要求在产生bus off后ECU不能自动恢复,并给出快慢恢复要求,供应商要根据要求来制定bus off的快慢恢复机制。比如在bus off后首先快恢复,时间为50ms,次数超过5次之后切换为慢恢复机制,时间为200ms,在恢复期间ECU不能发出或者接受报文影响整车网络。

对于spc560系列的MCU的配置,应在原来CAN模块初始化的基础上,对CR寄存器的某些位进行指定:

使能BUS OFF Interrupt(BOFFMSK = 1);

对于其他不需要关心的中断要禁止,以免造成其他影响,(ERRMSK= 0,TWRNMSK = 0,RWRNMSK= 0);

配置bus off recovery mode为disable self recovery(BOFFREC = 1)

通过以上的配置之后,在产生bus off之后会触发MCU中断,在中断函数中,要把CAN模块的发送和接收暂时关闭,并清除中断标志位,切换快慢恢复时间

Void FlexCan_BusOff_ISR(void)

{

         For(x = 0;x<32;x++)

{

         Can0.BUF[x].CS.B.CODE = 0;

}

If(FasterRecover_Time<5)

{

         Recover_Time = 50;

}

Else

{

         Recover_Time = 200;

}

Can0.ESR.B.BOFFINT = 1;

Bus_Off_Flag = 1;

}

然后在定时器中就可以计时,当计时到恢复时间时,对CAN模块重新初始化,并尝试发送报文,如果发送成功,则总线恢复正常,否则,继续保持休眠,等待下次恢复时间。

对于s12xs128的芯片,可以使用codewarrior的处理器专家,打开busoff的recovery mode为User模式,然后使能中断,在中断函数中的处理方法同上,同时设置Events里面的OnBusOff为generate code,在生成代码中会有一个CAN1_Busoff_RecoveryRequest()函数,在请求恢复总线的时候,直接调用这个函数即可,其实这个函数就是对CANMISC寄存器中的busoff标志位进行清除(write 1 to clear)。

对于要求不高的地方,不需要配置bus off,默认为自动恢复即可。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多