asiavikin 发表于 2009-11-5 12:24:28

求助各位高手:ili9320与S3c2410白屏问题

我用s2410连接9320之后是白屏,请各位高手指教问题出在哪里?

硬件连接如下:
s2410             9320显示模块
===================================
gpc4            WR
gpc8            lcd interface mode select 0:16bits 1:8bits
gpc9            CS
gpc11             RD
gpc12             RS
gpc13             Reset
16根数据线接GPDDAT口 56000034

连接后通电,结果是白屏,我用ADS跟踪了内存,在GPCCON相应的56000024的位置的各个管脚变化是正常的。不仅如此,还用电表直接测量LCD模块的WR,CS,RS,Reset引脚的电平变化都是正常的,符合9320的写入信号规程(见下图)。在DB0-15的各个管脚也能量出正确的电平,例如画一条红线(调用函数Lcd_midline(0xF800)),则在LCD模块的DB15-0管脚量出数据为F800, 可这样为什么还是白屏?

/************************************************************************
**                                                                  **
** nCS       ----\__________________________________________/-------**
** RS      ------\____________/-----------------------------------**
** nRD       -------------------------------------------------------**
** nWR       --------\_______/--------\_____/-----------------------**
** DB------------------------------------------**
**                                                                  **
************************************************************************/


下面是我的函数以及宏定义:

#define LCD_LIM_16 rGPCDAT &= ~(1<<8) //GPC8 is to choose the interface mode. low level means 16bits mode. high means 8bits.

#define LCD_CS_HrGPCDAT |=(1<<9) //GPC9 is CS
#define LCD_CS_LrGPCDAT &= ~(1<<9)

#define LCD_WR_HrGPCDAT |=(1<<4) //GPC4 is WR
#define LCD_WR_LrGPCDAT &= ~(1<<4)

#define LCD_RD_HrGPCDAT |=(1<<11) //GPC11 is RD
#define LCD_RD_LrGPCDAT &= ~(1<<11)

#define LCD_RS_HrGPCDAT |=(1<<12) //GPC12 is RS
#define LCD_RS_LrGPCDAT &= ~(1<<12)

#define LCD_RESET_HrGPCDAT |=(1<<13) //GPC13 is reset signal to ili9320
#define LCD_RESET_LrGPCDAT &= ~(1<<13)

/**************************************************************
320×240 16Bpp TFT LCD数据和控制端口初始化
**************************************************************/
static void Lcd_Port_Init(void)
{
    rGPCUP = 0x0; // enable Pull-up register
    rGPCCON = 0xa565a9aa;

    rGPDUP = 0x0 ; // enable Pull-up register
    rGPDCON=0x55555555; //Initialize GPD
}


9320初始化:
static void Lcd_Init(void)
{

      LCD_LIM_16;   
      LCD_Delay(15);   

      LCD_RESET_H;            
      LCD_Delay(1);
      LCD_RESET_L;
      LCD_Delay(15);//>1ms
      LCD_RESET_H;
      LCD_Delay(150); //>10ms
   
   
      LCD_SetReg(0xE5,0x8000);
      LCD_SetReg(0x00,0x0001);//开启内部osc
      LCD_Delay(150);                        //延时10毫秒等待晶体稳定      
      LCD_SetReg(0x2B,0x0010);
      LCD_SetReg(0x01,0x0100);//driver output control,SS=1 S极输出移动方向S720到S1.   SM=0 【GS=0】 G极扫描方向从上到下(详细DATASHEET)
      LCD_SetReg(0x02,0x0700);//LCD driving control B/C=1 EOR=1 set the line inversion             
      LCD_SetReg(0x03,0x1230);//DFM=0,TRI=0,SWAP=1,16位system interface 写GRAM时翻转RGB数据到BRG数据   
                                                  //HWM=0,高速GRAM写操作禁止,高速写操作是否是激活RBG或其他动态画面显示模式?AM=0,ID=11   AC由左到右又下到上自增                  
      LCD_SetReg(0x04,0x0000);//比例缩放设置   
      LCD_SetReg(0x08,0x0202);                        
      LCD_SetReg(0x09,0x0000);             
      LCD_SetReg(0x0A,0x0000);   
      LCD_SetReg(0x0C,0x0000);//RIM1,RIM0=00,18bit RGB interface(01--16bit). DM1,DM0=00,internal clock (if 10,use RGB clock.moving pics.)   
      LCD_SetReg(0x0D,0x0000);             
      LCD_SetReg(0x0F,0x0000);//RBG 接口极性设置 DOTCLK ENABLE HSYNC           
      LCD_SetReg(0x50,0x0000);//水平 GRAM起始位置                     
      LCD_SetReg(0x51,0x00EF);//水平GRAM终止位置   
      LCD_SetReg(0x52,0x0000);//垂直GRAM起始位置                     
      LCD_SetReg(0x53,0x013F);//垂直GRAM终止位置   
      LCD_SetReg(0x60,0x2700);//G扫描设置 从G1开始   
      LCD_SetReg(0x61,0x0001);//Enables the grayscale inversion of the image by setting REV=1   
      LCD_SetReg(0x6A,0x0000);//不使用卷曲功能   
      LCD_SetReg(0x80,0x0000);          
      LCD_SetReg(0x81,0x0000);             
      LCD_SetReg(0x82,0x0000);             
      LCD_SetReg(0x83,0x0000);             
      LCD_SetReg(0x84,0x0000);             
      LCD_SetReg(0x85,0x0000);             
      LCD_SetReg(0x90,0x0010);             
      LCD_SetReg(0x92,0x0000);             
      LCD_SetReg(0x93,0x0003);             
      LCD_SetReg(0x95,0x0110);             
      LCD_SetReg(0x97,0x0000);             
      LCD_SetReg(0x98,0x0000);   
          
      LCD_SetReg(0x10,0x0000);//power control 1   
      LCD_SetReg(0x11,0x0000);//power control 2   
      LCD_SetReg(0x12,0x0000);//...   
      LCD_SetReg(0x13,0x0000);//power control 4   
      LCD_Delay(2000); //>200ms   
      LCD_SetReg(0x10,0x17B0);   
      LCD_SetReg(0x11,0x0004);   
      LCD_Delay(550); //>50ms   
      LCD_SetReg(0x12,0x013E);   
      LCD_Delay(550); //>50ms   
      LCD_SetReg(0x13,0x1F00);   
      LCD_SetReg(0x29,0x000F);   
      LCD_Delay(550); //>50ms          
      LCD_SetReg(0x20,0x0000);//GRAM水平起始位置   
      LCD_SetReg(0x21,0x0000);   
          
      LCD_SetReg(0x30,0x0204);             
      LCD_SetReg(0x31,0x0001);             
      LCD_SetReg(0x32,0x0000);              
      LCD_SetReg(0x35,0x0206);                        
      LCD_SetReg(0x36,0x0600);             
      LCD_SetReg(0x37,0x0500);                        
      LCD_SetReg(0x38,0x0505);             
      LCD_SetReg(0x39,0x0407);   
      LCD_SetReg(0x3C,0x0500);             
      LCD_SetReg(0x3D,0x0503);   
          
      LCD_SetReg(0x07,0x0173);//display control 1 写入0173是显示当前GRAM内容 写入0073是不显示当前   
}

