硬件SPI控制ST7789V「建议收藏」

文章目录前言一、能用的方法有那些?1.利用硬件UART模拟SPI,实现9位数据发送2.搭建一个数字逻辑电路,人为实现9位spi发送3.发送两组8位SPI二、具体操作1.具体实现总结前言这段时间闲着没事,决定自己做个手表玩玩,参考了一些开源项目和数据手册,决定主控使用STM32F411CEU6,屏幕选用了淘宝一家商家的ST7789V主控的240*240分辨率的圆形tft屏幕。利用商家给的软件spi例程成功将屏幕点亮之后,尝试使用改为硬件spi的方式,加快屏幕的刷新速度但是尝试了多种方案后始终无法点亮,

大家好,又见面了,我是你们的朋友全栈君。


前言

这段时间闲着没事,决定自己做个手表玩玩,参考了一些开源项目和数据手册,决定主控使用STM32F411CEU6,屏幕选用了淘宝一家商家的ST7789V主控的240*240分辨率的圆形tft屏幕。利用商家给的软件spi例程成功将屏幕点亮之后,尝试使用改为硬件spi的方式,加快屏幕的刷新速度但是尝试了多种方案后始终无法点亮,后来查看了例程和ST7789V的数据手册才发现。和一般的屏幕不一样,ST7789V使用了9位spi的格式,通过第一位的0和1代表了当前发送的是命令还是数据。而STM32F411CE只能使用8或者16位SPI。而软件SPI的速度过慢,因此开始了相关的研究,有了本文。


一、能用的方法有那些?

发现这一问题后,通过上网查询资料以及和学长进行讨论等途径,大致确定了一下三种方案

1.利用硬件UART模拟SPI,实现9位数据发送

这一思路的来源是一篇博客,连接如下:https://www.cnblogs.com/libra13179/p/7064321.html
博主是利用了UART的同步模式和SPI协议时序图非常相似这一特点,实现了9位SPI数据的发送,这种方法可以通过调节波特率的方法实现SPI发送速度的调节。配合DMA的话应该可以达到一个比较理想的速度。

2.搭建一个数字逻辑电路,人为实现9位spi发送

光看名字大家可能有点没理解什么意思,因此给大家做个详细的说明,一般的屏幕都会采用5线spi的方案,简单来说就是MOSI(数据线) 、RES(清屏线)、CS(片选信号线)、W/R(读/写控制线)、RS(数据/命令控制线)(不同的屏幕叫法不一样,但大致都有着五种)其中可以通过控制RS线的高低来控制当前spi总线发送的8位数据是命令还是数据。所以我们可以通过搭建数字电路的方式,将一根信号线的高低,人为的模拟成9位SPI数据中的第一位,控制之后的8个数据位的含义位数据还是命令。后面8位数据使用标准硬件SPI发送模式。配合DMA,应该还是可以获得一个比较不错的效果。至于数字逻辑电路,我觉得理论上一个与门应该就可以实现。

3.发送两组8位SPI

这个思路的来源是在扒论坛的时候找到的,9位SPI这种奇奇怪怪的协议相信屏幕驱动公司自己也知道没有多少MCU支持,所以也针对这一问题进行了适配。我们可以在CS不断开的情况下连续发送两组8位的SPI 数据,后面的7位SPI数据不用管,只要前9位SPI数据是严格按照屏幕驱动IC的数据进行发送数据即可。总的来说,这种方法是本文讨论的3种方法种最简单的一个了,不需要任何多余的硬件电路,也不需要占用其他外设进行模拟。但缺点也很明显,16位数据种有7位数据为无用位,有大约40%的性能浪费。

二、具体操作

1.具体实现

上文中讨论了3种理论上可行的方案,由于时间有限,这里我测试了最后一种方案,其他两种方案等日后进行测试再发文章和大家交流。话不多说直接上代码


/** * @brief 写命令到LCD * @param cmd —— 需要发送的命令 * @return none */
void WriteComm(unsigned char i)	  //spec page 46
{ 
   
		uint16_t com = 0;
		uint8_t com1,com2;
   		LCD_CS(0);
		com = i;
		com = com<<7;
		com1 = (com&0xff00)>>8;
		com2 = (com&0x00ff);		
		SPI_WriteByte(&com1,1);
		SPI_WriteByte(&com2,1);
   		LCD_CS(1);
}


