分享

天马3.5寸TFT屏调试文档http://blog.csdn.net/linruin/article/details/4665749

 transcend_0 2015-07-16

王小涛 2009 年 6 月 12 日

修订版

1 、坐标定位

触摸屏点击时驱动读入的是ADC值,也就是电压值(AD后),一个是x坐标的ADC值,一个是y坐标的ADC值。一个点的x坐标和y坐标的ADC值存放在变量LogicNumber[presstimes]中,高16位是x坐标的ADC值,低16位是y坐标的ADC值,而ADC值也就是屏幕的逻辑坐标值,因此在变量LogicNumber[presstimes]中存储的实际上也是屏的逻辑坐标值。

ADC值是通过函数LogicNumber[presstimes] = WRTAmuse.Common.getStoredNumber();来读取的。

我们的坐标定位程序设置了五个基准点(屏幕坐标),五个基准点(屏幕坐标)分别如下:

PointPX[0] = 30; //第一个基准点的屏幕坐标

PointPY[0] = 30;

PointPX[1] = 290; //第二个基准点的屏幕坐标

PointPY[1] = 30;

PointPX[2] = 30; //第三个基准点的屏幕坐标

PointPY[2] = 210;

PointPX[3] = 290; //第四个基准点的屏幕坐标

PointPY[3] = 210;

PointPX[4] = 160; //第五个基准点的屏幕坐标

PointPY[4] = 120;

通过依次点击这五个基准点分别得到五个点的逻辑坐标值,并判断用户是否对准五个点依次点击。当用户操作正确后,我们的坐标定位程序会将用户依次点击的五个基准点的逻辑坐标记录下来。然后通过线性回归公式计算得出LCD屏的屏幕坐标系与逻辑坐标系之间的比例关系(即计算出参数KX和KY)。而事实上我们的坐标定位程序需要六个参数,其中有四个参数是直接得到的,有两个是需要计算出来的(即KX和KY)。六个参数如下:

XLC(第一个点的逻辑x坐标,即x方向的ADC值)、

YLC(第一个点的逻辑y坐标,即y方向的ADC值)、

XC(第一个点的屏幕x坐标,这里是30)、

YC(第一个点的屏幕y坐标,这里是30)、

KX(逻辑坐标系和屏幕坐标系的x轴比例关系)、

KY(逻辑坐标系和屏幕坐标系的y轴比例关系)。

其中XLC和YLC可以通过函数

LogicNumber[presstimes] = WRTAmuse.Common.getStoredNumber();读取,而XC和YC是我们自己预先设置好的屏幕坐标,KX和KY的计算公式如下:

未命名

我们运行我们的坐标定位程序,并通过程序将坐标信息打印出来。结果如下:

_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

//刚开始调试大屏的时候,坐标不准,是因为硬件上x和y两根线反了,调过来就ok了。

2 、天马屏的时序

未命名

一般来说,液晶屏或者是ssd1926在上电复位后,其寄存器会有一个默认的参数。一般来说我们可以选择屏复位后的默认参数,然后通过设置ssd1926的寄存器来匹配屏的那些默认参数。而我们的调试正是通过设置ssd1926的寄存器来配合屏的默认参数的。

我们先看看天马屏的默认参数:

未命名

其中大部分寄存器都可以采用默认参数,只有少数需要进行修改。下面将介绍那部分需要修改的寄存器:

R03h:一般来说,DEN都是为高有效,CLKIN上升沿锁存数据,HSD为低有效,VSD为低有效,24-bit digital RGB input format HV Mode,6.4M。

R0eh:当时出现屏闪的现象,实际上就是这个寄存器参数的问题。我们将这个寄存器值设置为0x6A后,屏闪的现象就消失了。我们在设置这个寄存器的时候,主要是改变VCOMDC的值。但我们在写入寄存器的时候,记得Bit[6](即OTP_BYPS)要设置为1。否则VCOMDC的值不会被写入。

R04h:设置Source Timing delay control register,默认为:70,实际上就是SSD1926中的HDPS

R05h:设置Gate Timing delay control register,默认为:13,实际上就是SSD1926中的VDPS

虽然这里我们是采用天马屏的默认参数来用,但有时候我们需要对屏的一些参数进行一些调整,这里先介绍下如何设置屏的参数。

一般来说设置屏的参数是通过SPI,I2C或者是串口等方式来实现的,一般来说SPI和I2C用得比较多,而我们的天马屏正是SPI接口来设置屏参数的。所以我们要在天马屏的手册中找到屏的SPI时序,如下图:

注意:不同屏的SPI时序可能有所不同,详细应该参见屏的技术手册。

未命名

未命名

可以看到,其SPI时序,SDI是串行数据,高6位是寄存器的地址,接下来是一个读写标志位,然后一个高阻位,接下来就是数据了。可以看到,时序是先发高位,再发低位。因此我们的SPI程序(详见2137/case/drivers/lcm/SSD1926.c)。我们的SPI接口电路如下:

未命名

3 SSD1926 TFT 屏的时序控制

接下来我们看看SSD1926中对TFT屏的时序控制:

