打印
[DSP编程]

28335的CAN CANNES寄存器心得体会分享

[复制链接]
1643|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenzhi658|  楼主 | 2017-7-10 08:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 chenzhi658 于 2017-7-10 08:49 编辑

问题:
1.每次总线离线,周期函数CAN_ERROR_CHECK没有检测到;
2.总线离线条件恢复总线正常条件,总线还是处于离线态;
解决:
1.CANNES寄存器对错误状态有锁存功能,一个错误发生,只有清除该错误,然后另一个错误才会被检测到;
2.总线离线后,要么初始化选择了CANMC.BIT.ABO=1自动重连自动恢复;要么CANMC.BIT.CCR=1唤醒总线;
void CAN_ERROR_CHECK(void)
{
        static Uint16 CanBus_Reboot=0;

                ECanbShadow.CANES.all = ECanbRegs.CANES.all;
                if(CanBus_Reboot==1){
                        if(ECanbShadow.CANES.bit.CCE == 1){
                                EALLOW;
                                ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
                                ECanbShadow.CANMC.bit.CCR = 0 ;            // Set CCR = 1
                                ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
                                EDIS;
                                CanBus_Reboot=0;
                        }
                }
                if(ECanbShadow.CANES.bit.BO) // the can bus communicate error
                {
                        ECanbShadow.CANES.bit.BO =1;
                        ECanbRegs.CANES.all = ECanbShadow.CANES.all;
                        EALLOW;
                        ECanbShadow.CANMC.all = ECanbRegs.CANMC.all;
                        ECanbShadow.CANMC.bit.CCR = 1 ;            // Set CCR = 1
                        ECanbRegs.CANMC.all = ECanbShadow.CANMC.all;
                        EDIS;
                        CanBus_Reboot=1;
                        SystemSetError();
                }
                else if(ECanbShadow.CANES.all & 0x01bb0000){//除了离线错误,其他发生后马上清除
                        ECanbShadow.CANES.all = 0x01bb0000;
                        ECanbRegs.CANES.all = ECanbShadow.CANES.all;
                }
}

相关帖子

沙发
21ic大掌柜| | 2017-7-10 10:20 | 只看该作者
感谢楼主分享经验~

使用特权

评论回复
板凳
zhangmangui| | 2017-7-10 22:03 | 只看该作者
感谢分享  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

247

帖子

1

粉丝