RT1176 CAN为什么要在中断处理函数中关闭邮箱中断呢

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

RT1176 CAN为什么要在中断处理函数中关闭邮箱中断呢

69 Views
YueXia
Contributor I

我感觉很奇怪,为什么要关闭邮箱中断呢,在初始化中使能一次邮箱中断,不就可以一直等待控制器触发中断吗,我理解代码这样写是为了在当前邮箱没有处理完数据的时候先关闭中断,让下一包数据由另一个空闲邮箱接收,但在控制器自己的处理机制中,如果当前邮箱CODE为FULL状态,会有内部锁,锁住当前邮箱,再来数据会由另一个空闲态邮箱处理,当两个邮箱都是FULL状态时,会尝试去覆盖最后一个 使用的邮箱,但是邮箱处于锁定状态,数据会存储在SMB(隐式缓冲区,无法查看)中,此时查看CODE状态是溢出态

在我调试CAN驱动的时候发现,如果瞬时来了多包数据,这个关闭邮箱中断并清除中断标志位的操作有可能会出现异常,导致接收直接瘫痪,并且接收中断永远无法被触发了,我测试的现象是,多包数据到达时,邮箱1会处理不完,邮箱2去开始接收,等邮箱1处理完后,继续由邮箱1来接收数据,但某一次,邮箱1开始不接收任何数据,数据全部由邮箱2来接收,当邮箱2大量接收一阵数据后,邮箱2也不再接收数据,此时去查看寄存器对应的位,邮箱2的MASK位为0,但FLAG位为1,证明程序运行到了FLEXCAN_TransferFDAbortReceive函数来关闭了邮箱使能,但是不知道什么原因没有运行到FLEXCAN_ClearMbStatusFlags函数,后续排查很久没有找到问题出现的原因,希望能得到解答

我尝试注释掉中断处理中的disable MASK,并且在中断回调中也不再次enable MASK,我只在初始化中enable邮箱一次,后续测试发现,功能正常但我配置的两个接收邮箱,只有一个在一直接收,但是也没有丢包的情况出现

0 Kudos
1 Reply

31 Views
Gavin_Jia
NXP TechSupport
NXP TechSupport

Thanks for providing the detailed description.

I have no thoughts on why this phenomenon occurs for now and have submitted it for internal discussion. I'll synchronize it here as soon as there are new developments.

Best regards,
Gavin

0 Kudos