
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中断阻塞了。 但是我没有任何解决思路,请各位帮忙,不胜感激!如果提问有任何不完善,请提示我补充信息。 |
请问原子哥,STM32F407例程力,FFT测试章节里,计算时间统计正确吗?
我最近在用stm32f407做CAN通讯的回环+静默,但是现在显示可以成功发送数据,FIFO接收不到数据,这是什么原因啊
STM32F407读写U盘出现程序卡死问题
FW_H7 V1.12.1-HAL库DMA双缓冲配置
请教SPI用LL读取的问题
vscode如何使用CUBECTL
串口空闲+DMA接收GPS信号,空闲中断触发时间不对。
STM32F407ZGT6的SD卡通过DMA控制时,无法从外部SRAM取数据
求助:I2S通过DMA搬运后通过USB上传上位机,转为.wav文件后声音嘈杂,音质很差,基本听不出人声
STM32F407VET6 I2S 采用纯中断接收数据的问题
是的,我将
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后,解决该问题。