/** * @brief 写命令到LCD * @param cmd —— 需要发送的命令 * @return none */
void WriteData(unsigned char i)
{ 
   
		uint16_t data = 0;
		uint8_t data1,data2;
   		LCD_CS(0);
		data = i;
		data = data<<7;
		data |= 0x8000; 
		data1 = (data&0xff00)>>8;
		data2 = (data&0x00ff);		
		SPI_WriteByte(&data1,1);
		SPI_WriteByte(&data2,1);
   		LCD_CS(1);
}

代码部分其实比较简单,就是利用c语言的位运算进行了一些计算实现的。我们需要发送的值存储在i这个变量中传入函数,但是i为uchar,只有8位,所以首先需要把i赋值给16位的data/com变量。接着,把data/com左移7位,空出后7位无用数据位。接着如果我们希望表明需要发送的8位是代表数据,需要将spi传输的第一位数据置1,也就有了WriteData()函数的 data|= 0x8000。利用或运算的方式,将第一位置1。

经过测试,这方法配合硬件SPI可以实现ST7789V 9位SPI的控制。同时,由于F411的硬件SPI速度可以达到50M,虽然有40%的性能损失,但总体上还是可以接收的。不过通过示波器测量发现,SPI数据发送的速度虽然很快,大约有50M,但是每一组数据相互之间会相差很多,每组数据的发送频率大约需要400K,这个问题第一点应该是我没有使用DMA进行传输,所以速度相对比较慢,而且我也没有使用SPI的16位传输模式进行传输,同时,由于我目前是测试方案可行性,使用的是HAL库,效率有点低,如果手写寄存器进行改进了之后,应该性能会提升很多。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了SY7789V 9位SPI可能的解决方案,实验了其中的一种,效果基本满意,希望能为遇到同样问题的朋友一些帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127349.html原文链接:https://javaforall.net

(2)
上一篇 2022年4月9日 下午4:20
下一篇 2022年4月9日 下午4:40


相关推荐

  • UCI数据集详解及其数据处理(附148个数据集及处理代码)

    UCI数据集详解及其数据处理(附148个数据集及处理代码)摘要 本文对机器学习中的 UCI 数据集进行介绍 带你从 UCI 数据集官网出发一步步深入认识数据集 并就下载的原始数据详细讲解了不同类型的数据集整理如何通过程序进行整理 为了方便使用 博文中附上了包括数据集整理及数据预处理在内的所有代码及处理好的数据集 同时对代码进行了解释 其要点如下 UCI 数据集介绍 不同数据集的整理程序 148 个整理好的数据集与对应程序

    2026年3月17日
    2
  • 5 分钟图解 磁盘的结构(盘片、磁道、扇区、柱面)

    5 分钟图解 磁盘的结构(盘片、磁道、扇区、柱面)文章目录磁盘的结构盘片磁道 扇区柱面磁盘的物理地址磁盘的结构盘片一个磁盘 如一个 1T 的机械硬盘 由多个盘片 如下图中的 0 号盘片 叠加而成 盘片的表面涂有磁性物质 这些磁性物质用来记录二进制数据 因为正反两面都可涂上磁性物质 故一个盘片可能会有两个盘面 磁道 扇区每个盘片被划分为一个个磁道 每个磁道又划分为一个个扇区 如下图 其中 最内侧磁道上的扇区面积最小 因此数据密度最

    2026年3月17日
    3
  • 25 万 Stars:OpenClaw 超越 React,成为 GitHub 上 Star 数最多的软件项目

    25 万 Stars:OpenClaw 超越 React,成为 GitHub 上 Star 数最多的软件项目

    2026年3月13日
    2
  • JavaScript高级程序设计(读书笔记)(七)[通俗易懂]

    JavaScript高级程序设计(读书笔记)(七)[通俗易懂]本笔记汇总了作者认为“JavaScript高级程序设计”这本书的前七章知识重点,仅供参考。第七章函数表达式小结:在JavaScript编程中,函数表达式是一种非常有用的技术。使用函数表达式可以无须对函数命名,从而实现动态编程。匿名函数,也称为拉姆达函数,是一种使用JavaScript函数的强大方式。以下总结了函数表达式的特点。函数表达式不同于函数声明。

    2022年8月20日
    8
  • java vm参数设置_Java VM 启动参数详解

    java vm参数设置_Java VM 启动参数详解JavaVM 启动参数详解 Date2017 05 24 打印输出相关参数 verbose 打印加载类的详细信息 verbose gc 打印虚拟机中 GC 的详细情况 显示最忙和最空闲收集行为发生的时间 收集前后的内存大小 收集需要的时间等 XX HeapDumpOnOu XX HeapDumpPath home admin logs java hprof 虚拟机在出现内

    2026年3月19日
    1
  • 马赫带效应

    马赫带效应马赫带效应

    2026年3月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号