LCD驱动调试

LCD驱动调试

porority of HSYNC, VSYNC is very important in LCD debug follow

转载:http://blog.csdn.net/linphusen/article/details/6385175

Steps for Debug

1) check the power supply is correct

2) check the clock for LCD is correct and output normally

3) check the CPU side Pads(Pin/GPIO) settings.

4) check the DATA Enable signal

5) check the proiority of Hsync/Vsync

6) check the LCD init code is correct for this panel

7) Check the timming setting in video_mode in LCDC(IPU) driver. be carefully on the timiing params, plese check the spec

8) right shift and left shift are aloways launched by the incorrect timming params

 

 

below form :

http://blog.csdn.net/qikaibinglan/archive/2010/05/28/5630246.aspx

 

(1) 液晶显示模式

        并行:MCU接口、RGB接口、Vysnc接口

        串行:SPI接口、MDDI接口

(2) 屏幕颜色

        实质上即为色阶的概念。色阶是表示手机液晶显示屏亮度强弱的指数标准,也就是通常所说的色彩指数。目前彩屏手机的色阶指数从低到高可分三个层次,最低单色,其次是256色、4096色、 65536色;目前最高的为26万色。256=2的8次方,即8位彩色,依次律推,65536色=2的16次方,即通常所说的16位真彩色,26万=2的18次方,也就是18位真彩。其实65536色已基本可满足我们肉眼的识别需求。

(3) 分辨率

        LCD的分辨率与CRT显示器不同,一般不能任意调整,它是制造商所设置和规定的。分辨率是指屏幕上每行有多少像素点、每列有多少像素点。手机上LCD的分辨率一般是176点×220行的QCIF显示模式和240点×320行的QVGA显示模式。

(4) 刷新率

        LCD刷新频率是指显示帧频,亦即刷新一帧屏所需要的时间,与屏幕扫描速度及避免屏幕闪烁的能力相关。也就是说刷新频率过低,可能出现屏幕图像闪烁或抖动。

(5) 可视角度

        指从不同的方向清晰地观察屏幕上所有内容的角度,这与LCD是DSTN还是TFT有很大关系。因为前者是靠屏幕两边的晶体管扫描屏幕发光,后者是靠自身每个像素后面的晶体管发光,其对比度和亮度的差别,决定了它们观察屏幕的视角有较大区别。DSTN-LCD一般只有60度,TFT-LCD则有160度。

(6) 响应时间

        响应时间愈小愈好,它反应了液晶显示器各象素点对输入信号反应的速度,即pixel由暗转亮或由亮转暗的速度。响应时间越小则使用者在看运动画面时不会出现尾影拖拽的感觉。一般会将反应速率分为两个部份:Rising 和Falling,而表示时以两者之和为准。

2. 接口形式:

(1) 并行方式

a、MCU接口

       目前主要有i80和m68两种类型。这种LCD模式须LCD有自己的GRAM。

b、RGB接口:

  通过时钟同步来实现同步传输,此模式不需要LCD有GRAM来缓存数据。接口如下:

(2) 串行方式

a、SPI接口:
        目前手机各个平台无使用此接口方式。接口如下:

b、MDDI接口:

       高通公司的一种接口形式,具有传输速率高、抗EMC性能好、降低功率损耗等特点。

3. 调试注意事项:

(1) 硬件

       测量硬件信号,保证硬件状态的正常:

a、背光是否打开?

       LCD是否出于白屏状态?

b、数字电压和IO电压是否产生?

      一般IC,数字电压为2.8V,IO电压为1.8V

c、reset信号是否有效过?

       reset信号一般低有效,低有效时间看IC spec要求。

d、控制信号是否输出?

       CS、RS、WR信号是否有输出

e、数据线上是否输出?

      数据线是8bit、16bit还是18bit,是否有输出?

(2) 软件

        手机软件系统虽不象计算机软件系统那样复杂,但同样具有类似的构架:操作系统+应用程序。

         目前操作系统,一般是一个任务抢占式实时操作系统,使用中断陷阱、信号、队列等概念组织各项任务(应用程序)的建立、执行、切换。在操作系统的管理下,各项任务看似是并行运行的。

        对于驱动调试需要进行两方面的工作,第一熟悉手机软件结构,第二研究新的外设功能,编写新驱动并集成到手机软件中。对于LCD驱动,目前各个平台软件上已经集成此模块代码,我们需要在此基础上进行代码调整和功能验证。

