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. C#高级--通过类来理解学习委托

    namespace classanddelegate { class Program { static void Main(string[] args) { //这是类的实例化 Test test = ...

  2. js高级应用

    特别板块:js跨域请求Tomcat6.tomcat7 跨域设置(包含html5 的CORS) 需要下载两个jar文件,cors-filter-1.7.jar,Java-property-utils-1 ...

  3. 编写更好的jQuery代码的建议

    讨论jQuery和javascript性能的文章并不罕见.然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码.好的代码会带来速度的提升.快速渲染 ...

  4. Ajax Step By Step2

    第二.[$.get()和$.post()方法] .load()方法是局部方法(有需要父$),因为他需要一个包含元素的 jQuery 对象作为前缀.而$.get()和 $.post()是全局方法,无须指 ...

  5. appium踩过的坑(1):NoClassDefFoundError

    1.引入jar包错误导致的错误: 引入的jar包引起的 应该引入下面的jar包

  6. Dancing Links & Algorithm X

    1 参考链接 http://www.cnblogs.com/steady/archive/2011/03/15/1984791.html#undefined http://en.wikipedia.o ...

  7. ES6详解

    1.ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. const声明常亮,不可改变 2.变量的解构赋值 (1)数组的解构赋值: 以前,为 ...

  8. 命令行中mysql乱码问题

    1.现象  在命令行中,执行sql语句如果包含中问题,提示“ Data too long for column '列名' at row 1”   或者在命令行中查询出的结果中,中文乱码   2.分析 ...

  9. (转)如何为你的Viewcontroller瘦身

    View controllers are often the biggest files in iOS projects, and they often contain way more code t ...

  10. 由XML解析学习工厂模式

    代码段1: startupData = new StartupData(); /* 设定自定义的MyHandler给XMLReader */ StartupXMLHandler startupData ...