临近年底,总是大事小事,一起来,最近搞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会被置位。。
|