|
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中断阻塞了。 但是我没有任何解决思路,请各位帮忙,不胜感激!如果提问有任何不完善,请提示我补充信息。 |
STM32F405ZGT6 批次22+ 问下这颗料,60度烘烤12小时后,出现鼓包,是怎么回事? 原厂有标准的烘烤温度范围 跟时长范围吗?
STM32H563的QSPI接口不能读取W25Q256的后128MB数据
STM32C5 HAL SPI CRC 错误无法触发错误回调
非官方开发板第一次下载成功,之后就各种失败
HAL 库建议支持GPIO 同时配置为AF 与外部中断 EXTI
STM32H5F/E 相比 STM32F4 系列最大的优势是什么?
ST TOF问题请教
SPI 发送数据需要等待哪些状态标志位?
STM32F4的SPI端口,如何实现多通道输入?
STM32F4标准库USB例程CDC_HID_Composite问题:第一次识别成功,后续插入电脑均识别失败
微信公众号
手机版
是的,我将
SPI_EndRxTxTransaction函数中的等待BSY位的阻塞部分注释掉,就不再发生这个情况了。看注释,需要修改宏
SPI_BSY_FLAG_WORKAROUND_TIMEOUT的值,用来匹配1字节的通信时间。我们的波特率为8MHz左右,那么通信1字节需要1us左右。而HAL库默认是1000us,因此经常在此阻塞,直到超时,或者到下一帧的第一个字节被HAL库接收。line217 #define SPI_DEFAULT_TIMEOUT 100Uline218 #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后,解决该问题。