LCD的SPI接口分析_spi lvd-程序员宅基地

技术标签: byte  cmd  存储  interface  command  Android  

         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


 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhangchiytu/article/details/6659899

智能推荐

uni-app创建并运行微信小程序项目_用uniapp写一个微信小程序-程序员宅基地

文章浏览阅读5.5k次,点赞4次,收藏13次。打开HBuilder X,点击文件,选择新建一个项目首先点击HBuilder X菜单栏工具下面的设置,然后在运行配置里面设置微信开发者工具的安装路径在微信开发者工具中,点击设置下面的安全设置,然后开启服务端口最后在HBuilder X运行配置中填写web服务调用URL(本地IP+端口号)点击运行到小程序模拟器,微信开发者工具即可正确运行运行结果如下转载自:https://blog.csdn.net/weixin_39150852/article/detai.._用uniapp写一个微信小程序

衡量两个向量的距离_向量长度不同可以计算距离吗-程序员宅基地

文章浏览阅读3.2k次。nA, inB 对应的是 列向量欧氏距离:指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。二维或三维中的欧氏距离就是两点之间的实际距离。相似度= 1/(1+欧式距离)相似度= 1.0/(1.0 + la.norm(inA - inB))物品对越相似,它们的相似度值就越大。皮尔逊相关系数:度量的是两个向量之间的相似度。相似度= 0.5 + 0...._向量长度不同可以计算距离吗

编程之美-不要被阶乘吓到_编程阶乘难理解-程序员宅基地

文章浏览阅读497次。求N!的二进制表示中最低位1的位置。 最笨的莫过于对N!直接移位了,然后找到1的位置。[cpp] view plaincopyprint?#include using namespace std; const int N=6; int Factorial(int N) { if(N>1) { return N*F_编程阶乘难理解

Linux基础知识学习——第三天:firewall防火墙的关闭。_firewall 关闭-程序员宅基地

文章浏览阅读1k次。Linux基础知识学习——第三天:firewall防火墙的关闭。_firewall 关闭

管理学总论之管理活动、管理思想和古典管理理论_让学生了解“组织”的概念从古典管理思想,中国古代管理思想的逻辑体系到现代管理-程序员宅基地

文章浏览阅读2.9k次。早期的管理活动和管理思想一、古罗马帝国的卓越组织古罗马帝国之所以兴盛,在很大程度上应归功于卓越的组织才能,他们采取了较为分权的组织管理形式,从一个小城市发展成为一个世界帝国,在公元2世纪取得了统治欧洲和北非的成功,并延续了几个世纪的统治。二、中国古代的管理实践 在中国古代典籍中也有不少有关管理思想的记载,如《周礼》中记有对行政管理制度和责任的具体叙述。《孟子》、《孙子》等书对管_让学生了解“组织”的概念从古典管理思想,中国古代管理思想的逻辑体系到现代管理

css sprite-程序员宅基地

文章浏览阅读169次。  雪碧图是优化网站性能的一个重要手段;    开发中,我们常常遇到这样的问题:一大堆的小icon图标,比如个性化的箭头、按钮等;当加载网页时,则要一个个地加载这些小图标,每一个小图标都需要http请求,这增加了网络延迟的可能;  假设把这些小图标都放到一张图片中,使用的时候直接获取图片对应位置上的图标,那么网页加载时只需要请求这一张图片,显然这种方式减少了http请求;cs..._b) css sprite with sass resource traditional css sprite with a sass styleshe

随便推点

android 简单封装上拉刷新,下拉加载功能_封装刷新加载功能 android-程序员宅基地

文章浏览阅读382次。从开源中国控件里而来,并自己改进一些功能BaseRecyclerRefreshLayout:主要用于控制全局的手势是否上拉刷新,正常滑动,下拉加载三种情况.手势控制源头public class BaseRecyclerRefreshLayout extends SwipeRefreshLayout implements SwipeRefreshLayout.OnRefreshListener..._封装刷新加载功能 android

信号量实现经典同步问题之生产者消费者问题_用信号量解决经典同步问题的方法生产者消费者问题,-程序员宅基地

文章浏览阅读2.5k次。目录1.生产者消费者问题1.1.问题分析1.2.如何实现2.多生产者多消费者问题2.1.问题描述2.2.问题分析2.3.如何实现1.生产者消费者问题1.1.问题分析1.2.如何实现2.多生产者多消费者问题多是指多类别的生产者和消费者,生产者生产不同产品,消费者消费不同产品。2.1.问题描述2.2.问题分析2...._用信号量解决经典同步问题的方法生产者消费者问题,

救星来了前端标注工具 实现图片 图像标注 多边形 矩形 画笔 缩放 线段 等功能 的插件 AILabel.js_vue图片标注插件-程序员宅基地

文章浏览阅读9.6k次,点赞9次,收藏73次。一、网址以及demo官方文档:http://ailabel.com.cn/public/ailabel/api/index.html#1demo地址1: http://ailabel.com.cn/public/ailabel/demo/label/index.htmldemo地址2: http://ailabel.com.cn/public/ailabel/demo/index.html二、我的实例代码(vue环境下)三、如有不懂的添加官方qq群向大佬请教(378301400)<tem_vue图片标注插件

大数据系列修炼-Scala课程61_深入理解scala中的隐式转换系统 - 掌握了知识的本质,很多事情就简单了 - csdn-程序员宅基地

文章浏览阅读1.2k次。大数据系列修炼-Scala课程61核心内容: 1、Scala中的隐式参数与隐式转换的联合使用操作代码实战1、Scala中的隐式参数与隐式转换的联合使用def biggerT(implicit m:T=>Ordered[T]) = ……的含义: 1>bigger是一个泛型函数,并且是一个柯里化函数,并且函数的第二个参数是一个函数(隐式函数呢)。 2>m是一个隐式参数,这个隐式参数指向一个匿名函数_深入理解scala中的隐式转换系统 - 掌握了知识的本质,很多事情就简单了 - csdn

Hessian源码浅析-HessianProxy_hessinproxyutil-程序员宅基地

文章浏览阅读1k次。Hessian客户端主要是通过proxy代理来实现 当客户端调用远程接口方法时 会被HessianProxy 代理 HessianProxy invoke方法主要做以下工作1.把调用的 方法名称 参数 序列化2.通过HttpURLConnection向服务端发送调用请求3.服务端返回的结果 反序列化Proxy是由HessianProxyFactory创建HessianProx_hessinproxyutil

鹅厂老将被拒,蚂蚁金服嘲讽,JVM问了4道题,一道都答不上来,外包都没资格,Java界面试太刺激了_java外包面试答不上来-程序员宅基地

文章浏览阅读1.3w次,点赞10次,收藏17次。鹅厂老将被拒,蚂蚁金服嘲讽,JVM问了4道题,一道都答不上来,外包都没资格,Java界面试太刺激了!!!自从蚂蚁金服上市,IT界多了一批千万富翁后,去投奔的程序员愈发多了,进去了皆大欢喜,而折腾一圈还是没能入职的可就难过了。最难过的是下面这位,在简历环节就直接被刷的。个人履历还不错,在腾讯工作多年,转战二线小厂,技术扎实,但蚂蚁金服连面试机会都不给就拒了,给出的答复是“简历不合适”,惹得这位直呼“心生愤怒,倍感羞辱”。有人在他的帖子下评论:“阿里不要腾讯的人,换个说法拒绝而已。”“这个没什么_java外包面试答不上来