未命名

其中对TFT屏的时序控制涉及到几个参数的设置:

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

我们从天马屏的资料中可以看到天马屏的时序图和一些参数表

未命名

从时序图中我们可以看到了:HSYNC、VSYNC为低有效,而DEN为高有效,且在DCLK上升沿锁存数据。这与屏的寄存器R03h的默认参数一致。

我们先来设置SSD1926是输出时钟PCLK(Pixel CLK),使得SSD1926提供给屏的DCLK刚好的6.4M,我们从原理图中可以看出,SSD1926的外部晶振为4M。

未命名

其中M=[R127_7-0],N=[R126_4-0]。

设置PLL_CLK的时序如下,(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的默认值,即0。所以MCLK=64M/1=80M

我们仅使用PCLK(Pixel CLK,即液晶屏的DCLK),而SD_CLK引脚我们尚未使用。

我们现在配置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

至此,我们已经将PCLK设置完毕

{REG_PCLK_FREQ_RATIO_0 ,0xad}, //R158h

{REG_PCLK_FREQ_RATIO_1 ,0x47}, //R159h

{REG_PCLK_FREQ_RATIO_2 ,0x01}, //R15Ah

未命名

从参数表中我们可以看到屏的DCLK的频率是6.4M,我们在前面已经将SSD1926的PCLK设置为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。

根据以上天马屏的默认参数,我们对SSD1926的寄存器设置如下,以匹配天马屏的参数。

/******************************************/

/* TFT Panel Timing Control,共10个参数 */

/******************************************/

//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 的其他设置

(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设置中还有一部分是关于横屏和竖屏的,以下为设置的寄存器

竖屏设置:

(10)、Special Effects Register :R71h

{REG_SPECIAL_EFFECTS ,0x41},

//Byte Swap,Floating Window disable,Eable 90 Display Rotate Mode

选择了旋转角度后,下面两个寄存器是通过计算算出来的,具体公式详见SSD1926文档。注意不同旋转角度的计算公式不同。

(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

横屏设置:

{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还有部分寄存器采用默认的设置,其功能详见SSD1926说明文档,这里不一一详述了!

需要改变的代码:

1 、工程配置

在LCD_TIANMA/2137/case/include/目录下,有一个工程配置文件“prj_config.h”,打开它,在第15行处有个#define CONFIG_PRJ_JK2801,我们的工程选用这个配置,其他的Project name全部已经被我删除掉了,以后要是选用其他配置,就要从2137提供的源代码把这些宏定义找回来。

1.1 、横屏竖屏宏、屏宽屏高定义

在Configurantion of project JK2801中(第102行),有个横屏和竖屏的选项,而我们这里选择的是横屏,代码如下:

#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 驱动类型宏定义

我们的驱动芯片是SSD1926,因此我们定义一个宏来表示(第140行):

#define LCD_DRIVER LCD_DRIVER_SSD1926//LCD_DRIVER_CPT5408//屏驱动类型

#define SSD1926_GPIO_INIT 1

1.3 、触摸屏参数配置

然后在这个工程的配置中,还有一个Touch panel configuration(246行),我们将最前面计算好的触摸屏坐标的参数写进来就可以了:

// Modified by Shi 2009/05/31

//天马屏触摸屏的参数

#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时序设置: (第56行)

/******************************************/

/* TFT Panel Timing Control,共10个参数 */

/******************************************/

//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

这里有一个需要注意的地方,尽管我们参照天马屏提供的资料来设置参数,但是发现显示图片相对屏幕可显示区域有点向左偏移了,我们通过调试更改参数HDPS=75,有了一个比较好的参数,如下:

{REG_HDP_START_POS0 ,0x46}, //R16h

(2) 、屏的DCLK频率设置:(第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) 、屏的初始化( 设置天马屏的寄存器) :( 第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);

事实上,我们采用了屏初始化后寄存器自己的默认参数,所以我们这里没必要每个寄存器再写入一次值,因为厂家提供的默认参数基本上是可以用的了,这里我们只需要修改寄存器R0eh,因为我们的屏有点闪,将这个寄存器的值改为0x6a后屏闪的现象就好了。所以只需要下面这几条语句就够了:

// 初始化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 函数的修改:( 第260 行)

2137提供的spi初始化似乎有点问题,我将它改了,程序如下

#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 、需要更新的文件

除了以上的修改之外,还有需要更新一部分文件,需要更新的文件列表如下:

未命名  

修改完毕后,将整个工程重新编译再打包就可以生成固件了,然后就可以下载了,下载后你会看到一个已经调试完好的天马屏上显示的完美图像了!

重新编译整个工程:打开Cygwin,在LCD_TIANMA/2137/case/makefile/路径下,输入命令:

./case.bat

然后回车,就会重新编译整个工程了,但编译过程中会有模块camera会报错,不管它,编译完了之后在模块camera中(LCD_TIANMA/2137/case/apps/camera)单独再编译(make)这个模块就OK了。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Linruin/archive/2009/10/13/4665749.aspx

版权声明:本文为博主原创文章

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多