STM32驱动SPI LCD屏幕

LCD部分

  • 基础理论知识

1.1涉及ARM硬件资源简介

1.1.1 LCD中ILI934液晶控制器简介

本LCD内部包含有一个液晶控制芯片ILI9341,它的内部结构非常复杂。该芯片最主核心部分是位于中间的GRAM(Graphics RAM),它就是显存。GRAM中每 个存储单元都对应着液晶面板的一个像素点。它右侧的各种模块共同作用把GRAM 存储单元的数据转化成液晶面板的控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为一幅完整的图像。ILI9341的主要控制信号线和配置引脚,根据其不同状态设置可以使芯片工作在不同的模式,如每个像素点的位数是 6、16还是18位;可配置使用SPI接口、8080接口还是RGB接口与MCU进行通讯。MCU 通过 SPI、8080 接口或 RGB 接口与 ILI9341 进行通讯,从而访问 它的控制寄存器 (CR)、地址计数器 (AC)、及GRAM。

在 GRAM的左侧还有一个LED控制器 (LED Controller)。LCD为非发光性的显示装置,它需要借助背光源才能达到显示功能,LED控制器就是用来控制液晶屏中的LED背光源。

1.1.2液晶屏的信号线及 8080 时序

ILI9341 控制器根据自身的 IM[3:0] 信号线电平决定它与 MCU 的通讯方式,它本身支持 SPI 及 8080 通讯方式,本示例中液晶屏的 ILI9341 控制器在出厂前就已经按固定配置好 (内部已连接硬 件电路),它被配置为通过 8080 接口通讯,使用 16 根数据线的 RGB565 格式。内部硬件电路连 接完,剩下的其它信号线被引出到 FPC 排线,最后该排线由 PCB 底板引出到排针,排针再与实 验板上的 STM32 芯片连接,如图液晶屏引出的信号线。

STM32驱动SPI LCD屏幕_第1张图片

 

图一:液晶屏引出的信号线

写命令时序由片选信号 CSX 拉低开始,对数据/命令选择信号线 D/CX 也置低电平表示写入的是命令地址 (可理解为命令编码,如软件复位命令:0x01),以写信号 WRX为低,读信号RDX为高表示数据传输方向为写入,同时,在数据线 D[17:0](或 D[15:0]) 输出命令地址,在第二个传输阶段传送的是命令的参数,所以 D/CX 要置高电平,表示写入的是命令数据,命令数据是某些指令带有的参数,如复位指令编码为 0x01,它后面可以带一个参数,该参数表示多少秒后复位。

1.1.3模拟 8080 接口时序

ILI9341 的 8080 通讯接口时序可以由 STM32 使用普通 GPIO 进行模拟,对于具有 FSMC 外设的 高型号 STM32,还能直接使用 FSMC 接口实现 8080 时序,像访问内部变量一样控制液晶屏。

二、硬件设计

4.3 LCD功能设计与实现

屏幕的 PCB 底板引出的信号线会通过 PCB 底板上的 FPC 接口与液晶面板连接,这些信包括液晶 控制相关的 CS、RS 等信号及 DB0-DB15 数据线,其中 RS 引脚以高电平表示传输数据,低电平 表示传输命令;另外还有引出 LCD_BK 引脚用于控制屏幕的背光供电,可以通过该引脚控制背 光的强度,该引脚为低电平时打开背光。如图为LCD原理图STM32驱动SPI LCD屏幕_第2张图片

 

图二:LCD原理图

三、软件设计

4.2 LCD显示的功能设计与实现

4.2.1串行模式驱动LCD

1.首先CS片选一直为高电平期间,LCD可接受数据或指令。

2.随后,单片机要给出数据传输起始位,这里是以5个连续的“1”作数据起始位,如模块接收到连续的5个“1”,则内部传输被重置并且串行传输将被同步。

3.紧接的两个位指定传输方向(RW,用于选择数据的传输方向,1是读数据,0是写数据)以及传输性质(RS,用于选择内部数据寄存器或指令寄存器,0是命令寄存器,1是数据寄存器)最后的第8位固定为“0”。到此第一个字节/数据传输起始位发送完成。

4.在接收到起始位及“RW”和“RS”的第1个字节后,之后便开始传输指令或者数据,在传输过程中会进行拆分处理,该字节将被分为2个字节来传输或接收。

5.你想发送的数据或指令的高4位,被放在发送的第2个字节串行数据的高4位,其低4位则置为“0”;数据或指令的低4位被放在第3个字节的高4位,其低4位也置为“0”,如此完成一个字节指令或数据的传送。

6 完成一个字节数据的发送需要24个时钟周期 因为1个字节实际是发送了3个字节 (3x8)。只有在时钟线SCLK拉低时,数据线SID上的数据才允许变化,在时钟线SCLK高电平时,SID上的数据必须保持稳定。

4.2.2 LCD程序设计

LCD初始化:

1.在开电之后,首先要等待40ms以上,等待液晶自检,使LCD系统复位完成。

2.之后便是功能的设定选择基本指令集或者扩充指令集随后延时等待100us以上。

3.功能设定2 选择8bit数据流 或者 4bit数据流  随后延时37us以上。

4.开关显示是否打开显示开关随后延时100us以上。

5.清屏清空RAM并初始化光标位置随后延时10us以上。

6.进入模式选择也就是设定游标相对于上一个位置的移位默认为地址自动+1。

7.之后初始化完成,可以对LCD进行数据的写入或读取。

#define WRITE_CMD   0xF8//写命令  

#define WRITE_DAT   0xFA//写数据

 

//接口(SID: PE1  SCLK: PE0)

#define SID PEout(1)

#define SCLK PEout(0)

 

void lcd_GPIO_init()

{

       

  GPIO_InitTypeDef  GPIO_InitStructure;

 

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟

 

  //GPIOE0,E1初始化设置

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式

  GPIO_InitStructure.GPIO_OType = 

你可能感兴趣的:(单片机,stm32,嵌入式硬件)