一文彻底带你搞懂SPI通信原+TFT彩屏控制原理

306 阅读7分钟

大家好,我是 杰哥编程

一文彻底带你搞懂SPI通信原+TFT彩屏控制原理

驱动ic : st7735s (搞不懂立刻改名杰弟编程)

代码已经放在我的gitee仓库了 记得下载

欢迎关注我的Gitee仓库gitee.com/wrj12138/em…

uart

1 首先来讲讲什么是uart?

通用串行异步通讯协议
UART没有时钟信号,无法控制何时发送数据,
也无法保证双发按照完全相同的速度接收数据
所以UART为每个字节添加额外的起始位和停止位,
帮助同步接收数据 且事先达成波特率共识 实现同步
如9600 115200

2 这是uart传输一个字节的时序图

图片1.jpg Note:图中二进制11001010不等于16进制0x53 why?
因为串口通常会先发送最低有效位 大家可以看出串口什么缺点吗?
串口挺好 但缺点就是起始位和停止位要额外开销

spi

1 SPI是啥?

  1. SPI是一个同步的数据总线,它是用一个单独的时钟信号辅助一个单独的数据线和来保证发送端和接收端的完美同步
  2. 特点:一主多从 主机提供时钟 ,3线: 时钟 发送 接收 + 片选
    MISO也可以是SIMO,DOUT,DO,SDO或SO(在主机端);
    MOSI也可以是SOMI,DIN,DI,SDI或SI(在主机端);
    NSS也可以是CE,CS或SSEL;
    SCLK也可以是SCK
  3. 数据bit位采集依赖于?: 根据你的配置 有2种 时钟信号的上升沿或下降沿
    根据前面讲到的串口通信方式 可以加强对spi的通讯机制的理解\

图片2.jpg Note: SPI是“全双工”(具有单独的发送和接收线路),
因此可以在同一时间发送和接收数据,另外SPI的接收硬件可以是一个简单的移位寄存器。
这比异步串行通信所需的完整UART要简单得多,并且更加便宜

2 SPI通信协议

  1. 前面讲到的数据bit位采集依赖 就是spi的时钟极性和相位 在单片机里是2个寄存器 可以配置
    不过没必要纠结 基本默认低电平空闲,上升沿采集
    放个图看看就知道了\

图片3.jpg 2. 主机时钟频率由单片机系统频率变化而来 你想要多少就多少 只要能配的到,
客机的频率来自于主机 但不是想要多少就多少 一般客机手册里会讲到可接受时钟频率范围 3. 如何多从机 靠第四条线 NSS ,就是个gpio输出口
每个客机有独立的NSS线 不重复
拉低哪个客机的CS 就跟哪个客机传输数据
目前先了解这种接法就行了
如果以后你们接触了一些行业
可能会有非常花式的接法

3 SPI优缺点


  1. 使SPI作为串行通信接口脱颖而出的原因很多;
    全双工串行通信;
    高速数据传输速率。
    简单的软件配置;
    极其灵活的数据传输,不限于8位,它可以是任意大小的字;
    非常简单的硬件结构。从站不需要唯一地址(与I2C不同)。
    从机使用主机时钟,不需要精密时钟振荡器/晶振(与UART不同)。不需要收发器(与CAN不同)。

  2. 没有硬件从机应答信号(主机可能在不知情的情况下无处发送);
    通常仅支持一个主设备;
    需要更多的引脚(与I2C不同);
    没有定义硬件级别的错误检查协议;
    与RS-232和CAN总线相比,只能支持非常短的距离;

SPI-1.44TFT彩屏

1 TFT1.44SPI彩屏色彩

  1. 常见彩色编码方式有rgb565 16bit和RGB888 24bit
  2. 玩过相机或者ps的就知道除了rgb颜色空间 还有很多种
  3. Tft spi屏是rgb565 因为rgb565所需存储空间更少 更为常用于资源少的嵌入式设备中

不扯那么多了 反正就是tft屏显示是彩色的 用的彩色编码方式是rgb565 和我们之前玩的lcd1602 i2c_oled画图写字编码是一样的 只是多了一些颜色深度而已。(RGB,CMY,HSV,HSL,Lab,YUV等等)

2 TFT1.44SPI彩屏引脚

  1. 引脚有5V、GND、时钟clk、发送mosi、片选CS、复位RST、悬空NC、背光BLK
  2. 为了方便可移植 基本你买这种单片机可以控制的小屏幕都是用gpio软模拟spi、到哪都能用 除极个别变态性能单片机。
  3. 就有人问了 既然传输涉及到时钟,
    没有精准定时的情况下,io软模拟快了or慢了怎么办 ?

3 TFT1.44SPI彩屏时序

这就是前面说的spi从机是有可接受范围的 
看手册 这款彩屏的控制芯片叫ST7735S  
大概看一下会看到有串行2线iic控制和3线spi控制  并行的8080控制和6800控制 
我们直接看4线spi控制的内容 就能看到他的相关介绍

图片4.jpg

图片5.jpg

4 TFT彩屏控制

  1. 刚才放了spi时序图用Gpio软模拟spi
  2. 刚才又放了tft时序图让大家看到写入tft的两种方式 写寄存器和写数据(驱动)
  3. 有了最底层的两个函数以后
    3.1 要初始化-看手册
    3.2 要和贪吃蛇一样要有光标定位功能 SetCursor(x,y)
    3.3 要有打印函数能写入点 点的颜色能指定 printw(color)
  4. 基于以上即可实现tft彩屏显示
  5. 画图要把图片所有像素点色彩信息转成rgb565模式
  6. 写字要对字编码取模型
  7. 所有功能实现完 就是代码框架的优化了 需要对整个流程的有一定熟悉 后通过某种组合or算法 使代码达到更快的运行效率

结语

然而这些都不用你们来做 厂家已经给出驱动库了
如果你们写linux驱动就是把这些函数和linux某些驱动框架进行融合就可以 如果是单片机裸机把底层接口对上就行

一篇SPI博客说的结语

(感谢这个博主这个ppt也是很大一部分借鉴他的)
底层建筑搭得好不好往往决定了上层建筑的好坏。之前已经实现在屏幕上画点,但是这仅仅是小小的实验而已,实际使用时我们通常用TFT来显示一些文字和图片,显示文字和图片就涉及到一些算法了,这一部分的好坏往往取决于设计者的软件水平,而作为嵌入式设计这也是最核心的部分,和硬件相关的部分仅仅是为上层建筑搭建根基,但是有根基还是不能够住人的,底层设计的好坏才是决定这个设计的总体价值。而一个优秀的嵌入式工程师总能够将整个系统的差异局部化和最小化,以提高系统的移植性去适应不同的底层建筑。当然市面上越来越多的嵌入式系统都将器件的差异集中到一部分,还有各种解决方案的推出为嵌入式开发者提供了更大的便利。

程序设计一般思路

  1. 自上而下站在最高层,从最高点出发依次往下设计,首先规划中断和资源->状态机建模->确定接口,用模拟实现的方法将程序模块化->最后完善事件处理程序优点:思路清晰
  2. 自下而上从硬件底层出发,一步步完善硬件驱动->控制寄存器来达到需要的效果->将驱动程序封装,确定接口->完善模块优点,底层设计完善,易调试
  3. 最后注意函数封装、可重入性、移植性、模块之间的耦合性熟能生巧,只有多练习才能有所提高,光说不练只会原地踏步