写寄存器:
//------------------------------------------------------------------
// 函数名: void LCD_SetReg(INT8U addr,INT16U dat)
// 输入    : addr :寄存器地址 dat :写入的数据
// 输出    : Null
// 全局变量: Null
// 功能描述: 设寄存器值
//------------------------------------------------------------------
void LCD_SetReg(U16 addr,U16 dat)
{
         LCD_CS_L;
         LCD_RS_L;
       
         LCD_WR_L;
      
         LCD_PORT       =addr;

         LCD_WR_H;       
   
         LCD_RS_H;   
         LCD_WR_L;   
   
         LCD_PORT=dat;
       
         LCD_WR_H;
   
         LCD_CS_H;       
       
}



/**************************************************************
320×240 16Bpp TFT LCD单个象素的显示数据输出
**************************************************************/
static void PutPixel(U32 x,U32 y,U32 color)
{       
         LCD_SetReg(0x20,x);
       
         LCD_SetReg(0x21,y);
       
         LCD_SetReg(0x22,color);

}

static void Lcd_midline(U16 c) //在屏幕中央画一条线
{
      unsigned int x;
          
      for(x = 0 ; x < SCR_XSIZE_TFT_240320 ; x++)
               
            PutPixel(x,160,c);
}

cqfeiyu 发表于 2009-11-5 15:57:38

http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1563849&bbs_page_no=1&search_mode=1&search_text=ILI9325&bbs_id=9999

asiavikin 发表于 2009-11-6 09:27:34

谢谢楼上的兄弟,可是我看了您给的帖子,那里并不存在我这样的问题啊。我用的程序是在别人那里成功运行了的,为什么在我这里就不行了呢?信号的时序都是符合要求的,为什么白屏呢?

lilcm 发表于 2009-11-7 21:27:26

把你的文件以附件的形式贴出来,我帮你看看,绝对是你的程序有问题,我用2410测的是RGB接口,没有问题呀,你用的是MCU接口,与我的有点不同.

asiavikin 发表于 2009-11-9 10:30:34

感谢楼上两位兄弟的热心帮助。
这是我的程序,现在终于可以显示了,最终是把CS引脚换了一下。程序除CS所处管脚以外基本未改。
点击此处下载 ourdev_501325.rar(文件大小:784K) (原文件名:lcd9320-test.rar)

lilcm 发表于 2009-11-9 19:27:12

/cs用哪个脚都一样,程序我看了下,都大同小异,LCD模拟程序都是这样的,只是模拟口有不同,没有发现异常.
LCD如果有写寄存器指令动作,一定要先写0X22指令,再写显示数据,LCD才会显示.
调试时你可以在程序中设置断点,查看寄存器的值是否正常,另一方面用示波器看LCM引脚的波形是否正常,这样问题就可以推查到.

clever0725 发表于 2010-9-14 16:06:38

试试

MZ_Guo 发表于 2011-5-10 11:11:38

这其实还得你自己找原因,因为硬件是你自己手上,不一下下试还真不好找问题在哪
就像我原来一样,我的lcd的数据端口用的是GPIOB(STM32F10x的),而B口上有两根线是用于调试的JTAG线,
上电默认是用于调试的,不能用于普通IO口,
而我一开始没注意,总也不行,也是白屏,弄了一天多时间,总算认真看了一下手册,才发现这个问题,把JTAG禁用,一切OK
页: [1]
查看完整版本: 求助各位高手:ili9320与S3c2410白屏问题