LCD 驅動除錯
porority of HSYNC, VSYNC is very important in LCD debug follow
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 :
(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格式的陣列