背景:在ti的测试例程中,采用查询方式发送消息,一次将所有的TRS位置1,采用中断方式接收发送的数据。(所有邮箱中断使能,中断等级0)。主函数中 for(;;){ ECannaRegs.CANTRS.all = 0x0000FFFF; //0——15信箱全部发送 while(ECanaRegs.CANTA.all != 0x0000FFFF);//等待所有消息发送完毕 ECanaRegs.CANTA.all = 0x0000FFFF;//清发送响应位 } 中断程序中: interrupt void ECAN0INTA_ISR(void) // eCAN-A { Uint16 j; for(j = 16; j < 32; j++){ mailbox_read(j); mailbox_check(TestMbox1,TestMbox2,TestMbox3); } EINT; } void mailbox_read(int16 MBXnbr) { volatile struct MBOX *Mailbox; Mailbox = &ECanaMboxes.MBOX0 + MBXnbr; TestMbox1 = Mailbox->MDRL.all; // = 0x9555AAAn (n is the MBX number) TestMbox2 = Mailbox->MDRH.all; // = 0x89ABCDEF (a constant) TestMbox3 = Mailbox->MID.all;// = 0x9555AAAn (n is the MBX number)
} 我的疑问:手册上明确说明,一个接收邮箱接收到一条消息或者一个发送邮箱成功发送一条消息将产生一个中断,也就是说任何发送和接收完成都会产生一个中断。为便于分析,从第1个消息发送完成开始考虑: 问题1:第1个消息发送完之后,将会产生一个中断,这时接收有可能还没完成,就不应该在中断程序里读接收邮箱的数据寄存器。更不要说一下子读16个接收邮箱的数据(后面的15个消息都还没开始发呢)。 问题2:在此后的中断中,应该需要判断是发送中断还是接收中断。如果不判断,怎么样知道发生的是接收中断还是发送中断。 很奇怪的是,这样的程序没有问题。在第一次发生中断后读出的16个数据全都正确! |