4线SPI彩屏局部刷屏偏移解决

            ——原来我早已经在成功的旁边了

最近在研究用低速、低RAM的单片机来驱动小LCD或TFT彩屏实现动画效果

首先我用一个16MHz晶振的m0内核的8位单片机nRF51822尝试驱动一个1.77寸的4线SPI屏(128X160),

发现,刷一屏大约要0.8s左右的时间,

具体收录在《1、一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO》中

觉得,如果用72MHz的STM32也许效果会好很多

于是在stm32上做了个类似的版本,

具体收录在《一个简单的stm32vet6驱动的天马4线SPI-1.77寸LCD彩屏DEMO》中

发现刷一屏0.2s左右,

效果是有的,但是还不能达到支持播放流畅动画的效果!

后来,又用stm32驱动一个2.4寸240X320的8位并口tft屏

具体收录在《一个简单的stm32vet6驱动2.4寸240X320的8位并口tft屏DEMO》中

这个尺寸比之前的1.77要大4倍,

所以即使采用8位并口速度还是没太大变化!

再后来,偶然发现采用单片机自带的硬件SPI速度回快很多(3-8倍)

这主要是因为硬件SPI把下面采用软件模拟的过程中不必要的移位、复制、电平翻转采用硬件给做了~(猜测)

 void SendDataSPI(unsigned char dat)
{
unsigned char i;
for(i = ; i < ; i++)
{
if( (dat & 0x80) != ) SDA_SET;
else SDA_CLEAR; dat <<= ; SCL_CLEAR;
SCL_SET;
}
}

尽管如此!还是不能实现大块大块图片的动画刷新效果~

于是灵机一动,也许采用16位并口+同时数据传输采用硬件刷屏速度会飞起来!

呵呵,其实是早就知道这个方法,也是最后的杀手锏了

如果是在不行DSP、FPGA得搬出来了~

其实上面这个想法有一个很霸气(拗口)的称呼——FSMC(Flexible Static Memory Controller,可变静态存储控制器)

也因此,我买了个土豪金屏幕——

只看该屏幕的介绍就知道人家不简单——(速度震四方!!!)


哈哈,扯远了!(开始说本节内容了哈~)

其实本节的重点不是展示这个速震四方的土豪屏,

而是一个突发bug的出现导致我不得不放下手中的土豪屏,专心搞BUG

BUG是这样的——

我拿到一个4线spi的220X176的屏幕,想写个驱动

本来应该是分分钟的事,可是遇到了一个坑了几天的问题:

拿到该屏幕及其资料如下:其中GC9201为其驱动IC,QTB2D0052和60是上面屏幕的规格书,只是外观大小稍有不同,压缩文件是一个包含简单demo的工程

http://pan.baidu.com/s/1eQRuP4u

① 在QT---52中找到对应引脚并设置好:

② 参考压缩文件的驱动,在驱动文件中实现了刷屏、绘制条带、显示帧、绘制渐变条带、绘制黑白格子、在屏幕中间显示一个黑色、绘制一点、绘制一条线、绘制一个网等LCD屏幕驱动函数~

 int main(void)
{
int x,y;
GPIO_Init();
LCD_Init(); // DrawGird(RED); while(<)
{
DispColor(GREEN);//刷屏
DispBand();//显示条带
DispFrame();//显示窗口
DispScaleVer();//渐变颜色
DispScaleVer_Red();//红色渐变
DispSnow();//黑白格子
DispBlock();//在中间显示一个黑色块,但是是全屏刷新 for(x=,y=;x<;x++,y+=)
{
PutPixel(x,y,BLUE);
} DrawLine(,,,,RED);
DrawGird(RED);
}
}

当时封装驱动在:http://pan.baidu.com/s/1bnX69Mf

③ 照理说参照厂家DEMO应该一气呵成的,可最坑爹的问题还就在不可能出现问题的地方【【【神坑】】】

当顺利测试完DispBlock()后,PutPixel(x,y,BLUE)函数总是不能把相应的点绘制对,然后我又试了DrawLine、DrawGrid,都出现了很大的问题

