
NXP的1176作为主机,STM32F405作为从机,通信波特率为8.3MHz左右。cubeMX配置如下,开启了SPI中断。 每次进入HAL_SPI_TxRxCpltCallback(),都通过IO输出一个脉冲信号,如下图第二行所示。第一行为定时器6溢出回调函数的脉冲,第四行是SPI时钟信号。可以从图中看出,第四个时钟信号结束后,没有触发HAL_SPI_TxRxCpltCallback。且定时器中断在188.54ms处停止触发,一直到189.7ms处,HAL_SPI_TxRxCpltCallback出发后才恢复。又因为所配置的SPI中断优先级高于定时器中断优先级,我推测,由于某些原因导致通信结束后,SPI中断阻塞了。 但是我没有任何解决思路,请各位帮忙,不胜感激!如果提问有任何不完善,请提示我补充信息。 |
STM32U575 SPI&GPDMA
L9663驱动开发
在CUBEMX生成的STM32F407VET6的I2S主机接收模式与I2S主机发送模式能正常运行,如何进行动态调整或者如何实现主机全双工?
STM32F407 多机RS485串口通讯+地址位唤醒+DMA空闲线接收,无法进入中断服务程序。
设置RDP等级为2的同时,有什么办法可以确保后续还能够烧录程序
STM32F407VET6 I2S 采用DMA传输问题
有STM32F4倒车雷达响应例程吗?
STM32F429I倒车雷达响应
STM32N6570-DK开发板,哪里还有卖的?
STM32多通道FFT运算异常
是的,我将
SPI_EndRxTxTransaction
函数中的等待BSY位的阻塞部分注释掉,就不再发生这个情况了。看注释,需要修改宏
SPI_BSY_FLAG_WORKAROUND_TIMEOUT
的值,用来匹配1字节的通信时间。我们的波特率为8MHz左右,那么通信1字节需要1us左右。而HAL库默认是1000us,因此经常在此阻塞,直到超时,或者到下一帧的第一个字节被HAL库接收。line217 #define SPI_DEFAULT_TIMEOUT 100U
line218 #define SPI_BSY_FLAG_WORKAROUND_TIMEOUT 3U /*!< Timeout 1000 µs */
定时器中断频率是100us,SPI通信频率是1kHz。
那如果怀疑阻塞了,那就先屏蔽可能阻塞的代码(比如某些中断),反向验证一下。
你可以检查下代码里到底开启哪些中断,各种中断优先级是怎样安排的?
SPI中断为优先级组4的优先级0,应该不会有其他应用能够抢占它。
仔细阅读了源码,并经过验证,阻塞来自于文件
stm32f4xx_hal_spi.c
中的函数SPI_EndRxTxTransaction()
。它在判断BSY位时阻塞,函数中的注释如下。意思是需要将宏
SPI_BSY_FLAG_WORKAROUND_TIMEOUT
的值修改为SPI通信一个字节的时间长度。本工程的SPI波特率为8MHz左右,也即一个字节通信周期为1us左右。而该宏的默认值为1000us,因此偶尔出现一下两种情况。一是阻塞时间较长(850us+),二是中断阻塞,直到第二帧第一字节被HAL库接收。修改该宏的值为3us后,解决该问题。