- UID
- 114293
|
       临近年底,总是大事小事,一起来,最近搞ECAN错误处理机制的时候,发现,每隔一定周期,TCOF 定时邮递计数器溢出错误被检测到,自己查了一些资料,发现属于物理上自己的累加,通过程序,可对其清零或复位。程序如下:
void InitECan(void)
{
        ……
               ECanaShadow.CANMC.bit.MBCC = 1;        // 成功发送消息后,定时邮递计数器清零        ECanaShadow.CANMC.bit.TCC = 1;          //  定时邮递计数器MSB清零
        ……
                // 邮箱中断屏蔽寄存器
        ECanaRegs.CANMIM.all = 0xFFFFFFFF;
        // 邮箱中端级别设置寄存器        1代表使用中断线1,0代表使用中断线0       
        // 与邮箱相关的中断,例如消息的发送或者接收所响应的中断
        ECanaRegs.CANMIL.all = 0;
        // 全局中断标志位1被置位
        ECanaRegs.CANGIF0.all = 0xFFFFFFFF;
        ECanaRegs.CANGIM.bit.MTOM = 0x1;        // mailbox time-out
        ECanaRegs.CANGIM.bit.TCOM = 0x1;        // time counter overflown
        ECanaRegs.CANGIM.bit.AAIM = 0x1;        // acknowledge failure
        ECanaRegs.CANGIM.bit.WDIM = 0x1;        // write refusal
        ECanaRegs.CANGIM.bit.WUIM = 0x1;        // wake-up
        ECanaRegs.CANGIM.bit.RMLIM = 0x1;        // messages lost
        ECanaRegs.CANGIM.bit.BOIM = 0x1;        // bus closed
        ECanaRegs.CANGIM.bit.EPIM = 0x1;        // Error-passive
        ECanaRegs.CANGIM.bit.WLIM = 0x1;        // warning
        /* then, map all interrupts to ECAN1INT */
        ECanaRegs.CANGIM.bit.GIL = 0x1;
        /* Enable interrupt line0 */
        ECanaRegs.CANGIM.bit.I0EN = 0x1;       // 中断0用于消息目标一类的中断
        /* Enable interrupt line1 */
        ECanaRegs.CANGIM.bit.I1EN = 0x1;      //  中断1用于系统相关一类的中断
}
// INT9.6
interrupt void ARCH_ECAN1INTA(void)  // eCAN-A
{
        #if 1
        // 定时邮递计数器溢出标志位
        if(ECanaRegs.CANGIF1.bit.TCOF1 == 0x1)
        {
                ECanaRegs.CANGIF1.bit.TCOF1 = 0x1;
                valo_Can_Error[1] = 0x04;
                MsgCtl_uchar(valo_Can_Error);     // 给上位机发送检测到的错误帧数据
        }
        #endif
      
        ……
               PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;        EINT;
}
程序如上,但是,我现在不明白,为什么这个MSB会被置位。。 |
|