主题 : 求助各位高手:裸机程序LCD控制器点亮RGB接口的TFT 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 40892
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
贡献值: 0 点
综合积分: 20 分
注册时间: 2011-03-23
最后登录: 2013-03-29
楼主  发表于: 2011-04-21 09:48

 求助各位高手:裸机程序LCD控制器点亮RGB接口的TFT

各位高手,我要用mini2440的LCD控制器点亮驱动芯片为ILI9342的RGB接口的横屏TFT320乘240,但是始终没有成功,特来求助。此TFT是SPI-3&RGB接口的,即3线串口+RGB,初始化后TFT屏幕有反应,但是不能显示,但是我把开发板附带的NEC屏挂上去是可以显示的。下面是我写的程序代码,附件是TFT芯片规格书和接口,请高手指点一下,谢了。 ILI9342_DS_V015_20110225.part1.rar (977 K) 下载次数:62    ILI9342_DS_V015_20110225.part2.rar (977 K) 下载次数:129    ILI9342_DS_V015_20110225.part3.rar (267 K) 下载次数:59    TFT interface.rar (10 K) 下载次数:53
#include "S3C2440.h"
//#include "config.h"
typedef  unsigned short uint16;
typedef  unsigned int  uint32;
typedef  unsigned char uint8;

#define LCD_WIDTH 320
#define LCD_HEIGHT 240
#define LCD_PIXCLOCK 7

#define LCD_RIGHT_MARGIN 36
#define LCD_LEFT_MARGIN 19
#define LCD_HSYNC_LEN 3

#define LCD_UPPER_MARGIN 1
#define LCD_LOWER_MARGIN 5
#define LCD_VSYNC_LEN 1

