天马3.5寸TFT屏调试文档
天马 3.5 寸 TFT 屏调试文档
王小涛 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
天马3.5寸TFT屏调试文档相关推荐
- 天马8.4寸军工屏P0840XGF1MA00-8.4寸军工屏
天马 (TIANMA) 推出的P0840XGF1MA00是一款采用a-Si TFT-LCD技术的8.4英寸液晶模组产品,它装配有WLED背光,无背光驱动,无触摸. 总结它的典型特征为: 宽温,超高亮度 ...
- 0.1.3 合宙CORE-ESP32-C3开发板用arduino点亮ST7735 1.8寸TFT屏【已更新失效链接2022.07.10】
9.9的ESP32开发板想用arduino开发,无奈都是用luatos玩,于是折腾了下 目的 用arduino驱动合宙ESP32-C3开发板点亮S7735TFT屏 材料 CORE-ESP32-C3开发 ...
- MPS 电源芯片调试文档
MPS 电源芯片调试文档 目前需要整版调试,其中一点需要实时监测 MPS 电源芯片的Vddn Vddp 电流 & Power consumption(功耗). 通信机制:SMBUS 原理 MP ...
- win10隐藏3D对象、视屏、文档(隐藏侧边栏/导航图标)
左侧边侧栏(导航窗口)中的文件夹有:"3D对象,视频,图片,文档,下载,音乐,桌面",另外还有一个OneDrive的文件夹.由于比较占据边侧栏空间,所以很有必要将其隐藏起来.那么我 ...
- 全志A40I开发板10.1寸MIPI屏调试
天嵌A40i核心板,天嵌科技出品的又一款工业级核心板,采用4核ARM Cortex-A7处理器设计,每核主频高达1.2GHz. 注:本文所调试屏的参数是适配天嵌10.1寸电容触摸屏的,其他的mipi屏 ...
- android平台1.3寸OLED屏调试
引言: Android平台为彩色屏,图片格式为RGB8888,而1.3寸OLED屏为黑白屏,即像素为1,让屏正常工作能采用的方案有: 1. 方便apk开发,减少应用层开发的工作量,采取读取frameb ...
- 【墨水屏】1.54寸墨水屏调试记录
某宝某店墨水屏挺便宜,买了几个尝试着使用以下. 同时买了微雪的ESP32墨水屏专用驱动板. 由于1.54寸的小屏节假日期间一直没有发货,所以先用了手头的7.5寸屏测试了一下EPS32驱动板,功能一切正 ...
- dalsa线扫相机调试文档_线阵相机调试文档
1.相机型号参数相机:线16k CL 分辨率:16384 x 1 像素大小:3.52 μm x 3.52 μm 麦克斯行费率:48 千赫 镜头安装(螺纹):M72 x 1 产品编号:LA-CM-16K ...
- 天马10.1寸液晶屏TM101JDHG40-TM101JDHG40产品规格资料
天马 (TIANMA) 推出的TM101JDHG40是一款采用a-Si TFT-LCD技术的10.1英寸液晶模组产品,它装配有WLED背光,含LED驱动器背光驱动,无触摸.总结它的典型特征为: 白光L ...
最新文章
- linux创建用户并授予sudo权限
- Linux操作系统(一:基本操作)
- 工作中一些代码优化的地方
- android input设备event处理以及hotplug检测
- raspberrypi python传感器_Raspberry Pi和Arduino读取串行传感器d
- 关于laravel报错Class 'Barryvdh\Debugbar\ServiceProvider' not found
- EAS 后台事务配置
- 天气预报接口api(中国天气网)
- OLED显示模块驱动原理及应用
- 小程序分享图片给好友,到朋友圈,保存到本地
- winform遍历bartender_标签打印软件 - 第25页 共52页 - BarTender
- java微信支付v3系列——6.微信支付查询订单API
- 客户端禁止 cookie,session 还能用吗?
- [深度学习]Part1 Python学习进阶Ch23爬虫Spider——【DeepBlue学习笔记】
- LeetCode第 764 题:最大加号标志(C++)
- git clean 命令详解
- 宝锋UV-5R说明书下载
- [面试算法]24点计算
- Windows查看局域网在线的所有IP
- 天很蓝,应该不会下雨