STM32F407关于SPI的16位传输问题
调试这个LCD给我都调试地怀疑人生了,最开始是时序有问题,然后又是8位和16位问题,给我人整麻了。说回SPI,我个人感觉即使清空SPIEN寄存器来关闭SPI后,STM32对总线的控制权还没有释放,我们仍需在清空寄存器后判断STM32对总线的控制权来判断总线情况,至于为啥稳定减3我感觉应该是最后2位被最新数据覆盖导致的。不过数据手册和勘误完全没有提到这个问题,真难顶啊。好了,这篇文章就到这了,大家有
1.前言
最近正在用407控制一块彩色LCD屏幕,通讯协议为SPI,商家给的参考程序会使用到8位和16位两种状态,因此我会在使用时转换8位和16位模式。
我用的全硬件SPI,硬件管理NSS管脚,每次传输完毕都检测缓冲区状态,总线状态,并关闭SPI,全流程跟着数据手册来的。


2.现象
下面我们来测试四组数据,0x3f,0x75,0x63,0x43,都使用16位模式。但是前两位没有切换8位,后两个数据切换8位和16位状态。

然后我们用逻辑分析仪抓一下波形

可以看到到0x63,0x43这两个值实际输出的值和程序里给的值并不一样。
根据我后面的测试,随着数据的增加,这个值会稳定减3,很奇怪
然后我们再仿真一下验证我们的看法,为了实现实际效果我重新修改程序,都切换8位和16位模式,并在0x43这个数加一个断点

我们看到仿真和波形图,数值明显不对了,0x63传入DR寄存器里已经变为0x62了,实际输出也是0x62。可以看到整个过程呈现出不可预测性。


但是,我们加了一个断点在43处,单步执行一下,我们看一下仿真和波形


可以看到数值没有问题
至此,基本可以确定是出现BUG了
3.解决办法
解决方法也比较简单,其一是再次确认状态寄存器,保证总线空闲状态

其二是连续使用SPI的16位模式,不要那么快切换8位和16位模式。

再次测试输出波形完全没问题

4.总结
调试这个LCD给我都调试地怀疑人生了,最开始是时序有问题,然后又是8位和16位问题,给我人整麻了。
说回SPI,我个人感觉即使清空SPIEN寄存器来关闭SPI后,STM32对总线的控制权还没有释放,我们仍需在清空寄存器后判断STM32对总线的控制权来判断总线情况,至于为啥稳定减3我感觉应该是最后2位被最新数据覆盖导致的。不过数据手册和勘误完全没有提到这个问题,真难顶啊。
至于说DMA的问题,DMA传输的数据完全对齐的,你不可能16位8位混合传输吧?那么这个问题应该也会存在。
好了,这篇文章就到这了,大家有什么参考建议都可以写在下面的评论区,我们下篇见。
更多推荐



所有评论(0)