关于STM32F0单片机的SPI从机接收漏字节问题
关于STM32F0单片机的SPI从机接收漏字节问题
前几天因为一个对接的项目,用了STM32F030C8T6这个芯片,做了个双路SPI从机的板子,然后心血来潮,用了CUBEMX+LL库来开发。
结果,真的是惨的一比,资料少不说,还有坑在里面!
这两天在调试这个STM32F030的SPI从机接收问题可是头都大了,每次发送数据后都是会漏掉第一个字节,只能接收到第2个字节,网络上面的STM32F0系列的问题和资料也是少的可怜。
用逻辑分析仪上面都看了,还是找不到问题。
万般无奈之下,从C站下了份STM32F0的编程手册,外加STM32F0的LL库帮助文档,实验了一番才找到问题所在。
STM32F0编程手册:https://download.****.net/download/qq_26039331/10694606
STM32F0的LL库帮助文档:https://download.****.net/download/wzb56/3992594
首先,在编程手册,我找到了一段话
看到这里我已经隐隐知道是什么情况了,我刚好每次漏的都是第一个字节,收到第二个字节?
再看到这一段话,我基本可以确定问题就是FIFO 了。
翻阅帮助手册,果然找到了这个对应的设置。
上面的介绍也是相当简洁明了,设置触发RXNE的FIFO条件。
回到代码,我马上跑到stm32f0xx_ll_spi.h文件,找到了这个定义
这下问题就很明白了,这个完全是CUBEMX的漏洞。
CUBEMX里面设置数据宽度是8bit,但是并没有加上这一句
LL_SPI_SetRxFIFOThreshold(SPI2, LL_SPI_RX_FIFO_TH_QUARTER);
而单片机上电,默认的寄存器都是00,看.h文件就知道了,00默认是16bit,当我把这一句加上之后,问题就解决了。
最后感慨一下,CUBEMX虽然是很方便,但是很多细节还是没有到位,会导致很多问题,慎用。同时,解决问题要从最基本的寄存器和工作原理入手。