关于mini2440LCD模块总结

一.平台:mini2440 + sony ACX502BMU-7(TFT屏  采用16bpp  240*320)

二.模块简述:


首先我们从上面的硬件原理图可知:我们需要配置的引脚有除了VDDLCD  nRESET

TSXM TSYM TSXP TSYP 以及那些接地的引脚,所有的引脚都要进行配置。

三.下面是mini2440 LCD模块的系统框图:


从上图可知:图片数据首先是存放在内存中,然后通过一个LCDCDMA将缓存里面的图片数据运送到LCD控制器,然后数据通过VD[0~23]从LCD控制器运送到LCD驱动器,而LCD控制器和LCD驱动器之间的数据线,控制线 时钟线 是用来维持LCD控制器和LCD驱动器之间的稳定的,最后驱动器将图片数据显示在TFT LCD上面。这就是LCD模块工作的整个流程。

四.下面是看它的timing图和BLOCK DIAGRAM(2440手册):


从上图中我们可以获取到以下信息:

 VSYNC(场同步信号) 是一帧数据开始刷新的信号,其中VSPW+1那一段是场的肩宽,VBPD+1是后消隐,接下来就是一帧数据显示的有效信号了(LINEVAL+1=320),然后VFPD+1是前消隐,所以我们可以看到:一帧数据的传输要经过以下流程:VSPW+1(场的肩宽)+VBPD+1(后消隐)+有效数据传输(LINEVAL+1)+VFPD+1(前消隐)而这些是以行为单位的。

然后我们再看下上图的下方有一个HSYNC(行同步信号)是一行数据开始传输的信号,

其中传输一行数据也要经过以下几个步骤:HSPW+1(行的肩宽)+HBPD+1(后消隐)+ 有效数据传输HOZVAL+1(240)+HFPD+1(前消隐)。

从图中我们还可以看到 VDEN(数据使能)、LEND(行结束)  VCLK(位时钟) 这些信号,而且最上面的INT_FrSyn是产生中断信号 ,每传完一帧数据后就会发生一次中断。

五.我们再来看一下SONY ACX502BMU-7 这块屏的用户手册 中的timing 图.


从上图一行数据传输的时序图:其中DATA那一栏可以看到一行数据传输完后,中间会有(Invalid data)这么一段空的时间,结合mini2440的用户手册可以知道:这段时间为32 = HSPW + 1(行肩宽)+ HBPD +1 (后消隐) + HFPD +1 (前消隐).


从上面一帧数据传输的timing 图可以知道,在传输完一帧数据之后与传输一帧数据之前会隔一段时间,由上图可知这段时间为 16 lines。

通过结合mini2440中的timing 图,我们可以知道 :VSPW +1(场肩宽) + VBPD +1(后消隐)+ VFPD +1 (前消隐)= 16. 

特别注意:

在这款sony的LCD中,并没有说明 HSPW  HBPD HFPD VSPW VBPD VFPD 的值为多少或者在哪一个范围,所以我们只要使它们满足上面的两个表达式就可以了。



再从SONY LCD 数据手册里面的 operating  condition 中可以看出(如上图):

水平频率  垂直频率 以及 VCLK 值的范围。为:4.57~5.94这个范围。

六.mini2440 LCD 模块配置步骤:

1.配置相关的引脚

2.配置相关寄存器(LCDCON1~LCDCON5)

配置LCDCON5时,第11位配置为5:6:5 format.  第(7~10)位根据sony用户手册和mini2440用户手册两个时序图中信号的差别,如果在mini2440中是低电平,而在sony用户手册中是高电平,那么就需要配置为翻转模式。如:第6位VDEN信号就需要配置翻转(sony手册有误)。

其中最低两位(BSWP  HWSWP)配置为 01 表示低数据放在低位。

3.配置 frame相关的寄存器.(LCDSADDR1~LCDSADDR3)

其中LCDSADDR3是关于虚拟屏的,在本块sony的屏中没有关于虚拟屏的内容,所以对于LCDSADDR3在这里我们就不要配置了。

关于LCDSADDR1 是 关于存放 图片数据在内存地址中的寄存器。

其中【29:21】是存放图片数据内存地址的A【30:22】,【20,0】存放的是A【21:1】.

关于LCDSADDR2 是存放关于存放图片数据在内存地址中结束的寄存器。

其中【20:0】是存放地址【21:1】位.

相关代码为:

rLCDSADDR1 = (((unsigned int)lcdbuff >> 22)<<21)|((((unsigned int)lcdbuff>>1))&0x1fffff);
  rLCDSADDR2 = (((unsigned int)lcdbuff + LCD_WIDTH * LCD_HEIGHT *2) >> 1)&0x1fffff;

