极客秀
搜索

不再使用软件SPI(I2C)了!STM32移植SPI驱动最破防的一次!

前言

前几日花了一块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时序的修正。

1.转载请保留原文链接谢谢!
2.本站所有资源文章出自互联网收集整理,本站不参与制作,如果侵犯了您的合法权益,请联系本站我们会及时删除。
3.本站发布资源来源于互联网,可能存在水印或者引流等信息,请用户擦亮眼睛自行鉴别,做一个有主见和判断力的用户。
4.本站资源仅供研究、学习交流之用,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。
5.联系方式(#替换成@):pm#vimge.com

  相关内容