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进入boot里,通过DFU更新程序,没有识别到usb设备
STM32F407 USB怎么测试接口的极限速度
大佬们,请教有关串口通信问题
STM32F407ZGT6物料表面丝印问题
STM32F4作为SPI从机,在主机时钟结束后,MISO依然有输出。
stm32cubeide如何修改芯片型号和启动文件
CDC_Transmit_HS 卡死
修改stm32f407 tim14的ccr1,但是占空比不变?
修改stm32f407 tim14的ccr1,但是占空比不变
STM32IDE工程内如何访问、计算得到当前程序flash已经使用的情况?
是的,我将
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后,解决该问题。