:::问题-就是整屏刷新可以成功,位置也对;局部刷新要么偏移,要么导致自身和之后的刷屏错误(具体表现为下一次接着上一次刷)

踩坑的-ALL PROCESS:其实首先发现这个原因之前做了很多工作——本来是直接分分钟写个驱动整合到总工程中进行从flash读图片并刷新在屏幕中央的,结果总是出现偏移!于是

1、仔细拿着厂家给的DEMO核对,发现并没有区别,DBUG失败

2、然后又逐条翻译LCD驱动中的writecom命令,并没有发现什么异常

3、重新看LCD驱动IC文档,千辛万苦发现命令20h和21h似乎对偏移能起作用

发现这两个命令和AC有关,屏幕之所以出现偏移可能是在writeblock中只指定了视窗,却没有修改AC值!

又发现上表中有G1~G220,由于对数据比较敏感,觉得这两个命令肯定是控制Y方向的AC的,

又参考38、39对Y方向视窗的设置方式,

于是顺手在blockwrite中加了两句:

 void BlockWrite(unsigned int Xstart,unsigned int Xend,unsigned int Ystart,unsigned int Yend)
{
//ILI9163C
WriteComm(0x0037);
WriteData(Xstart); WriteComm(0x0036);
WriteData(Xend); WriteComm(0x0039);
WriteData(Ystart); WriteComm(0x0038);
WriteData(Yend); WriteComm(0x0021);
17 WriteData(Ystart);
18
19 WriteComm(0x0020);
20 WriteData(Yend);

WriteComm(0x0022);
}

还真有效果!!!

当时非常激动~~~~

但是我当时用的是drawrectange测试的,刷的是纯色

集成到总工程开始刷图片问题又来了~

——虽然Y方向的AC搞定了,但是X方向存在偏移,最终导致整个图片的平移

4、再次翻几遍IC的说明,将目标锁定在初始化部分可能存在问题!

直到把该注释的初始化全部注释掉(只剩两个了),虽然发现某些命令的功效但是还是没有解决根本问题

5、尝试采用计算偏移量,预填充GRAM来抵消偏移

发现偏移规律性不明显,总是补不完全~

6、今天下午实在不能忍(我断定是屏幕厂家给了我一次品!)

于是,一封休书找到了屏幕幕后黑手——屏幕驱动IC芯片厂技术人员:

后来,这位技术把我拉到一个讨论组里面,转述内容省略....然后出来个大牛~

看到最后一句20 stax时瞬间豁然开朗~心中有无数草泥马在奔腾~

      

    《D-BUG诗》

曾经我离成功只差一步之遥,

绕了一大圈,

回到原点~

原来20、21命令一条是指明X方向的AC的值,一条指明Y方向AC的值!

当时钻进死胡同了~

硬把20、21和Y方向的start和end绑定,

却苦苦寻找X方向的start和end该怎么放!

于是乎,

明白了为什么规律老是不明显的X方向偏移,

其实就是command-20将Yend当做了Xstart,

导致了未解的偏移~

有时候,

你与你想要的只差一毫,

一时大意、一时疏忽、一时自得,

让你用千百倍懂得!

世界上本来没有坑,想的多了,也就有了坑!

BUG废除,世界又恢复了平静~

测试工程源码(一个移植demo,一个居中绘图):http://pan.baidu.com/s/1c1vlgPy

注:非常感谢该IC技术团队的热情帮忙~

@beautifulzzzz

  2015-12-7 持续更新中~

