记一次SPI驱动调查

当前TBOX方案主要采用MCU+OpenCPU架构,如下图所示:

摘自《单片机与嵌入式系统应用》《MCU+OpenCPU架构的车载TBOX 开发方案》。

MCU多采用S32K14X(S32K144/S32K146)处理器,OpenCPU多采用移远EC20模块。

MCU采集CAN数据,IO状态,传感器等数据发送给SOC。MCU和SOC可以通过低速UART口、高速UART(如1Mbps或者3Mbps)或者SPI通信。UART属于异步通信,双方在通信时不需要同步。SPI需要时钟信号,时钟信号由SOC给出。当SOC有数据需要发送时,直接产生时钟并发送数据;当MCU有数据发送时,需要通过另外一个IO管脚中断通知SOC输出时钟信号,有时钟信号后MCU才能发出数据。

在实际运行过程中,MCU出现了CAN数据量不是很多情况下,无法及时采集CAN数据,造成CAN数据接收丢失现象。调整SPI 发送中断和CAN接收中断优先级后(原有SPI中断优先级高于CAN接收中断优先级),CAN数据接收不再丢失,但是SPI数据无法及时发送出去,造成MCU SPI发送缓冲区满现象,丢失发送给SOC的数据。

MCU发送SPI数据流程为:MCU需要发送数据时,首先将数据放入到发送缓冲区中,然后拉管脚通知SOC产生时钟,开启发送中断和FIFO中断(共4个4字节FIFO,可配置FIFO小于某个值时产生中断)。因为FIFO为空,一开始便触发了中断,在中断里将SPI发送缓冲区中的数据填充到FIFO中,直到FIFO满不再触发中断。待SOC产生SPI时钟时,MCU SPI FIFO中数据自动发送给SOC,此时再产生FIFO中断,直到MCU SPI 缓冲区数据全部发送完毕。

通过数据量分析,MCU SPI数据量不应该造成CAN接收丢失。怀疑SPI发送中断影响了CAN中断数据接收。为了验证猜测,在MCU SPI发送中断内加入IO管脚电平切换,通过逻辑分析仪抓取该管脚状态,同时抓取SPI时钟及MISO(MCU输出,MCU为slave,SOC为master),MOSI管脚状态。通过CAN接收数据丢失时刻找到对应时刻的SPI状态,发现当时触发了很多SPI中断,但此时并没有SPI数据接收和发送,也没有时钟信号,至此怀疑SPI中断问题。

通过查看SPI中断函数并没有发现什么明显错误,查看该部分数据手册和对着多个波形图,最后找出原因:触发SPI FIFO中断时,SPI 发送缓冲区中没有数据造成了FIFO中断一直触发,CAN接收中断优先级低,无法运行。在正常情况下,SPI发送缓冲区中数据正好是4个FIFO个字节对齐,满足4个FIFO内容,不会出现该现象。当运行到某一刻时,SOC先发送数据,先给出了时钟,在几个时钟后,MCU SPI发送缓冲区中有数据填入到FIFO,造成了该次MCU SPI发送缓冲区中数据不能是4个FIFO字节对齐,而SPI发送中断关闭条件是FIFO中无数据(而不是SPI发送缓冲区中无数据),此时FIFO中一直有数据,但4个FIFO一直不满(SPI 发送缓冲区没有了数据),造成一直进入中断。

解决:将SPI 发送中断禁能结束条件改为SPI 发送缓冲区中无数据时关闭SPI发送中断,问题得以解决。

版权声明:本文为CSDN博主「dsfire」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zisehuoxia/article/details/121879351

生成海报
点赞 0

dsfire

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

4路红外循迹模块使用教程

4路红外循迹模块使用教程 个人原创博客:点击浏览模块详细信息: 工作电压:DC 3.3V~5V 工作电流:尽量选择1A以上电源供电 工作温度:-10℃~50℃ 安装孔

拉绳位移传感器在接线时需要注意哪几点?

拉绳位移传感器在接线时需要注意哪几点? 1、拉绳位移传感器在接线时务必确认在电源关闭的情况下进行接线,接线应采用锡焊工艺,各引脚应焊接牢固,避免虚焊情况发生。焊接各引脚时应严格按照传感器厂

[STM32学习]——一文搞懂I2C总线

目录 I2C总线的概念 I2C最重要的功能包括: I2C的物理层 I2C主要特点: I2C的高阻态 I2C物理层总结: I2C的协议层 初始(空闲)状态 开始