前言
前几日花了一块STM32H5的板子,其中搭载了一款LCD触摸屏,驱动芯片采用的是ST7789,驱动方式是硬件SPI,虽然是硬件SPI,但是其实是软件片选,硬件传输的方式,即CS和DC的片选线还是依靠软件GPIO翻转来模拟的。
ST7789_Select(); ST7789_DC_Clr();
软件片选
在硬件SPI和软件SPI的对比中(包括I2C),软件SPI除了引脚灵活多变以外,实在想不任何能与硬件SPI相提并论的优势。
尤其在驱动显示屏这样子的高速率器件,必须是使用硬件SPI刷新才能获得流畅的屏幕画面以及尽可能少的占用系统资源。
而更要命的是,HAL的本身就是方便代码在不同平台之间的移植。这块显示屏在F4中经过了测试,但是当我移植到了H5上的时候反而问题频频出现。
在前一期视频的时候,之所以能点亮屏幕,原因是H5的时钟主频当时设置在80MHZ,SPI的速率则在约40MHZ。
可是H5的时钟主频最高是可以开到250MHZ的,当我将时钟主频修改为250MHZ的时候,神奇的事情出现了,屏幕驱动失效了。
原因探究
由于缺少调试设备(没有逻辑分析仪)我只能依靠经验来判断为什么会出现这个问题。
首要的原因自然是分析是不是由于时钟速度太快导致的SPI通讯失败。这点也是主要原因,ST7789的理论最高通讯速度是40MHZ,由于布线和电路特性,应该控制SPI的通讯速率在20~30MHZ左右比较合适。不过这点可以通过修改SPI对应的时钟实现。
修改时钟的分频系数来控制SPI的通讯速率,但是修改了这里的时间之后还是没有解决问题。经过多次的反复比较发现:在低主频的情况下屏幕可以正常的点亮与使用,高速率的情况下屏幕不能正常工作。
此时我强烈的怀疑,由于我使用的是软件片选模拟片选信号。而SPI的时序例如片选信号导通之后是需要一定的建立时间。
在低主频的情况下两个IO翻转语句之间的 ** 执行时间 ** 足够满足要求。但是由于主频的提高,单纯的依靠语句的执行时间以及不能满足要求了。
这个问题在我最早使用AD5933从F103移植到F407上面的时候也遇到过了这个问题。而今天没想到因为软件片选的原因又遇到了这个问题。因此尝试在片选信号之间人为的加上延时。
ST7789_Select(); HAL_Delay(1);//满足要求ST7789_DC_Clr();
添加延时满足要求
在不使用微秒级定时器的基础上,我们添加这类延时以满足系统要求。这样子我们就完成了对于软件片选SPI时序的修正。