a、LCD的物理地址分配

       查看主芯片memory分配,在代码实现上指定命令和数据传送的端口地址。

b、LCD命令和数据格式

        根据实际的硬件设计及IC要求,决定LCD命令和数据的传输方式,保证指令和数据能有效的从主芯片侧传递到LCD IC。

c、LCD指令含义

        熟读LCD IC spec,了解寄存器配置含义,理解LCD的控制方式和工作方式。

d、开关屏序列

        了解POWER ON顺序和POWER OFF顺序

e、背光驱动的控制方式

       电流驱动还是电压驱动?

f、LCD模块ID识别的方法

       硬件电路是否支持?若无,软件如何识别?
4. 常见问题总结:

LCD的调试中,延时特别重要,一定要确定延长的时间足够,特别是更改电压寄存器后面的延时。记得有一次屏幕出现抖动的现象,一直查不出原因,厂家从日本派了2次来人,都没解决;最后,把所有的时序测试出来,发现延时不足,影响延时的一个函数传递参数错了。
1.初始化前需要一个延时(大概为10ms),使Reset稳定;
2.如果出现花屏现象,很大的可能是总线速度问题;
3.如果屏幕闪动比较明显,可以通过调整电压来稳定,一般调节的电压为VRL、VRH、VDV和VCM;这些电压也可以用来调节亮暗(对比度);
4.调节对比度时,也可以通过调节Gamma值来实现,要调节的对象为:PRP、PRN、VRP、VRN等;
5.注意数据是8位、16位时,写命令和数据的函数注意要变化;
6.如果调试时发现LCD的亮度有问题,首先检查(考虑)提供给LCD的电流是否一致,再考虑调节电压。
7.开机花屏问题,最简单的处理方式就是在INIT结束的地方增加一个刷黑屏的功能。也可以在睡眠函数里加延时函数;
8. 如果随机出现白屏问题,一个可能是静电问题,把LCD拿到头发上擦几下,如果很容易出现白屏那肯定就是静电问题了。另外一个在有Backend IC的情况下,也有可能bypass没处理好。
9.还碰到过一个问题,写PLL的寄存器写了2次,屏幕就抖动的很厉害。这个问题应该跟LCD内部实现有关了,并不是每个都会。
10.横向抖动,看不清画面,修改ENTRY MODE
11.如果字体反了,修改drive output control ,GS,SS;
12.如果图像刷新上面的字体跑到下面等,区域刷新没处理好;
13.如果图像分开显示,起始点不在原点,多半是全屏刷新起始点寄存器没有设好;
14.DMA刷新方式,每次刷新为一行,只能一次刷一整行,不然会出错,减少了循环计算时间,提高了LCD的刷新速度,也就减少了响应时间;

15.PWM的频率
    对于LCD的背光来说,一般做法是通过升压芯片来提供对电压的支持。而这些升压芯片都会有PWM输入PIN,通过PWM来调节背光的明暗度。不过有时候我们会发现背光调节幅度陡然增大缩小,或是背光不足够亮(相对于作为GPIO PIN输出HIGH来说),但是通过万用表测量PWM输入,电压降的幅度都是处于正常情况下,这时候我们不妨调低PWM的输出频率。因为有很多升压芯片对PWM的频率都会有要求,将频率调至datasheet中标示的范围,一般都能解决此问题。
    
  
  16.LCD的星星点点
 
  在调试的时候,我们会发现LCD上有莫名其妙的星星点点。一般这种情况下,我们首先要看看VGH和VGL电压是否处于datasheet所描述的范围之内。如果属于标准范围之内,但星星点点依旧,很有可能就是时序问题。这时候不妨在代码中变更采样的时序(比如上升沿采样改为下降沿采样)。如果无法在代码中更改,也可以在clk信号线加个100R电阻,也可能解决该问题。
  
  
 17.背光的反馈电压
 
  升压芯片的输出电压需要反馈,如果没有接LCD的话,那两个极性的电压是无法出来的。线路中的二极管也是属于易损的类型,背光不亮很多情况是该二极管坏掉。反馈中的电阻如果没有计算正确,那么很可能反馈电压会超出预料,从而导致损坏LCD。
    
    
 18.显示抖动
 
   在确认VPW,VBP,VFP,HPW,HBP,HFP的设置已经符合LCD规格要求后,如果屏幕的显示还在抖动的话,不妨将输出的时钟信号频率降低,有可能解决该问题。
   
   
 19.一些英文的缩写
 
  VPW: Vsync Pulse Width
  VBP: Vsync Back Porch
  VFP: Vsync Front Porch
  HPW: Hsync Pulse Width
  HBP: Hsync Back Porch
  HFP: Hsync Front Porch

 