4.如果不需要使用中断,则只需把中断关闭。最后就是使能LCD了,配置LCDCON1的最低位。

七:LCD模块代码:

/************************************************ 
  NAME    : LCD.C
  DESC  :
  Revision: 2015.8.23 ver 0.0
 ************************************************/
 
#include "lcd.h"
#include "image.h"
 
#define VSPW 4
#define VBPD 5
#define LINEVAL 319
#define VFPD 4
#define HSPW 9
#define HBPD 10
#define HOZVAL 239
#define HFPD 10
#define CLKVAL
 
 
 
 void port_init()
 {
  unsigned int temp;
 
  temp = rGPCCON;
  temp &= ~(0xffffffff);
  temp |=(0xaaaaaaaa);
  rGPCCON = temp;
 
  rGPCUP |= (0xffff);
 
  temp = rGPDCON;
  temp &=~(0xffffffff);
  temp |=(0xaaaaaaaa); 
  rGPDCON = temp;
 
  rGPDUP |=(0xffff);
 
 }
 void Lcd_reg_init()
 {
  rLCDCON1 |= (CLKVAL<<8)|(0x3<<5)|(0xc<<1);
  rLCDCON2 |= (VBPD<<24)|(LINEVAL<<14)|(VFPD<<6)|(VSPW<<0);
  rLCDCON3 |= (HBPD<<19)|(HOZVAL<<8)|(HFPD<<0);
  rLCDCON4 |= (HSPW<<0);
  rLCDCON5 |= (0x8<<8)|(0x4<<4)|(0xd<<0);
 }
 void frame_init()
 {
  rLCDSADDR1 = (((unsigned int)lcdbuff >> 22)<<21)|((((unsigned int)lcdbuff>>1))&0x1fffff);
  rLCDSADDR2 = (((unsigned int)lcdbuff + LCD_WIDTH * LCD_HEIGHT *2) >> 1)&0x1fffff;
  //rLCDSADDR1 = (((unsigned int)lcdbuff >> 22) << 21) | ((((unsigned int)lcdbuff >> 1))&0x1fffff);
    //rLCDSADDR2 = (((unsigned int)lcdbuff + LCD_WIDTH * LCD_HEIGHT * 2) >> 1)&0x1fffff;
    rLCDINTMSK |=(0x3<<0);
 }
 void lcd_powerenable()
 {
  rGPGUP  |= (1<<4) ; //Pull-up Disable   
    rGPGCON |= (3<<8) ; //GPG4 is LCD_PWREN 
 }
 void Lcd_enable(int status)
 {
  if(1==status)
  {
  rLCDCON1 |=(0x1<<0);
  }
  else if(0==status)
  {
  rLCDCON1 &=~(0x1<<0);
 
 }
 
 static void Lcd_clear(unsigned short c)
 {
  unsigned int i,j;
  for(i=0;i<320;i++)
  for(j=0;j<240;j++)
  {
  lcdbuff[i*240+j] = c;
  }
 }
 
 void LCD_Bmp(unsigned int width,unsigned int height,const unsigned char* bmp)
 {
  unsigned int x,y;
  unsigned short *p = (unsigned short *)bmp;
  for(y=0;y<height;y++)
  {
  for(x=0;x<width;x++)
  {
  lcdbuff[y*width+x]=p[y*width+x];
  }
  }
 }
 void Lcd_init()
 {
  port_init();
  Lcd_reg_init();
  frame_init();
 }
 void Lcd_test()
 {
  Lcd_init();
  //lcd_powerenable();
  Lcd_enable(1);
  //Lcd_clear(unsigned short c);
  LCD_Bmp(LCD_WIDTH,LCD_HEIGHT,gImage_image1);
 }
 
 
 

增加模块:三星显示屏的显示原理。

1、三星显示屏 VS 索尼显示屏 

1)CPU的寄存器的配置会不一样。

2)LCD驱动器也要配置,是通过SPI协议把数据写过来。           

2SPI   协议 ----时序图 

   4根线:CS片选信号线  SCL串行时钟线  SDI串行数据输入线  SDO串行数据输出线

 

3、手工写时序 -----I/O模拟 

 1)把相应的管脚配置为输出

 2)把输出引脚的电平拉高、拉低定义好相应的宏。

3)把时序描出来

 4、利用通信协议发送数据:

1)有独立的控制模块----只要把数据写到缓存中,数据会自动发送出去。

2IO口模拟-----IO配置为输出,然后通过写DAT寄存器把信号拉高拉低一位位发送出去。

    

 

从上图中我们可以得到三个信息:Frame frequency  场频率 

Dot  Clock  位时钟     Serial  Clock  串行时钟频率

上图有三个信号,CS(片选信号) SCL(串行时钟线) SDI(串行数据输入线)

 


 









  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值