2812 eCAN的中断疑问!
背景:在ti的测试例程中,采用查询方式发送消息,一次将所有的TRS位置1,采用中断方式接收发送的数据。(所有邮箱中断使能,中断等级0)。主函数中<br /> for(;;){<br /> ECannaRegs.CANTRS.all = 0x0000FFFF; //0——15信箱全部发送<br /> while(ECanaRegs.CANTA.all != 0x0000FFFF);//等待所有消息发送完毕<br /> ECanaRegs.CANTA.all = 0x0000FFFF;//清发送响应位<br /> }<br /> 中断程序中:<br /> interrupt void ECAN0INTA_ISR(void) // eCAN-A<br /> {<br /> Uint16 j;<br /> for(j = 16; j < 32; j++){<br /> mailbox_read(j);<br /> mailbox_check(TestMbox1,TestMbox2,TestMbox3);<br /> }<br /> EINT;<br /> }<br />void mailbox_read(int16 MBXnbr)<br />{<br /> volatile struct MBOX *Mailbox;<br /> Mailbox = &ECanaMboxes.MBOX0 + MBXnbr;<br /> TestMbox1 = Mailbox->MDRL.all; // = 0x9555AAAn (n is the MBX number)<br /> TestMbox2 = Mailbox->MDRH.all; // = 0x89ABCDEF (a constant)<br /> TestMbox3 = Mailbox->MID.all;// = 0x9555AAAn (n is the MBX number)<br /><br />}<br />我的疑问:手册上明确说明,一个接收邮箱接收到一条消息或者一个发送邮箱成功发送一条消息将产生一个中断,也就是说任何发送和接收完成都会产生一个中断。为便于分析,从第1个消息发送完成开始考虑:<br /> 问题1:第1个消息发送完之后,将会产生一个中断,这时接收有可能还没完成,就不应该在中断程序里读接收邮箱的数据寄存器。更不要说一下子读16个接收邮箱的数据(后面的15个消息都还没开始发呢)。<br /> 问题2:在此后的中断中,应该需要判断是发送中断还是接收中断。如果不判断,怎么样知道发生的是接收中断还是发送中断。<br /> 很奇怪的是,这样的程序没有问题。在第一次发生中断后读出的16个数据全都正确!可能描述的不清楚!
我的意思是:<br /> 1。我认为中断程序不对,我认为应该首先知道到底发生了什么中断才能执行相应的操作。<br /> 但是我在调试时,在中断程序中插入断点,并读取出发生中断的邮箱编号<br /> readMIV = ECanaRegs.CANGIF0.bit.MIV0;<br /> 发现编号为固定的几个值,20,4,31。<br /> 不知道这到底是怎么回事,请各位高手指点一下!谢谢2812 eCAN的中断
这个问题怎么没人回答呢?我也想知道,顶一下!RE
刚开始试,过几天就会有结果的。呵呵。。。 1# zj0203楼主能留个QQ么,我也是做这个的,可以聊聊 有知道这个问题答案的吗,烦请解答一下 这个问题越是细想越是觉得难啊 我个人认为之所产生的是接收中断而不是发送中断 可能是因为发送中断标志位是TA 这个位需要接收端接收完成后才能给发送端一个信号 把TA置位 所以接收端可能抢先进入中断 再者 自发自收可能不同于其他情况 是个特例
页:
[1]