天马3.5寸TFT屏调试文档
天馬 3.5 寸 TFT 屏調(diào)試文檔
王小濤 2009 年 6 月 12 日
修訂版
1 、坐標(biāo)定位
觸摸屏點(diǎn)擊時(shí)驅(qū)動(dòng)讀入的是ADC值,也就是電壓值(AD后),一個(gè)是x坐標(biāo)的ADC值,一個(gè)是y坐標(biāo)的ADC值。一個(gè)點(diǎn)的x坐標(biāo)和y坐標(biāo)的ADC值存放在變量LogicNumber[presstimes]中,高16位是x坐標(biāo)的ADC值,低16位是y坐標(biāo)的ADC值,而ADC值也就是屏幕的邏輯坐標(biāo)值,因此在變量LogicNumber[presstimes]中存儲(chǔ)的實(shí)際上也是屏的邏輯坐標(biāo)值。
ADC值是通過函數(shù)LogicNumber[presstimes] = WRTAmuse.Common.getStoredNumber();來讀取的。
我們的坐標(biāo)定位程序設(shè)置了五個(gè)基準(zhǔn)點(diǎn)(屏幕坐標(biāo)),五個(gè)基準(zhǔn)點(diǎn)(屏幕坐標(biāo))分別如下:
PointPX[0] = 30; //第一個(gè)基準(zhǔn)點(diǎn)的屏幕坐標(biāo)
PointPY[0] = 30;
PointPX[1] = 290; //第二個(gè)基準(zhǔn)點(diǎn)的屏幕坐標(biāo)
PointPY[1] = 30;
PointPX[2] = 30; //第三個(gè)基準(zhǔn)點(diǎn)的屏幕坐標(biāo)
PointPY[2] = 210;
PointPX[3] = 290; //第四個(gè)基準(zhǔn)點(diǎn)的屏幕坐標(biāo)
PointPY[3] = 210;
PointPX[4] = 160; //第五個(gè)基準(zhǔn)點(diǎn)的屏幕坐標(biāo)
PointPY[4] = 120;
通過依次點(diǎn)擊這五個(gè)基準(zhǔn)點(diǎn)分別得到五個(gè)點(diǎn)的邏輯坐標(biāo)值,并判斷用戶是否對(duì)準(zhǔn)五個(gè)點(diǎn)依次點(diǎn)擊。當(dāng)用戶操作正確后,我們的坐標(biāo)定位程序會(huì)將用戶依次點(diǎn)擊的五個(gè)基準(zhǔn)點(diǎn)的邏輯坐標(biāo)記錄下來。然后通過線性回歸公式計(jì)算得出LCD屏的屏幕坐標(biāo)系與邏輯坐標(biāo)系之間的比例關(guān)系(即計(jì)算出參數(shù)KX和KY)。而事實(shí)上我們的坐標(biāo)定位程序需要六個(gè)參數(shù),其中有四個(gè)參數(shù)是直接得到的,有兩個(gè)是需要計(jì)算出來的(即KX和KY)。六個(gè)參數(shù)如下:
XLC(第一個(gè)點(diǎn)的邏輯x坐標(biāo),即x方向的ADC值)、
YLC(第一個(gè)點(diǎn)的邏輯y坐標(biāo),即y方向的ADC值)、
XC(第一個(gè)點(diǎn)的屏幕x坐標(biāo),這里是30)、
YC(第一個(gè)點(diǎn)的屏幕y坐標(biāo),這里是30)、
KX(邏輯坐標(biāo)系和屏幕坐標(biāo)系的x軸比例關(guān)系)、
KY(邏輯坐標(biāo)系和屏幕坐標(biāo)系的y軸比例關(guān)系)。
其中XLC和YLC可以通過函數(shù)
LogicNumber[presstimes] = WRTAmuse.Common.getStoredNumber();讀取,而XC和YC是我們自己預(yù)先設(shè)置好的屏幕坐標(biāo),KX和KY的計(jì)算公式如下:
我們運(yùn)行我們的坐標(biāo)定位程序,并通過程序?qū)⒆鴺?biāo)信息打印出來。結(jié)果如下:
_xmouse = 30
_ymouse = 29
1presstimes =0
_xmouse = 288
_ymouse = 30
1presstimes =1
Math.abs(tmpLogicNum_2 - tmpLogicNum_1) =6
Math.abs(tmpLogicNum_3 - tmpLogicNum_4) =3046
_xmouse = 29
_ymouse = 207
1presstimes =2
_xmouse = 288
_ymouse = 209
1presstimes =3
Math.abs(tmpLogicNum_2 - tmpLogicNum_1)=20
(Math.abs(tmpLogicNum_3 - tmpLogicNum_4)=3054
_xmouse = 160
_ymouse = 119
1presstimes =4
PointLX[0] = 461
PointLY[0] = 3279
PointLX[1] = 3507
PointLY[1] = 3285
PointLX[2] = 465
PointLY[2] = 621
PointLX[3] = 3519
PointLY[3] = 601
PointLX[4] = 1991
PointLY[4] = 1941
XLC = 461
YLC = 3279
YC = 30
XC = 30
KX = 11730.76923076923
KY = -14838.888888888889
//剛開始調(diào)試大屏的時(shí)候,坐標(biāo)不準(zhǔn),是因?yàn)橛布蟲和y兩根線反了,調(diào)過來就ok了。
2 、天馬屏的時(shí)序
一般來說,液晶屏或者是ssd1926在上電復(fù)位后,其寄存器會(huì)有一個(gè)默認(rèn)的參數(shù)。一般來說我們可以選擇屏復(fù)位后的默認(rèn)參數(shù),然后通過設(shè)置ssd1926的寄存器來匹配屏的那些默認(rèn)參數(shù)。而我們的調(diào)試正是通過設(shè)置ssd1926的寄存器來配合屏的默認(rèn)參數(shù)的。
我們先看看天馬屏的默認(rèn)參數(shù):
其中大部分寄存器都可以采用默認(rèn)參數(shù),只有少數(shù)需要進(jìn)行修改。下面將介紹那部分需要修改的寄存器:
R03h:一般來說,DEN都是為高有效,CLKIN上升沿鎖存數(shù)據(jù),HSD為低有效,VSD為低有效,24-bit digital RGB input format HV Mode,6.4M。
R0eh:當(dāng)時(shí)出現(xiàn)屏閃的現(xiàn)象,實(shí)際上就是這個(gè)寄存器參數(shù)的問題。我們將這個(gè)寄存器值設(shè)置為0x6A后,屏閃的現(xiàn)象就消失了。我們?cè)谠O(shè)置這個(gè)寄存器的時(shí)候,主要是改變VCOMDC的值。但我們?cè)趯懭爰拇嫫鞯臅r(shí)候,記得Bit[6](即OTP_BYPS)要設(shè)置為1。否則VCOMDC的值不會(huì)被寫入。
R04h:設(shè)置Source Timing delay control register,默認(rèn)為:70,實(shí)際上就是SSD1926中的HDPS
R05h:設(shè)置Gate Timing delay control register,默認(rèn)為:13,實(shí)際上就是SSD1926中的VDPS
雖然這里我們是采用天馬屏的默認(rèn)參數(shù)來用,但有時(shí)候我們需要對(duì)屏的一些參數(shù)進(jìn)行一些調(diào)整,這里先介紹下如何設(shè)置屏的參數(shù)。
一般來說設(shè)置屏的參數(shù)是通過SPI,I2C或者是串口等方式來實(shí)現(xiàn)的,一般來說SPI和I2C用得比較多,而我們的天馬屏正是SPI接口來設(shè)置屏參數(shù)的。所以我們要在天馬屏的手冊(cè)中找到屏的SPI時(shí)序,如下圖:
注意:不同屏的SPI時(shí)序可能有所不同,詳細(xì)應(yīng)該參見屏的技術(shù)手冊(cè)。
可以看到,其SPI時(shí)序,SDI是串行數(shù)據(jù),高6位是寄存器的地址,接下來是一個(gè)讀寫標(biāo)志位,然后一個(gè)高阻位,接下來就是數(shù)據(jù)了。可以看到,時(shí)序是先發(fā)高位,再發(fā)低位。因此我們的SPI程序(詳見2137/case/drivers/lcm/SSD1926.c)。我們的SPI接口電路如下:
3 、 SSD1926 對(duì) TFT 屏的時(shí)序控制
接下來我們看看SSD1926中對(duì)TFT屏的時(shí)序控制:
其中對(duì)TFT屏的時(shí)序控制涉及到幾個(gè)參數(shù)的設(shè)置:
HT:Horizontal Total
VT:Vertical Total
HDP:Horizontal Display Period
VDP:Vertical Display Period
HDPS:Horizontal Display Period Start Position、
VDPS:Vertical Display Period Start Position
HPW:LLINE Pulse Width
VPW:LFRAME Pulse Width
HPS:LLINE Pulse Start Position
VPS:LFRAME Pulse Start Position
我們從天馬屏的資料中可以看到天馬屏的時(shí)序圖和一些參數(shù)表
從時(shí)序圖中我們可以看到了:HSYNC、VSYNC為低有效,而DEN為高有效,且在DCLK上升沿鎖存數(shù)據(jù)。這與屏的寄存器R03h的默認(rèn)參數(shù)一致。
我們先來設(shè)置SSD1926是輸出時(shí)鐘PCLK(Pixel CLK),使得SSD1926提供給屏的DCLK剛好的6.4M,我們從原理圖中可以看出,SSD1926的外部晶振為4M。
其中M=[R127_7-0],N=[R126_4-0]。
設(shè)置PLL_CLK的時(shí)序如下,(SSD1926文檔中的示例程序)
Program sequence (example input clock frequency = 2MHz) :
1. Write the N value (REG[126h] = 0x05)
2. Write the M value (REG[127h] = 0xC8)
3. Write the PLL Conf value (REG[12Bh] = 0xAE)
4. Enable the PLL (REG[126h] = 0x85)
Then, the PLL output clock frequency = Input clock frequency * (M / N) = 80MHz
Maximum output clock frequency = 85MHz
而我們的程序中,
SSD_REGWB(0x126,0x0A);
SSD_REGWB(0x127,0xC8);
SSD_REGWB(0x12B,0xAE);
SSD_REGWB(0x126,0x8A);
則我們的輸出的PLL_CLK= 4M*(0xC8/0x0A)=80M
而MCLK Frequency = PLL output frequency / (MCLK divide value + 1)
MCLK divide value=[R04h_4-0]。
在我們的程序中我們用的是R04h的默認(rèn)值,即0。所以MCLK=64M/1=80M
我們僅使用PCLK(Pixel CLK,即液晶屏的DCLK),而SD_CLK引腳我們尚未使用。
我們現(xiàn)在配置PCKK的頻率為6.4M
PCLK frequency = MCLK frequency * (PCLK Frequency Ratio + 1) / (2^20)
PCLK Frequency Ratio=[R15Ah_3-0,R159h_7-0,R158h_7-0]
為了使得PCLK=6.4M,
我們必須使PCLK Frequency Ratio=6.4M*2^20/80M-1=83385.08=0x147AD
至此,我們已經(jīng)將PCLK設(shè)置完畢
{REG_PCLK_FREQ_RATIO_0 ,0xad}, //R158h
{REG_PCLK_FREQ_RATIO_1 ,0x47}, //R159h
{REG_PCLK_FREQ_RATIO_2 ,0x01}, //R15Ah
從參數(shù)表中我們可以看到屏的DCLK的頻率是6.4M,我們?cè)谇懊嬉呀?jīng)將SSD1926的PCLK設(shè)置為6.4M了。而HT=408、VT=263*HT、HDP=320、VDP=240*HT、HDPS=70、VDPS=13*HT、HPW=1、VPW=1*HT、HPS=1、VPS=1*HT。單位全部為pixel。
根據(jù)以上天馬屏的默認(rèn)參數(shù),我們對(duì)SSD1926的寄存器設(shè)置如下,以匹配天馬屏的參數(shù)。
/******************************************/
/* TFT Panel Timing Control,共10個(gè)參數(shù) */
/******************************************/
//HT = [((R12h_7-0) + 1) x 8 + (R13h_2-0)] pixels
//天馬屏HT=408 比亞迪屏HT=408
{REG_HORIZ_TOTAL_0 ,0x32}, //R12h
{REG_HORIZ_TOTAL_1 ,0x00}, //R13h
//HDP = [((R14h_6-0) + 1) x 8] pixels
//天馬屏HDP=320 比亞迪屏HDP=320
{REG_HDP ,0x27}, //R14h
//HDPS = [(R17h_2-0, R16h_7-0) + 5] pixels
//天馬屏HDPS=70 比亞迪屏=68
{REG_HDP_START_POS0 ,0x41}, //R16h
{REG_HDP_START_POS1 ,0x00}, //R17h
//VT = [(R19h_2-0, R18h_7-0) + 1] lines
//天馬屏VT=263 比亞迪屏=262
{REG_VERT_TOTAL0 ,0x06}, //R18h
{REG_VERT_TOTAL1 ,0x01}, //R19h
//VDP = [(R1Dh_1-0,R1Ch_7-0)+ 1] lines
//天馬屏VDP=240 比亞迪屏VDP=240
{REG_VDP0 ,0xef}, //R1Ch
{REG_VDP1 ,0x00}, //R1Dh
//VDPS = [(R1Fh_2-0,R1Eh_7-0)] lines
//天馬屏VDPS=13 比亞迪屏VDPS=18
{REG_VDP_START_POS0 ,0x0d}, //R1Eh
{REG_VDP_START_POS1 ,0x00}, //R1Fh
//HPW = [(R20h_6-0)+ 1] pixels
//天馬屏HPW=1 比亞迪屏HPW=2
{REG_HSYNC_PULSE_WIDTH ,0x00}, //R20h
//HPS = [(R23h_2-0, R22h_7-0) + 1] pixels
//天馬屏HPS=1 比亞迪屏HPS=1
{REG_HSYNC_PULSE_START_POS0 ,0x00}, //R22h
{REG_HSYNC_PULSE_START_POS1 ,0x00}, //R23h
//VPW = [(R24h_2-0)+ 1] x HT + (R35h_2-0, RE34h_7-0) – (R31h_2-0, R30h_7-0) pixels
//天馬屏VPW=HT 比亞迪屏VPW=2*HT
{REG_VSYNC_PULSE_WIDTH ,0x00}, //R24h
{REG_FPFRAME_START_OFFSET0 ,0x00}, //R30h
{REG_FPFRAME_START_OFFSET1 ,0x00}, //R31h
{REG_FPFRAME_STOP_OFFSET0 ,0x00}, //R34h
{REG_FPFRAME_STOP_OFFSET1 ,0x00}, //R35h
//VPS = [(R27h_2-0, R26h_7-0)] x HT + (R31h_2-0, R30h_7-0) pixels
//天馬屏VPS=HT 比亞迪屏VPS=HT
{REG_VSYNC_PULSE_START_POS0 ,0x00}, //R26h
{REG_VSYNC_PULSE_START_POS1 ,0x00}, //R27h
4 、 SSD1926 的其他設(shè)置
(1)、 Panel Type Register:R10h
{REG_PANEL_TYPE ,0x71}, // Color LCD, 24 bits Data Width, TFT
(2)、Modulation Rate Register:R11h
{REG_MOD_RATE ,0x00}, // here: the MOD output signal (LDEN) toggles every LFRAME
(3)、Display Mode Register:R70h
{REG_DISPLAY_MODE ,0x84}, //here: Display Blank, 16 bpp
(4)、Power Up Registers:RA0h
{REG_POWER_SAVE_CONFIG ,0x00},
// all MCLK will be on、MCLK for display SRAM will be on、Power Saving mode is disabled.
(5)、RGB Setting Register:R1A4h
{REG_DV_OFORMAT ,0xC0}, //Floating Window RGB、Main Window RGB
(6)、LCD Power Control Register:RADh
{REG_GPIO_STATUS_CONTROL1 ,0x00}, //Writing a 0 to this bit drives LPOWER to low.
//Many implementations use the LPOWER pin to control the LCD bias power (see Section
“LCD Power Sequencing” in datasheet).
(7)、LSHIFT Polarity Register:R38h
{REG_HRTFT_SPECIAL_OUTPUT ,0x01}, //Bit_0=1 LSHIFT signal is falling trigger.
(9)、RGB sequence Register:R42h
{REG_LCD_SUBPIXEL_ALIGNMENT ,0x00}, // odd line RGB
1926設(shè)置中還有一部分是關(guān)于橫屏和豎屏的,以下為設(shè)置的寄存器
豎屏設(shè)置:
(10)、Special Effects Register :R71h
{REG_SPECIAL_EFFECTS ,0x41},
//Byte Swap,Floating Window disable,Eable 90 Display Rotate Mode
選擇了旋轉(zhuǎn)角度后,下面兩個(gè)寄存器是通過計(jì)算算出來的,具體公式詳見SSD1926文檔。注意不同旋轉(zhuǎn)角度的計(jì)算公式不同。
(11)、Main Window Display Start Address Register 0:R74h
{REG_MAIN_WIN_DISP_START_ADDR0 ,(MAIN_WIN_START_ADDR+(((LCD_HEIGHT)*ssd_bpp)/8))>>2-1},
// Main Window Display Start Address bits 16-0 = ((Image address + (panel height x bpp ÷ 8)) ÷ 4) –1
(12)、Main Window Line Address Offset Register 0:R78h
{REG_MAIN_WIN_ADDR_OFFSET0 ,0xa0},
// Main Window Line Address Offset bits 9-0 = Display width in pixels ÷ (32 ÷ bpp) = 320/(32/16) = 160 = 0xa0
橫屏設(shè)置:
{REG_SPECIAL_EFFECTS ,0x40},
//Byte Swap,Floating Window disable,Eable 0 Display Rotate Mode(Normal)
{REG_MAIN_WIN_DISP_START_ADDR0 ,(MAIN_WIN_START_ADDR)>>2},
// Main Window Display Start Address Bits 16:0 = Image address ÷ 4 (valid only for Display Rotate Mode 0°)
{REG_MAIN_WIN_ADDR_OFFSET0 ,0xa0},
// Main Window Line Address Offset bits 9-0 = Display Width in pixels ÷ (32 ÷ bpp) = 320/(32/16) = 160 = 0xa0
(13)、Main Window Display Start Address Register:R75h、R76h
{REG_MAIN_WIN_DISP_START_ADDR1 ,0x00}, //R75h
{REG_MAIN_WIN_DISP_START_ADDR2 ,0x00}, //R76h
//Main Window Display Start Address Bits 16:0 = Image address ÷ 4 (valid only for Display Rotate Mode 0°)
(14)、Cursor1 Memory Start Register 0
{REG_CURSOR1_MEM_START0,(cursor1_win_addr) >>2},
// Cursor1 Memory Start Bits 16:0 = Cursor Image address ÷ 4 (valid only for Display Rotate Mode 0°)
(15)、Cursor1 Horizontal Size Register 0:RD8h
{REG_CURSOR1_HORIZ_SIZE_0,(LCD_WIDTH/16)-1},
//cursor horz size = panel width, see P102
(16)、 Cursor1 Vertical Size Register 0:RDCh
{REG_CURSOR1_VERT_SIZE_0,LCD_HEIGHT-1}, //cursor vert size = panel height,see P103
(17)、Cursor1 Color Index1 Register 0:RE0h
{REG_CURSOR1_COL_IND1_0, (0<<11)|(0<<5)|0 & 0x0000ffff}, //(R<<11)|(G<<5)|B
1926還有部分寄存器采用默認(rèn)的設(shè)置,其功能詳見SSD1926說明文檔,這里不一一詳述了!
需要改變的代碼:
1 、工程配置
在LCD_TIANMA/2137/case/include/目錄下,有一個(gè)工程配置文件“prj_config.h”,打開它,在第15行處有個(gè)#define CONFIG_PRJ_JK2801,我們的工程選用這個(gè)配置,其他的Project name全部已經(jīng)被我刪除掉了,以后要是選用其他配置,就要從2137提供的源代碼把這些宏定義找回來。
1.1 、橫屏豎屏宏、屏寬屏高定義
在Configurantion of project JK2801中(第102行),有個(gè)橫屏和豎屏的選項(xiàng),而我們這里選擇的是橫屏,代碼如下:
#if 1 //橫屏屏定義
#define IS_UPRIGHT 0 //橫屏顯示
#define VIDEO_TYPE_0x11
#else //豎屏定義
#define IS_UPRIGHT 1 //豎屏顯示
#define VIDEO_TYPE_0x12
#endif
還有就是屏寬和屏高的選擇,我們使用的是320*240的顯示屏,因此代碼如下:
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
1.2 、 LCD 驅(qū)動(dòng)類型宏定義
我們的驅(qū)動(dòng)芯片是SSD1926,因此我們定義一個(gè)宏來表示(第140行):
#define LCD_DRIVER LCD_DRIVER_SSD1926//LCD_DRIVER_CPT5408//屏驅(qū)動(dòng)類型
#define SSD1926_GPIO_INIT 1
1.3 、觸摸屏參數(shù)配置
然后在這個(gè)工程的配置中,還有一個(gè)Touch panel configuration(246行),我們將最前面計(jì)算好的觸摸屏坐標(biāo)的參數(shù)寫進(jìn)來就可以了:
// Modified by Shi 2009/05/31
//天馬屏觸摸屏的參數(shù)
#define TP_XLC 461
#define TP_YLC 3279
#define TP_YC 30
#define TP_XC 30
#define TP_KX 11765
#define TP_KY -14905
2 、SSD1926初始化和天馬屏初始化
LCD_TIANMA/2137/case/drivers/lcm/SSD1926.c 中包含了SSD1926的初始化和屏的初始化代碼。
2.1 、SSD1926初始化
(1) 、TFT時(shí)序設(shè)置: (第56行)
/******************************************/
/* TFT Panel Timing Control,共10個(gè)參數(shù) */
/******************************************/
//Horizontal Total
//HT = [((R12h_7-0) + 1) x 8 + (R13h_2-0)] pixels
//天馬屏HT=408 比亞迪屏HT=408
{REG_HORIZ_TOTAL_0 ,0x32}, //R12h
{REG_HORIZ_TOTAL_1 ,0x00}, //R13h
//Horizontal Display Period
//HDP = [((R14h_6-0) + 1) x 8] pixels
//天馬屏HDP=320 比亞迪屏HDP=320
{REG_HDP ,0x27}, //R14h
//Horizontal Display Period Start Position
//HDPS = [(R17h_2-0, R16h_7-0) + 5] pixels
//天馬屏HDPS=70 比亞迪屏=68
{REG_HDP_START_POS0 ,0x41}, //R16h
{REG_HDP_START_POS1 ,0x00}, //R17h
//Vertical Total
//VT = [(R19h_2-0, R18h_7-0) + 1] lines
//天馬屏VT=263 比亞迪屏=262
{REG_VERT_TOTAL0 ,0x06}, //R18h
{REG_VERT_TOTAL1 ,0x01}, //R19h
//Vertical Display Period
//VDP = [(R1Dh_1-0,R1Ch_7-0)+ 1] lines
//天馬屏VDP=240 比亞迪屏VDP=240
{REG_VDP0 ,0xef}, //R1Ch
{REG_VDP1 ,0x00}, //R1Dh
//Vertical Display Period Start Position
//VDPS = [(R1Fh_2-0,R1Eh_7-0)] lines
//天馬屏VDPS=13 比亞迪屏VDPS=18
{REG_VDP_START_POS0 ,0x0d}, //R1Eh
{REG_VDP_START_POS1 ,0x00}, //R1Fh
//LLINE Pulse Width
//HPW = [(R20h_6-0)+ 1] pixels
//天馬屏HPW=1 比亞迪屏HPW=2
{REG_HSYNC_PULSE_WIDTH ,0x00}, //R20h
//LLINE Pulse Start Position
//HPS = [(R23h_2-0, R22h_7-0) + 1] pixels
//天馬屏HPS=1 比亞迪屏HPS=1
{REG_HSYNC_PULSE_START_POS0 ,0x00}, //R22h
{REG_HSYNC_PULSE_START_POS1 ,0x00}, //R23h
//LFRAME Pulse Width
//VPW = [(R24h_2-0)+ 1] x HT + (R35h_2-0, RE34h_7-0) – (R31h_2-0, R30h_7-0) pixels
//天馬屏VPW=HT 比亞迪屏VPW=2*HT
{REG_VSYNC_PULSE_WIDTH ,0x00}, //R24h
{REG_FPFRAME_START_OFFSET0 ,0x00}, //R30h
{REG_FPFRAME_START_OFFSET1 ,0x00}, //R31h
{REG_FPFRAME_STOP_OFFSET0 ,0x00}, //R34h
{REG_FPFRAME_STOP_OFFSET1 ,0x00}, //R35h
//LFRAME Pulse Start Position
//VPS = [(R27h_2-0, R26h_7-0)] x HT + (R31h_2-0, R30h_7-0) pixels
//天馬屏VPS=HT 比亞迪屏VPS=HT
{REG_VSYNC_PULSE_START_POS0 ,0x00}, //R26h
{REG_VSYNC_PULSE_START_POS1 ,0x00}, //R27h
這里有一個(gè)需要注意的地方,盡管我們參照天馬屏提供的資料來設(shè)置參數(shù),但是發(fā)現(xiàn)顯示圖片相對(duì)屏幕可顯示區(qū)域有點(diǎn)向左偏移了,我們通過調(diào)試更改參數(shù)HDPS=75,有了一個(gè)比較好的參數(shù),如下:
{REG_HDP_START_POS0 ,0x46}, //R16h
(2) 、屏的DCLK頻率設(shè)置:(第40行和第164行)
//PCLK frequency = MCLK frequency * (PCLK Frequency Ratio + 1) / (2^20)
//PCLK Frequency Ratio = [R15Ah_3-0,R159h_7-0,R158h_7-0]
//here we have PCLK = MCLK * 0.08
{REG_PCLK_FREQ_RATIO_0 ,0xad}, //R158h
{REG_PCLK_FREQ_RATIO_1 ,0x47}, //R159h
{REG_PCLK_FREQ_RATIO_2 ,0x01}, //R15Ah
//PLL clocks setting , 80Mhz
SSD_REGWB(0x126,0x0A); //0x0a for 80Mhz
SSD_REGWB(0x127,0xC8);
SSD_REGWB(0x12B,0xAE);
SSD_REGWB(0x126,0x8A);//enable the PLL //0x8a for 80Mhz
(3) 、屏的初始化( 設(shè)置天馬屏的寄存器) :( 第194 行)
// 初始化NT39016
#define NT39016_SPI_WRITE(reg, data) spi_in(2, ((reg << 10) |(1 << 9) |data))
//初始化SPI
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x0F);//pull high 3 wire , Reset
msdelay(150);
NT39016_SPI_WRITE(0x00,0x07);
msdelay(150);
NT39016_SPI_WRITE(0x01,0x00);
msdelay(150);
NT39016_SPI_WRITE(0x02,0x03);
msdelay(150);
NT39016_SPI_WRITE(0x03,0xcc);
msdelay(150);
NT39016_SPI_WRITE(0x04,0x46);
msdelay(150);
NT39016_SPI_WRITE(0x05,0x0d);
msdelay(150);
NT39016_SPI_WRITE(0x06,0x00);
msdelay(150);
NT39016_SPI_WRITE(0x07,0x00);
msdelay(150);
NT39016_SPI_WRITE(0x08,0x08);
msdelay(150);
NT39016_SPI_WRITE(0x09,0x40);
msdelay(150);
NT39016_SPI_WRITE(0x0a,0x88);
msdelay(150);
NT39016_SPI_WRITE(0x0b,0x88);
msdelay(150);
NT39016_SPI_WRITE(0x0c,0x30);
msdelay(150);
NT39016_SPI_WRITE(0x0d,0x20);
msdelay(150);
NT39016_SPI_WRITE(0x0e,0x6a);
msdelay(150);
NT39016_SPI_WRITE(0x0f,0xa4);
msdelay(150);
NT39016_SPI_WRITE(0x10,0x04);
msdelay(150);
NT39016_SPI_WRITE(0x11,0x24);
msdelay(150);
NT39016_SPI_WRITE(0x12,0x24);
msdelay(150);
NT39016_SPI_WRITE(0x1e,0x00);
msdelay(150);
NT39016_SPI_WRITE(0x20,0x00);
msdelay(150);
事實(shí)上,我們采用了屏初始化后寄存器自己的默認(rèn)參數(shù),所以我們這里沒必要每個(gè)寄存器再寫入一次值,因?yàn)閺S家提供的默認(rèn)參數(shù)基本上是可以用的了,這里我們只需要修改寄存器R0eh,因?yàn)槲覀兊钠劣悬c(diǎn)閃,將這個(gè)寄存器的值改為0x6a后屏閃的現(xiàn)象就好了。所以只需要下面這幾條語(yǔ)句就夠了:
// 初始化NT39016
#define NT39016_SPI_WRITE(reg, data) spi_in(2, ((reg << 10) |(1 << 9) |data))
//初始化SPI
NT39016_SPI_WRITE(0x0e,0x6a);
msdelay(150);
(4) 、SPI 函數(shù)的修改:( 第260 行)
2137提供的spi初始化似乎有點(diǎn)問題,我將它改了,程序如下
#if SSD1926_GPIO_INIT
void spi_in (INT8U type, INT32U content) // 3-wire SPI
{
INT8U Bit;
INT32U compare;
INT8U cmd=0x70,data=0x72;
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x0f);//pull high 3 wire , Reset
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x0e); //GPIO0,SPENA set to low
switch(type)
{
case 0: //command
for (Bit=0; Bit<=7; Bit++)
{
compare = 1<<(7 - Bit);
if ((cmd & compare) > 0)
{
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x02|SSD2116_nReset_Hi); //1
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x06|SSD2116_nReset_Hi);
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x02|SSD2116_nReset_Hi);
}
else
{
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x00|SSD2116_nReset_Hi); //0
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x04|SSD2116_nReset_Hi);
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x00|SSD2116_nReset_Hi);
}
}
break;
case 1: //Data
for (Bit=0; Bit<=7; Bit++)
{
compare = 1<<(7 - Bit);
if ((data & compare) > 0)
{
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x02|SSD2116_nReset_Hi); // 1
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x06|SSD2116_nReset_Hi);
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x02|SSD2116_nReset_Hi);
}
else
{
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x00|SSD2116_nReset_Hi); // 0
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x04|SSD2116_nReset_Hi);
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x00|SSD2116_nReset_Hi);
}
}
break;
case 2: // 天馬屏初始化spi
for (Bit=0; Bit<=15; Bit++)
{
compare = 1<<(15 - Bit);
if ((content & compare) > 0)
{ SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x02|SSD2116_nReset_Hi); // 1
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x06|SSD2116_nReset_Hi); SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x02|SSD2116_nReset_Hi);
}
else
{
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x00|SSD2116_nReset_Hi); // 0
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x04|SSD2116_nReset_Hi);
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x00|SSD2116_nReset_Hi);
}
}
break;
case 3: // 比亞迪屏初始化spi
for (Bit=0; Bit<=23; Bit++)
{
compare = 1<<(23 - Bit);
if ((content & compare) > 0)
{
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x02|SSD2116_nReset_Hi); // 1
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x06|SSD2116_nReset_Hi);
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x02|SSD2116_nReset_Hi);
}
else
{
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x00|SSD2116_nReset_Hi); // 0
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x04|SSD2116_nReset_Hi);
SSD_REGWB(REG_GPIO_STATUS_CONTROL0,0x00|SSD2116_nReset_Hi);
}
}
break;
default:
break;
}
SSD_REGWB( REG_GPIO_STATUS_CONTROL0,0x0f);//pull high 3 wire , Reset
}
3 、需要更新的文件
除了以上的修改之外,還有需要更新一部分文件,需要更新的文件列表如下:
?
修改完畢后,將整個(gè)工程重新編譯再打包就可以生成固件了,然后就可以下載了,下載后你會(huì)看到一個(gè)已經(jīng)調(diào)試完好的天馬屏上顯示的完美圖像了!
重新編譯整個(gè)工程:打開Cygwin,在LCD_TIANMA/2137/case/makefile/路徑下,輸入命令:
./case.bat
然后回車,就會(huì)重新編譯整個(gè)工程了,但編譯過程中會(huì)有模塊camera會(huì)報(bào)錯(cuò),不管它,編譯完了之后在模塊camera中(LCD_TIANMA/2137/case/apps/camera)單獨(dú)再編譯(make)這個(gè)模塊就OK了。
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/Linruin/archive/2009/10/13/4665749.aspx
總結(jié)
以上是生活随笔為你收集整理的天马3.5寸TFT屏调试文档的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何建立一个网站(我的5年经验谈)
- 下一篇: Excel中比vlookup函数还要好用