LCD的SPI接口分析

         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


 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值