您好!
我的 eCAN 中断服务例程有问题(邮箱0至30是接收邮箱、而邮箱31是发送邮箱):
INTERRUPT void canISR (void) { struct eECAN_REGS ECANShadow; ECANShadure.CANRMP.ALL = ECANRAGS.ALL; ECANShadure.CANGA.ALL = ECANanaRegs.CANGA.ALL; ECANShadure.CANGIF0.ALL = ECANAREGS.CANGIF0.ALL = ECANG0.CANGIF0.CANGIF0.ALL;(如果是) 执行某些操作 //清除所有系统中断标志 ECANaRegs.CANGIF0.ALL = ECANShadure.CANGIF0.ALL; //确认中断以接收来自 PIE 组9 的更多中断 PieCtrlRegs.PIEACX.ALL |= PIEACK_group9; return; } const UINT16 mailBox= ECANNOT.AMOBI0...( 如果 是) 执行 其他操作} { ECanaRegs.Canta.all = ECanShady.Canta.all;//这应清除 ECanaRegs.Canta.bit.TA31 } //确认中断以从 PIE 组9 PieCtrlRegs.PIEACK.ALL |= PIEACK_group9接收更多中断; }
它几乎始终运行良好、但在极少数情况下、CANTA .TA31未被正确清除、因此从未触发其他 eCAN 中断。
我发现、发生这种情况时:
-最后一个触发的中断实际上是一个发送邮箱中断、实际上 CANGIF0.MIV0 = 31并且 CANTA .TA31被置位
- CANGIF0.GMIF0被置位并且 CANGIF0中没有其他位被置位(实际上、有时 CANGIF0.TCOF 也被置位、但是这不应该触发任何中断、因为 CANGIM.TCOM = 0)
-所有 CAN 错误寄存器为0
- CANTA TA31在分配 ECANARegs.CANTA 之后仍然被置位= ECANShady.CANTA all、该位应将其清除。
此外、我非常确信、在前一个任务仍处于待处理状态时、没有人会开始传输消息、因此我想 eCAN 模块应该在 CPU 尝试清除它的同时设置 TA31、这是毫无道理的
我无法随意重现此问题。
以下解决方法似乎可以正常工作:
ECanaRegs.Canta.all = ECanShady.Canta.all; do { ECANShady.Canta.all = ECanaRegs.Canta.all; if (ECANShading.Canta.all) { ECanaRegs.Canta.all = ECANShad.Canta.all; } while (ECANShad.Canta.all);
是否有人遇到过这样的问题? 我缺少什么吗?
谢谢!