事实上不止H723,起码我手上的H7B0也有类似的情况,可能全H7系列都是这种"特性"
使用cubemx配置好了外设,然后keil主函数里加上一句LL_SPI_Enable(SPIx)。一般情况下,SPI就可以正常收发了,但H7不一样,怎么往TXDR里面塞数据就是没输出,引脚一点波形也没有,看寄存器状态也不对,多塞几次状态寄存器就开始报错了。百度也没找到类似情况的解释,可能H7没什么人用LL库开发。经过排查,发现是H7的SPIx->CR1中有一个Communication Start控制位,只有这个位置1才能进行发送,也在驱动库里多了一个对应的函数LL_SPI_StartMasterTransfer(SPIx)。就这么一个小小的改动,让我折腾了许久。不是很能理解,有了Enable还加这么个二级开关意欲何为,即便是考虑到fifo啥的高级应用,可我根本没用FIFO啊,不应该默认使能吗。
可能有的人要说,上面怎么算坑了,明明是你技术不行,H7一直都这样。确实我H7用得少,也看不来冗长的参考手册。但下面要说的这个一定是坑。STM32H723的LL_SPI_SetDataWidth()函数,并不能在硬件层面限制数据宽度,但在某些情况下又必须得配置。如能
在使用LL_SPI_SetDataWidth把SPI配置为8bit后,如果给SPI->TXDR直接赋值一个任意位的常数,单片机都会以32bit去发送,如果要限定8bit或者16bit发送,需要调用LL_SPI_TransmitData16/LL_SPI_TransmitData8,或者使用强制类型转换标注需要发送的数据是多少bit。如果单片机不知道数据是多少宽度的,全部会以32bit发送。非常智能,但非常奇怪,那么LL_SPI_SetDataWidth这个函数意义何在呢,如果发送的数据宽度是以实际数据为主,那为何还要配置SPI?
在使用DMA发送的时候,只是从DMA这边配置发送端和接收端的宽度还不行,DMA实际搬运的时候会受到LL_SPI_SetDataWidth设置值的影响,例如,设置了通道两端都是8bit,但最后一次设置的SPI数据宽度是16bit,SPI实际还是会以16bit进行发送。
就是说,配置的一个参数,到底起到什么作用,得具体情况具体分析,而不能按照常见的思想去进行判断。坑坑坑