void main(void)
{
Uint16 j;
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化SCIA寄存器*/
InitECan();
MessageReceiveCount = 0;
ErrorCount = 0;
#if CAN_INT
/*设置中断服务程序入口地址*/
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.ECAN0INTA = &ECAN0INTA_ISR;
PieVectTable.ECAN1INTA = &ECAN1INTA_ISR;
EDIS; // This is needed to disable write to EALLOW protected registers
/*开中断*/
IER |= M_INT9;
#endif
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;)
{
ECanaRegs.CANTRS.all = 0x0000FFFF;
while(ECanaRegs.CANTA.all != 0x0000FFFF);
ECanaRegs.CANTA.all = 0x0000FFFF;
MessageReceiveCount++;
j=0;
j=1;
j=2;
for(j = 0; j < 0x1000; j++);
//#if !CAN_INT
//for(j = 0; j < 16; j++)
//{
// mailbox_read(j);
// mailbox_check(TestMbox1,TestMbox2,TestMbox3);
//}
//#endif
}
}
这是一个自测代码,邮箱运行在自测模式,邮箱0~15为发送,邮箱16~31为接收!邮箱发送完后将检测接收邮箱中的数据与发送邮箱中的数据是否一样,以判断接收的数据是否正确。
疑问:
1。在代码刚进去(刚执行,首次运行)时,邮箱中断进去了两次,第一次在执行while(ECanaRegs.CANTA.all != 0x0000FFFF)时进去一次(邮箱中断),第二次在执行完j=0后,进去第二次(邮箱中断)。执行完一次循环(for(;;)循环),在第二次以后的循环(for(;;)循环),在执行到while(ECanaRegs.CANTA.all != 0x0000FFFF)时不在进入中断(邮箱中断),只有在执行到j=0后,才进入中断(邮箱中断),想问,为什么第一次时进两次,之后又怎么又进次了???????
2。邮箱都是邮箱号最大的优先级最高(MSGCTRL。TPL都设置为0),但当我在邮箱中断里设置了一个断点,当代码运行到断点时,我发现CANTA.ALL=0X00004000,也就是首先发送出去的邮箱不是15号邮箱,而是14号邮箱,求解,为什么????
|