网上资料:
今天调LCD出现在这样的问题,就是显示图像时,在明暗颜色过渡间,会出现一些亮点,有时还不停的闪动,谁遇到过这样的情况呀?是硬件的问题还是软件可调呀?
我调整pixel clock 极性,由上升沿采样改由下降沿采样就没事了.不知怎么回事
2 LCD有水波纹一般什么问题
个信号short到地,可以看一下板子是否受到干扰,比如电源或晶振部分,再一个是否你输出至LCD 的信号线走的有问题,看看电源和背光电压是否有纹波,检查一下LCD周边外围电路的电阻、电容、电压是否很干净。
这个主要是在信号输入时右能出现于拢,信号线之间、地线与信号线之间出现了信号的反射或于拔;还有一种情况就是摄像头控制IC不稳定,输出的控制信号不稳或有毛剌
    1,背光芯片输出的纹波:检查charge pump(dc-dc)电路,替换为合适的滤波电容;

    2,LCD driver 电源管理:

(1)3级chargepump之间确保有足够的时间延迟,不同的系统这个要调整;

(2)chargepump的输出端要加足够大的滤波电容,具体选择看波形

    3,修改driver ,主要是有关显示周期方面方面的寄存器设置


肯定是背光电源module的问题,估计你采用的是PWM方式控制屏的亮度!

这种纹波产生的原因是LCD的刷屏频率与白光灯的频率频差小于20Hz造成的,就像在日光灯下看高速旋转的电风扇叶子的影响一样!好解决,要软件调一调PWM的频率,运气好就可以解决问题,如果LCD的刷频不是很稳定,就不能100%解决问题了
于LCD条纹的问题:

    1、条纹的宽度,较宽的条纹一般跟背光有较大的关系
    2、有些LCD在晃动时,由于视角的变化,逐行扫描比较明显,这种情况跟有些driver IC有关系,只能通过修改参数优化
    3、参数没有调试好,涉及扫描频率、驱动行列的电压有关!

4手机 LCD&Camera ESD 问题
Air Display, Standalone(Isolated), Preview mode( Camera on)
手机为单板(不是折叠或者滑盖)
如果手机屏朝上,+-10kV pass;
但手机朝下,+-3kV就花屏了
试试屏向下把手机垫起离开桌面一定距离还有没有问题,如果好了,就找一下放电回路,可能是手机屏的控制电路与金属板距离短了后,电容增大,阻抗减小,本来可以从其它路径放掉的电,从这个电路走了,想办法提高这个路径的阻抗或为放电电流提供一个其它的低阻抗通路。
5 调试LCD出现花屏
1)信号的时序,尤其是RS,很大可能是送的数据被认为是指令而出错了。
2)复位信号的时机、时长,复位信号变高到送数据的时间足够。
3)初始化的指令先后顺序、正确性。
4)初始化时高压的打开是否符合规格式要求?

 

 

 

S3c2440ALCD控制器配置实例

本文所用的是东华TFT液晶屏(WXCAT35),配置为常用的16BPP(5:6:5)模式。

先看一下TFT屏的操作时序图:

图一 一般TFT型LCD时序图

外部引脚信号:

VSYNC: 垂直同步信号,表示扫描1帧的开始。

HSYNC: 水平同步信号,表示扫描1行的开始。

VDEN:数据使能信号。

VD[23:0] : LCD像素数据输出端口。

VCLK:像素时钟信号。

寄存器参数:

VSPW:垂直同步信号的脉宽,单位为1行(Line)的时间。

