LCD与CPU的接线分控制线和数据线,控制线一般基于SPI协议,我们初始化LCD的寄存器就是通过这个,在主芯片的输出格式固定的前提之下,调LCD也就是剩下始化寄存器而已,一般LCD移植,我们就是要关心这部分;数据线就是用来传送像素数据到LCD,这部分一般不需要我们来控制了,只要接线没问题,一般就是OK的。 我一直不解既然这部分是定死的代码,为何不有IC厂商做成firmware,这样岂不能省出控制线部分,有位老兄这样解释:
我们可以从另一个角度来看,初始化寄存器的数值充其量也就十几B,远远达不到1KB。如果仅仅为这几十B的数据而添加一个存储设备,无形中增加了成本。所以很多LCD在使用之前都需要初始化其寄存器。呵呵,技术上讲不通的,都是因为COST DOWN。
下面针对ILI9481DS的driver ic 讲解一下控制部分也就是SPI部分,下面是ili9481ds SPEC 的Serial Interface时序图:
从上图可以提取以下信息:
1)SCL的上升沿LCD 读取数据,下降沿SDA上的电平变化
2)传输单位为9bit,其中第一个bit 用来区分下面的8bit是command还是data, 第一个bit为0则是cmd,为1这是data
于是代码如下,分发命令和数据两个函数:
发命令的函数
static void ILI9481DS_spi_write_cmd_byte(u8 val) { int i; gpio_set_value(spi_cs, 0); //"Low" enable gpio_set_value(spi_sclk, 0); gpio_set_value(spi_sdi, 0); udelay(1); gpio_set_value(spi_sclk, 1);//clk产生上升沿,读取sdi电平为0,根据spec下面的8bit是command而不是data udelay(1); /*取val二进制的各位,并通过sdi发送出去*/ for (i = 0; i < 8; i++) { /* #1: Drive the Data (High or Low) */ gpio_set_value(spi_sclk, 0); if (val & bit_shift[i]) // gpio_set_value(spi_sdi, 1); else gpio_set_value(spi_sdi, 0); /* #2: Drive the Clk High and then Low */ udelay(1); gpio_set_value(spi_sclk, 1);//clk产生上升沿,从机会读取sid上的电平 udelay(1); } /*FIXME: Idle state of sdi should be low */ if (gpio_get_value(spi_sdi)) { gpio_set_value(spi_sdi, 0); } gpio_set_value(spi_cs, 1); //disable LCD chip }
发数据的函数
static void ILI9481DS_spi_write_data_byte(u8 val) { int i; gpio_set_value(spi_cs, 0); //"Low" enable gpio_set_value(spi_sclk, 0); gpio_set_value(spi_sdi, 1); // data udelay(1); gpio_set_value(spi_sclk, 1);//clk产生上升沿,读取sdi电平为1,根据spec下面的8bit是data而不是command udelay(1); /*取val二进制的各位,并通过sdi发送出去*/ for (i = 0; i < 8; i++) { /* #1: Drive the Data (High or Low) */ gpio_set_value(spi_sclk, 0); if (val & bit_shift[i]) // gpio_set_value(spi_sdi, 1); else gpio_set_value(spi_sdi, 0); /* #2: Drive the Clk High and then Low */ udelay(1); gpio_set_value(spi_sclk, 1);//clk产生上升沿,从机会读取sid上的电平 udelay(1); } /*FIXME: Idle state of sdi should be low */ if (gpio_get_value(spi_sdi)) { gpio_set_value(spi_sdi, 0); } gpio_set_value(spi_cs, 1); //disable LCD chip }
两个函数的区别仅仅是红色标识部分!
补充一点,关于通过SPI写入lcd的数据,什么是cmd什么是data,可以看一下这个帖子
http://www.52rd.com/bbs/Detail_RD.BBS_214230_5_1_1.html
LCD的SPI接口分析
最新推荐文章于 2024-09-26 15:41:03 发布