记一次SPI驱动调查

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

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

记一次SPI驱动调查_第1张图片

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通过拉管脚通知SOC停止时钟输出。

通过数据量分析,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发送中断,问题得以解决。

你可能感兴趣的:(Linux,单片机,stm32,物联网)