VFPD: 垂直同步信号的前肩,单位为1行(Line)的时间。

VBPD: 垂直同步信号的后肩,单位为1行(Line)的时间。

LINEVAL :垂直显示尺寸-1,即屏行宽-1。

HBPD:水平同步信号的后肩,单位为1VCLK的时间。

HFPD:水平同步信号的前肩,单位为1VCLK的时间。

HSPW:水平同步信号的脉宽,单位为1VCLK的时间。

HOZVAL:水平显示尺寸-1,即屏列宽-1。

由上图可知:

扫描一帧所需的时间:

=((VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1))个行时间。

扫描一行所所需的时间:

= ((HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1))个VCLK时间。

而一个VCLK时间由LCD寄存器LCDCON1内的CLKVAL决定:

=HCLK/[2*(CLKVAL+1)]

因此扫描一帧所需的时间:

T=[(VSPW+1)+(VBPD+1)+( LINEVAL+1)+(VFPD+1)]* [(HSPW+1)+(HSPD+1)+(HFPD+1)+ (HOZVAL+1)]* HCLK/[2*(CLKVAL+1)]

即帧频率为:1/T

注意:以上的时序图为一般TFT的时序图。实际TFT对应的时序图时序可能不一样(比如极性,符号等)。下文中详述。


图2东华TFT型LCD(WXCAT35)时序图

//2440A寄存器参数

#define MVAL        (13)

#define MVAL_USED    (0)                 //0=each frame   1=rate by MVAL

#define INVVDEN         (1)                 //0=normal       1=inverted

#define BSWP            (0)                 //Byte swap control

#define HWSWP           (1)                 //Half word swap control

#define PNRMODE       (3)              // 设置为TFT屏

#define BPPMODE        (12)               // 设置为16bpp模式

//东华屏参数

#define VBPD              (3-1)                     //12 垂直同步信号的后肩   参数见 东华pdf

#define VFPD              (14-1)            //4 垂直同步信号的前肩

#define VSPW              (15-1)            //5垂直同步信号的脉宽

#define HBPD              (38-1)            //(22)水平同步信号的后肩

#define HFPD              (20-1)            //(33)水平同步信号的前肩

#define HSPW              (30-1)            //(44)水平同步信号的脉宽

#define CLKVAL_TFT (6)

//屏大小

#define LCD_XSIZE_TFT    (240)//屏实际列数

#define LCD_YSIZE_TFT    (320)// 屏实际行数

#define SCR_XSIZE_TFT    (240) //虚拟屏列数

#define SCR_YSIZE_TFT    (320) //虚拟屏行数

#define HOZVAL_TFT   (LCD_XSIZE_TFT-1)

#define LINEVAL_TFT  (LCD_YSIZE_TFT-1)

以上有关东华屏参数设置,在PDF中如下所示:

我的板子设置HCLK=100M因此CLKVAL= int(HCLK/(VCLK*2)-1),其中VCLK即上图的DCLK=6.4M, CLKVAL="int"(100/12.8-1)=int(6.8)=6

因此 VCLK = HCLK/[(CLKVAL+1)x2]= 100/2*(6+1)= 7.14MHz

VFRAME=HCLK/[(CLKVAL+1)x2]/{(VSPW+1+VBPD+1+LCD_YSIZE_TFT+VFPD+1)*(HSPW+1+HSPD+1+HFPD+1+LCD_XSIZE_TFT)}=64.4HZ

 

注意:有些液晶屏给的参数单位可能不一样,需要自己计算。

方法如下:

VBPD:确定帧同步信号和帧数据传输前的一段延迟时间,是帧数据传输前延迟时间和行同步时钟间隔宽度的比值,如图,VBPD=t3/t6=1.02 mS/31.77μs=32。

VFPD:确定帧数据传输完成后到下一帧同步信号到来的一段延迟时间,

是帧数据传输后延迟时间和行同步时钟间隔宽度的比值,如图,VFPD=t5/t6=0.35 ms/31.77μs=11。

VSPW:确定帧同步时钟脉冲宽度,是帧同步信号时钟宽度和行同步时钟间隔宽度的比值。如图,VSPW=t2/t6=0.06 ms/31.77μs=2。

