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位混合传输吧?那么这个问题应该也会存在。

好了,这篇文章就到这了,大家有什么参考建议都可以写在下面的评论区,我们下篇见。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