[nRF51822] 2、D-BUG之诗的更多相关文章

  1. [nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)

    蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体 ...

  2. [编译] 4、在Linux下搭建nRF51822的开发烧写环境(makefile版)

    星期日, 09. 九月 2018 07:51下午 - beautifulzzzz 1.安装步骤 1) 从GNU Arm Embedded Toolchain官网下载最新的gcc-arm工具链,写文章时 ...

  3. 浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(转载)

    转载来至beautifulzzzz,网址http://www.cnblogs.com/zjutlitao/,推荐学习 蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到 ...

  4. 用JAVA日志来写诗

    工欲善其事,必先利其器 很多程序员可能都忘了记录应用程序的行为是一件多么重要的事,当遇到多线程环境下高压力导致的并发bug时,你就能体会到记录log的重要性. 有的人很高兴的就在代码里加上了这么句: ...

  5. 与number_format函数有关的一个bug?

    最近在做一个模仿excel功能的在线项目.其中有一个功能,数据列表中的数据,到了最后一列都要进行总计.这本来没什么难度.直接从数据库取出数据后,进行foreach相加就行 了.这是如此的简单,以至于用 ...

  6. NRF51822模块无法识别问题解决办法

    我知道没图是没人看的,所以随便瞎截图了几张. 对于很多新手朋友们,或许可能还不是很了解jtag相关的一些调试所需的必须电路,就像很多人不喜欢用stm32的硬件i2c,而是喜欢软件io模拟,就算是使用了 ...

  7. 做一名开源社区的扫地僧——从Bug report到Google Summer of Code(GSoC):从200个bug到5000美金

    今年的软件自由日(SFD),我在广州Linux用户组的线下活动上做了一个分享,主题叫做<做一名开源社区的扫地僧(上)>.我把演讲的内容重新整理扩充, 写出了文字版, 希望可以跟更多朋友分享 ...

  8. 这个 bug 让我更加理解 Spring 单例了

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  9. Tomcat一个BUG造成CLOSE_WAIT

    之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...

随机推荐

  1. 第一节(配置springmvc环境)学习尚硅谷-springmvc视频教程

    之前,一直从事C#开发.后来,公司调整后领导决定使用java开发,因此需要收集相关学习资料.该视频教程比较入门,也适合自己,于是边看边写的同时再总结一下便于自己牢记,遇到分歧不对之处望指正. 开发环境 ...

  2. freeCodeCamp:Slasher Flick

    返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始. /*思路 利用splice截断数组arr,返回运算后的数组arr; 如果howMany大于或等于数组长度,则返回空数组: */ funct ...

  3. saas简介

    SaaS是Software-as-a-Service(软件即服务)的简称,随着互联网技术的发展和应用软件的成熟, 在21世纪开始兴起的一种完全创新的软件应用模式.它与“on-demand softwa ...

  4. css+js定位到屏幕中间

    ex:让一个div始终显示在屏幕中间 一. css:#idName{position: absolute;z-index: 999;width: ?px;margin-top: ?px;}//此处的初 ...

  5. 关于swfupload,客户端中文乱码解决方案!

    公司做了个邮箱系统,上传附件用到了swfupload控件,测试成功上线后hr找我说上传附件中文乱码. 奇怪了,就只有她的电脑出问题,我找了好几台电脑,虚拟机也跑了怎么就找不到问题. 后来网上查了好久, ...

  6. 浅入了解GCD 并发 并行 同步 异步 多线程

     什么是 GCD?! GCD就是一个函数库(废话) 用来压榨系统的资源,解决多线程处理中一些问题的库(知道这个就够了,很多电影角色都是因为知道太多死得很惨!!!!!) 1.并发与并行 Concurre ...

  7. .net 常用的命名空间和类

    一.基础命名空间 l  System.Collections 包含了一些与集合相关的类型,比如列表,队列,位数组,哈希表和字典等. l  System.IO 包含了一些数据流类型并提供了文件和目录同步 ...

  8. makefile命令基本运用(一)

    一.makefile介绍: 一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译 ...

  9. Java学习笔记 04 类和对象

    一.类和对象的概念 类 >>具有相同属性和行为的一类实体 对象 >>实物存在的实体.通常会将对象划分为两个部分,即静态部分和动态部分.静态部分指的是不能动的部分,被称为属性,任 ...

  10. Android ListView onItemClick Not Work

    Android ListView onItemClick Not Work ListView item中有Button和RadioButton的时候,它的Item点击事件不起作用,需要设置item的属 ...