HBPD:确定行同步信号和行数据传输前的一段延迟时间,描述行数据传输前延迟时间内VCLK脉冲个数,如图,VBPD=t7×VCLK=1.89 μs×25MHz=47。

HFPD:确定行数据传输完成后到下一行同步信号到来的一段延迟时间,描述行数据传输后延迟时间内VCLK脉冲个数,如图,HFPD=t9×VCLK=0.94 μs×25 MHz="24"。

      HSPW:确定行同步时钟脉冲宽度。描述行同步脉冲宽度时间内VCLK脉冲个数,如图,HSPW=3.77μs×25 MHz="94"。

 


 

S3C2440A LCD控制器配置

1. LCDCON1寄存器

 

rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(PNRMODE<<5)|(BPPMODE<<1)|0;

其中:CLKVAL_TFT = 6;MMODE = MVAL_USED = 0;PNRMODE=3;BPPMODE=12。

ENVID=0(关闭视屏输出,需要开启显示是设为1)。

2. LCDCON2寄存器

rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW); 相关值见上文宏定义

3. LCDCON3寄存器

rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD); 相关值见上文宏定义

4. LCDCON4寄存器

rLCDCON4=(MVAL<<8)|(HSPW); 相关值见上文宏定义


5. LCDCON5寄存器

rLCDCON5 = (1<<11) | (1<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3)  |(BSWP<<1) | (HWSWP);关于信号的极性 图二(东华TFT型LCD(WXCAT35)时序图)

其中BSWP与数据存放有关见下文。

6. LCDSADDR1寄存器

volatile unsigned short LCD_BUFFER[SCR_YSIZE_TFT][SCR_XSIZE_TFT];//全局变量

#define M5D(n)                          ((n) & 0x1fffff)     // To get lower 21bits

 

rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);

 

7. LCDSADDR2寄存器

rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );

//单位为字节 一个点16bit=2字节

 

8. LCDSADDR3寄存器

rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);

// 1=*16bit/半字=16/16

 

LCD初始化程序:

void Lcd_Init(void)

{

       //引脚功能初始化

       rGPCUP  = 0x00000000;

       rGPCCON = 0xaaaa02a9;

        

       rGPDUP  = 0x00000000;

       rGPDCON=0xaaaaaaaa; //Initialize VD[15:8]

       rLCDCON1=(CLKVAL_TFT<<8)|(MVAL_USED<<7)|(PNRMODE<<5)|(BPPMODE<<1)|0;

           // TFT LCD panel,16bpp TFT,ENVID=off(Disable the video output and the LCD control signal)

       rLCDCON2=(VBPD<<24)|(LINEVAL_TFT<<14)|(VFPD<<6)|(VSPW);

       rLCDCON3=(HBPD<<19)|(HOZVAL_TFT<<8)|(HFPD);

       rLCDCON4=(MVAL<<8)|(HSPW);

       rLCDCON5 = (1<<11) | (1<<10) | (1<<9) | (1<<8) | (0<<7) | (0<<6) | (1<<3)  |(BSWP<<1) | (HWSWP);

       //5:6:5

       rLCDSADDR1=(((U32)LCD_BUFFER>>22)<<21)|M5D((U32)LCD_BUFFER>>1);

       rLCDSADDR2=M5D( ((U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2))>>1 );//单位为字节 一个点16bit=2字节

       rLCDSADDR3=(((SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)<<11)|(LCD_XSIZE_TFT/1);// 1=*16bit/半字=16/16

       rLCDINTMSK|=(3); // MASK LCD Sub Interrupt

       rTCONSEL &= (~7) ;     // Disable LPC3480

       rTPAL=0; // Disable Temp Palette

}

 

16BPP模式特点:

内存数据格式:

 

 

 

 

 

 

 

数据引脚输出:没有用到的引脚可用作GPIO

系统结构图:

 

 

要显示图像,只要向LCD_BUFFER[]先入像素数据(R(5):G(6):B(5))。LCD控制器会自动通过DMA读取数据送往TFT LCD显示。

这里介绍一个Bmp2RGB.exe,次程序可将bmp图转换为RGB(5:6:5)格式的c格式的数组

你可能感兴趣的:(LCD)