最近调试stm32l4的spi接口遇到一个怪异的问题,条件如下:
stm32l4 mcu通过SPI接口与另一块ambiq的mcu通讯,其中ambiq做SPI master,stm32l4做SPI slave,另外有几个直连IO做握手信号,两个单片机都使用DMA的方式以释放CPU的占用。
ambiq-->stm32方向上,通讯正常
stm32-->ambiq方向上,通讯偶尔会出现异常,现象为stm32的dma发送完成中断可以正常触发,但是ambiq收到的数据不正确。
通过阅读stm32 reference manual,l4系列的SPI内置深度为4的FIFO,即启动发送时,DMA会将数据搬到SPI的FIFO中,而此时可能SPI master没有提供clk
更奇怪的是,SPI竟然没有发送完成的中断,需要主动去轮询状态位。对于低功耗的应用场景,发送完成就要进入低功耗模式,比如stop2等。
而且在使用HAL 库的过程中,发现SPI这个外设的DMA发送完成的中断回调函数中,竟然会有等待延时的操作,默认是100ms。
如果是Master模式可能影响不是很大,但是如果是slave模式,并且与其通讯的master未提供时钟,或者两者未匹配上时序,有可能造成在中断中等到300ms。
应对措施:
slave在发送时,多发送3个无效数据,然后使用DMA发送完成中断,并且将HAL库中中断回调函数的查询状态位给去掉。