刚开始学LCD驱动,以为是通常的做法,就是GPIO来驱动LCD。但是不一样,这次是在FPGA板子上,SRAM来驱动LCD。查了些资料,这种方法类似于FSMA驱动LCD。
对于MCU总线来说,LCD只有2个地址,分别对应RS=0,RS=1两种情况。
1、RS=0 写命令
2、RS=1 写数据
Write_Reg分为2步:写命令(寄存器地址);写数据(寄存器数据)
Read_Reg分页2步:写命令(寄存器地址);读数据(寄存器数据)
所有的寄存器地址和寄存器数据,以及 GRAM数据都是通过数据线完成传输的,而不是SRAM的地址.这是容易搞混的一个地方.LCD的SRAM地址只有一根 ,就是RS。
因为我们是用SRAM驱动LCD,所以时序都是MCU自动完成的。开始的时候很不理解“自动”的含义,到后来查了些资料,稍微懂了一点。
读存储器一般是SRAM控制器使能片选CS,在地址总线上输出地址,RD=0,WR=1,然后存储器响应这些信号在数据总线上输出数据,然后SRAM在数据总线上读取该数据.
写存储器一般是SRAM控制器使能片选CS,在地址总线上输出地址,在数据总线上输出数据,RD=1,WR=0,然后存储器响应这些信号把数据总线上的数据写入内部存储单元.
#define SRAM_LCD_DATA ((uint32_t)0x60020000) //disp Data ADDR
#define SRAM_LCD_CMD ((uint32_t)0x60000000) //disp Reg ADDR
//写寄存器地址函数
void LCD_WR_REG(unsigned int index)
{
*(volatile uint16_t *) (SRAM_LCD_CMD)= index;
}
//写寄存器数据函数
void LCD_WR_CMD(unsigned int index,unsigned int val)
{
*(volatile uint16_t *) (SRAM_LCD_CMD)= index;
*(volatile uint16_t *) (SRAM_LCD_DATA)= val;
}
SRAM_LCD_CMD是写寄存器,此时RS=0,告诉LCD我在总线上输出数据的是寄存器的地址
SRAM_LCD_DATA是写数据,此时RS=1,告诉LCD我在总线上输出地数据是寄存器的数据或者GRAM的数据.
接下来说说SRAM_LCD_CMD和SRAM_LCD_DATA的地址确定。
首先是SRAM_LCD_CMD。这个要看LCD的CS管脚接到哪个SRAM的片选上面,由此来确定的基地址。
SRAM_LCD_DATA则是根据LCD的RS接到SRAM的哪根地址线上,还有一点就是屏的数据类型。
对于数据类型为8bit来说,如果RS接到A0上,SRAM_LCD_DATA = SRAM_LCD_CMD+1。An的话 则SRAM_LCD_DATA = SRAM_LCD_CMD | 1<
如果数据类型为16bit。那地址线中的1对应的是基址中的2byte。SRAM_LCD_DATA = SRAM_LCD_CMD | (1<
需要 将RST管脚先拉低至少1ms 然后再拉高。这就意味着reset需要接在板子的复位key上。
2、LCD屏的数据类型是16bit。贴上一图,
这个表上表达的意义是,当使用16位数据宽度的外部存储器时,内部的HADDR[25:1]被移位输出到外部总线A24~A0上,内部的HADDR[0]不输出。
A0不接,所以SRAM上的A1相当于A2,1 <
1 << (n+1)