FlexCAN EnhanceRxFifo应用偶发发送邮箱停发
-
问题描述
FlexCAN使用了EnhanceRxFifo来接收报文,偶发一个或多个发送邮箱停发。
检查停发的邮箱中CODE[0]位,发现是1。
存在问题的SDK版本
- YTM32B1MD1 1_3_1_HF001 以及 之前的版本
- YTM32B1ME0 1_3_1_HF001 以及 之前的版本
- YTM32B1HA0 1_3_1 以及 之前的版本
问题分析
-
Mailbox的CODE[0] 为BUSY标志,当报文处于move-in的过程中时,其BUSY标志会置1。(EnhanceRxFifo在move-in的过程中其内部逻辑判断也会影响到相应的邮箱。)
-
对于发送邮箱来说,其CODE[0] 的值应忽略。
而在SDK的flexcan_hw_access.c文件,FLEXCAN_SetTxMsgBuff() 和 FLEXCAN_SetRxMsgBuff()函数中:
“*flexcan_mb |= flexcan_mb_config;”该操作会先读再改再赋值进邮箱,期间如果刚好碰上CODE[0]位瞬间置1,则赋值进去的值会带上该1,这样就会设置错CODE值,导致后面该邮箱一直无法发送。解决方法
经IP深入调查:
对应的CODE[0]实际内存中的数据并没有被修改为1。只是在该期间读取CS状态时,CODE[0]返回了1的信号。
因此对于CODE直接赋值的操作是没有影响的。将FLEXCAN_SetTxMsgBuff()函数中对邮箱的”|=“ 操作改为直接赋值操作“*flexcan_mb = flexcan_mb_config;”
FLEXCAN_SetRxMsgBuff()也需要仿照FLEXCAN_SetTxMsgBuff()进行修改。更新方法:
下面附件中为flexcan_hw_access.c修改后的参考代码,直接替换老版本flexcan_hw_access.c文件为附件中的新版本即可:
flexcan_hw_access.zip
发帖前请查看
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...