#define LCD_XSIZE  LCD_WIDTH
#define LCD_YSIZE  LCD_HEIGHT
#define SCR_XSIZE  LCD_WIDTH
#define SCR_YSIZE  LCD_HEIGHT
/*********************************************************************/
volatile static unsigned short LCD_BUFFER[SCR_YSIZE][SCR_XSIZE];
/*********************************************************************/
void delay(uint32 dly)
{
     uint32 i;
     for(;dly>0;dly--)
     {
        for(i=0;i<1000;i++);
     }
}
/*********************************************************************/
void Lcd_Port_Init( void )
{
    GPCUP=0xffffffff; // Disable Pull-up register
    GPCCON=0xaaaa02a8; //Initialize VD[7:0],VM,VFRAME,VLINE,VCLK

    GPDUP=0xffffffff; // Disable Pull-up register
    GPDCON=0xaaaaaaaa; //Initialize VD[15:8]
}
/*********************************************************************/
void LCD_Init(void)
{
#define    M5D(n)    ((n)&0x1fffff)
#define LCD_ADDR ((uint32)LCD_BUFFER)
     LCDCON1 = ((LCD_PIXCLOCK << 8) | (3 <<  5) | (13 << 1));
        //LCDCON2 = (LCD_UPPER_MARGIN << 24) | ((LCD_HEIGHT - 1) << 14) | (LCD_LOWER_MARGIN << 6) | (LCD_VSYNC_LEN << 0);
     LCDCON2 = ((2 << 24) | ((LCD_HEIGHT - 1) << 14) | (4 << 6) | (2 << 0));
        LCDCON3 = ((20 << 19) | ((LCD_WIDTH  - 1) <<  8) | (10 << 0));
        LCDCON4 = ((10 << 0));

#if !defined(LCD_CON5)
//#    define LCD_CON5 ((1<<11) | (1 << 9) | (1 << 8) | (1 << 3) | (1 << 0))
#    define LCD_CON5 ((1<<10) |(1 << 9) | (1 << 8))
#endif
     LCDCON5   =  LCD_CON5;

     LCDSADDR1 = ((LCD_ADDR >> 22) << 21) | ((M5D(LCD_ADDR >> 1)) <<  0);
     LCDSADDR2 = M5D((LCD_ADDR + LCD_WIDTH * LCD_HEIGHT * 2) >> 1);
     LCDSADDR3 = LCD_WIDTH;        

     LCDINTMSK |= 3;
       LPCSEL   &= (~7);


        TPAL     = 0x0;
        LPCSEL &= ~((1<<4) | 1);

    
}
/*********************************************************************/
static void Lcd_EnvidOnOff(int onoff)
{
    if(onoff==1)
    LCDCON1|=1; // ENVID=ON
    else
    LCDCON1 =LCDCON1 & 0x3fffe; // ENVID Off
}
/*********************************************************************/
static void Lcd_ClearScr( uint32 c)
{
    unsigned int x,y ;
        
    for( y = 0 ; y < SCR_YSIZE ; y++ )
    {
        for( x = 0 ; x < SCR_XSIZE ; x++ )
        {
            LCD_BUFFER[y][x] = c ;
        }
    }
}
/*********************************************************************/
void SPI_WR_COMMAND_ID0(uint8 cmd)
{
     uint8 temp,i;
     temp=cmd;
     GPEDAT &=(~(1<<13)); //cs=0;
     GPEDAT &=(~(1<<15));//send cmd     set 0
     GPEDAT &=(~(1<<14));//sck=0
     GPEDAT |=(1<<14);    //sck=1
     for(i=0;i<8;i++)
     {
         if(temp&0x80)
            GPEDAT |=(1<<15); //set 1
        else
            GPEDAT &=~(1<<15); //set 0
         GPEDAT &=~(1<<14);//sck=0
         GPEDAT |=(1<<14);    //sck=1
         temp=temp<<1;
     }
     GPEDAT |=(1<<13);//cs=1
}
/*********************************************************************/
void SPI_WR_DATA_ID0(uint8 dat)
{
     uint8 temp,i;
     temp=dat;
     GPEDAT &=~(1<<13); //cs=0;
     GPEDAT |=(1<<15);//send data    set 1
     GPEDAT &=~(1<<14);//sck=0
     GPEDAT |=(1<<14);    //sck=1
     for(i=0;i<8;i++)
     {
         if(temp&0x80)
            GPEDAT |=(1<<15);
        else
            GPEDAT &=~(1<<15);
         GPEDAT &=~(1<<14);//sck=0
         GPEDAT |=(1<<14);    //sck=1
         temp=temp<<1;
     }
     GPEDAT |=(1<<13);//cs=1
}
/*********************************************************************/
void wr_disdat(uint8 dat1,uint8 dat2)
{
    uint16 i,j;
    SPI_WR_COMMAND_ID0(0x2a);
    SPI_WR_DATA_ID0(0x00);
    SPI_WR_DATA_ID0(0x00);
    SPI_WR_DATA_ID0(0x01);
    SPI_WR_DATA_ID0(0x40);
    SPI_WR_COMMAND_ID0(0x2b);
    SPI_WR_DATA_ID0(0x00);
    SPI_WR_DATA_ID0(0x00);
    SPI_WR_DATA_ID0(0x00);
    SPI_WR_DATA_ID0(0xf0);

    SPI_WR_COMMAND_ID0(0x002C);
    for(i=0;i<240;i++)
    {
        for(j=0;j<320;j++)
        {
           SPI_WR_DATA_ID0(dat1);
           SPI_WR_DATA_ID0(dat2);
        }
    }
}
/*********************************************************************/
void LCD_INIT0(void)
{
   //LCM_RES=1;
   GPEDAT |=(1<<11);    //reset=1
   //Delayms(10);
   delay(10);
   //LCM_RES=0;
   GPEDAT &=(~(1<<11));//reset=0
   //Delayms(10);
   delay(10);
   //LCM_RES=1;
   GPEDAT |=(1<<11);    //reset=1
   //Delayms(100);
   delay(50);
SPI_WR_COMMAND_ID0(0xB9);
SPI_WR_DATA_ID0 (0xFF);
SPI_WR_DATA_ID0 (0x93);
SPI_WR_DATA_ID0 (0x42);
SPI_WR_COMMAND_ID0(0x21);
SPI_WR_COMMAND_ID0(0x36);
SPI_WR_DATA_ID0 (0xC8);
SPI_WR_COMMAND_ID0(0xC0);
SPI_WR_DATA_ID0 (0x28);
SPI_WR_DATA_ID0 (0x0A);
SPI_WR_COMMAND_ID0(0xC1);
SPI_WR_DATA_ID0 (0x02);
SPI_WR_COMMAND_ID0(0xC5);
SPI_WR_DATA_ID0 (0x2F);
SPI_WR_DATA_ID0 (0x2F);
SPI_WR_COMMAND_ID0(0xC7);
SPI_WR_DATA_ID0 (0xC3);
SPI_WR_COMMAND_ID0(0xB8);
SPI_WR_DATA_ID0 (0x0B);
SPI_WR_COMMAND_ID0(0xE0);
SPI_WR_DATA_ID0 (0x0F);
SPI_WR_DATA_ID0 (0x22);
SPI_WR_DATA_ID0 (0x1D);
SPI_WR_DATA_ID0 (0x0B);
SPI_WR_DATA_ID0 (0x0F);
SPI_WR_DATA_ID0 (0x07);
SPI_WR_DATA_ID0 (0x4C);
SPI_WR_DATA_ID0 (0x76);
SPI_WR_DATA_ID0 (0x3C);
SPI_WR_DATA_ID0 (0x09);
SPI_WR_DATA_ID0 (0x16);
SPI_WR_DATA_ID0 (0x07);
SPI_WR_DATA_ID0 (0x12);
SPI_WR_DATA_ID0 (0x0B);
SPI_WR_DATA_ID0 (0x08);
SPI_WR_COMMAND_ID0(0xE1);
SPI_WR_DATA_ID0 (0x08);
SPI_WR_DATA_ID0 (0x1F);
SPI_WR_DATA_ID0 (0x24);
SPI_WR_DATA_ID0 (0x03);
SPI_WR_DATA_ID0 (0x0E);
SPI_WR_DATA_ID0 (0x03);
SPI_WR_DATA_ID0 (0x35);
SPI_WR_DATA_ID0 (0x23);
SPI_WR_DATA_ID0 (0x45);
SPI_WR_DATA_ID0 (0x01);
SPI_WR_DATA_ID0 (0x0B);
SPI_WR_DATA_ID0 (0x07);
SPI_WR_DATA_ID0 (0x2F);
SPI_WR_DATA_ID0 (0x36);
SPI_WR_DATA_ID0 (0x0F);

SPI_WR_COMMAND_ID0(0x11); //Exit Sleep
delay(10);
SPI_WR_COMMAND_ID0(0x11); //Exit Sleep
delay(80);
SPI_WR_COMMAND_ID0(0x3A); //SET 65K COLOR
SPI_WR_DATA_ID0 (0x66);
SPI_WR_COMMAND_ID0(0xB0); //SET EPL,DPL,VSL,HSL
SPI_WR_DATA_ID0 (0xe0);
SPI_WR_COMMAND_ID0(0xf6); //SET Interface Control
SPI_WR_DATA_ID0 (0x01);
SPI_WR_DATA_ID0 (0x00);
SPI_WR_DATA_ID0 (0x02);
SPI_WR_COMMAND_ID0(0x29); //Display ON
SPI_WR_COMMAND_ID0(0x2c); //
}
/*********************************************************************/
void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
{
    //Led_Display(0x8);

    MPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
    //Led_Display(0x0);
}
/*********************************************************************/
int main(void)
{
    uint32 mpll_val=0;
    mpll_val = ((92<<12)|(1<<4)|(1));
    ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);

    GPECON=((1<<30)|(1<<28)|(1<<26)|(1<<22));
    GPEDAT=((1<<15)|(1<<14)|(1<<13)|(1<<11));
    GPEUP=((1<<15)|(1<<14)|(1<<13)|(1<<11));
        
    LCD_INIT0();
    GPEDAT  &=~(1<<13); //cs=0;
    
    Lcd_Port_Init();
    LCD_Init();
    Lcd_EnvidOnOff(1);
    Lcd_ClearScr(1515<<4);    
     while(1)
    {
         //wr_disdat(0x55,0xaa);
         //delay(1000);
    }
}
[ 此帖被hyml在2011-05-03 15:10重新编辑 ]
级别: 新手上路
UID: 40892
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
贡献值: 0 点
综合积分: 20 分
注册时间: 2011-03-23
最后登录: 2013-03-29
1楼  发表于: 2011-04-21 09:52
附件是规格书和接口
级别: 新手上路
UID: 42770
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2011-04-11
最后登录: 2017-09-13
2楼  发表于: 2011-04-27 14:40
可以用示波器,或者逻辑分析仪将spi和 rgb的波形测出来看看; 我用过三星,奇景的驱动芯片,芯片初始化成功是,现象是‘花屏‘,gram的数据随机的;如果出现这个现象,至少说明spi这边已经没有问题了,然后你再看看rgb那边;
级别: 新手上路
UID: 42770
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2011-04-11
最后登录: 2017-09-13
3楼  发表于: 2011-04-27 14:46
刚看了下,驱动芯片的规格书,支持spi发送图片的,你可以先spi把图片调试出来;
级别: 新手上路
UID: 40892
精华: 0
发帖: 10
金钱: 50 两
威望: 10 点
贡献值: 0 点
综合积分: 20 分
注册时间: 2011-03-23
最后登录: 2013-03-29
4楼  发表于: 2011-05-03 15:14
谢谢大家的关注,问题解决了,是送数据的时候没有延时,以至指令数据不能正确写入.再次感谢诸位的帮助