查看: 1743|回复: 0
打印 上一主题 下一主题

【共享】AT91SAM9261S驱动10.1寸彩屏 调试过程

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-28 21:43:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
环境:ADS,裸机,NEWMSG9261开发板,群创10。1寸 BT101IW01,
调试遇到问题:1 脱机运行,NOR启动。 煎熬了2个星期 解决
              2 TTL->LVDS信号匹配。现在大于7寸的液晶,量大价格低的都是LVDS接口,而ARM的LCD控制器只能RGB输出。我选用的是国半DS90C385A。
              3 9261的LCD控制器在16bit模式下,RGB=5:5:5,高位空出。这个问题困了我2天,最后用示波器一位一位的查,再看手册才发现。图片用5:6:5转的话,颜色总是很别扭。
               手册上写的 B [LD23D19]  ;G [LD15D10] ;R[LD7D3] ,我一开始也是参考手册,最后出来R B颜色正好反了下。NEWMSG技术支持说 在硬件上把 B R 数据线交换下解决。

这个参考KEIL下LCD初始化,IAR 和ADS下的初始话都太罗嗦,这个简练,一个函数解决。
/*******************************************************************************
* Initialize the Graphic LCD controller                                        *
*   Parameter:                                                                 *
*   Return:                                                                    *
*******************************************************************************/
void GLCD_init (void) {

  /* Configure the PIO Lines for interfacing LCD                              */
  AT91C_BASE_PIOB->IO_IDR       = 0x1FFFFFFF;// Interrupt Disable Register
  AT91C_BASE_PIOB->IO_PPUDR     = 0x1FFFFFFF;// (PIO_PPUDR) Pull-up Disable Register
  AT91C_BASE_PIOB->IO_ASR       = 0x001F9F1F;//PB0~PB20 用外设A,PB21~28用外设B
  AT91C_BASE_PIOB->IO_PDR       = 0x1f9F9F1F;// (PIO_PDR) PIO Disable Register,禁止普通IO操作,使能外设控制
  AT91C_BASE_PIOB->IO_IDR       = 0x1f9F9F1F;// (PIO_IDR) Interrupt Disable Register 屏蔽中断
  AT91C_BASE_PIOB->IO_PPUDR     = 0x1FFFFFFF;
  AT91C_BASE_PIOB->IO_BSR       = 0x1F000000;// (PIO_BSR) Select B Register
  AT91C_BASE_PMC->MC_SCER       = AT91C_PMC_HCK1;          /* Enable HCLOCK  */
  AT91C_BASE_PMC->MC_PCER       = 1<<AT91C_ID_LCDC;        /* Enable LCD clk */
  AT91C_BASE_LCDC->LCDC_DMACON   = 0;                       /* Disable DMA    */
  AT91C_BASE_LCDC->LCDC_PWRCON   = 0;                       /* LCD off        */
  AT91C_BASE_LCDC->LCDC_LCDCON1  = (0x00<< 12) ;           /* CLKVAL         */
  AT91C_BASE_LCDC->LCDC_LCDCON2  = (2 << 30) | /* MEMOR:     Little Endian */
                                   (0x01 << 15) | /* CLKMOD:    Always active */
                                   (0x00 << 12) | /* INVDVAL:   Normal        */
                                   (0x01<< 11) | /* INVCLK:    Normal        */
                                   (0x00 << 10) | /* INVLINE:   Normal        */
                                   (0x00 <<  9) | /* INVFRAME:  Normal        */
                                   (0x00 <<  8) | /* INVVD:     Normal        */
                                   (0x04 <<  5) | /* PIXELSIZE: 16 BPP, packed*/
                                   (0x00 <<  3) | /* IFWIDTH:   4-bit         */ //2010-6-7 10:52:22 只在STN模式下有效
                                   (0x00 <<  2) | /* SCANMOD:   Single Scan   */
                                   (0x02 <<  0) ; /* DISTYPE:   TFT           */

  AT91C_BASE_LCDC->LCDC_LCDFRCFG = ((LCD_W-1) << 21) |      /* LINESIZE       */
                                   ((LCD_H-1) <<  0) ;      /* LINEVAL        */

  AT91C_BASE_LCDC->LCDC_TIM1     = (0 << 24) |           /* VHDLY          */
                                   (38 << 16) |           /* VPW            */
                                   (6 <<  8) |           /* VBP            */
                                   (13 <<  0) ;           /* VFP            */

  AT91C_BASE_LCDC->LCDC_TIM2     = (39 << 21) |           /* HFP            */
                                   (47 <<  8) |           /* HPW            */
                                   (43 <<  0) ;           /* HBP            */

  AT91C_BASE_LCDC->LCDC_CTRSTVAL = (0x80 <<  0) ;           /* CVAL           */

  AT91C_BASE_LCDC->LCDC_CTRSTCON = (0x01 <<  3) |           /* ENA            */
                                   (0x01 <<  2) |           /* POL            */
                                   (0x00 <<  0) ;           /* PS             */

  AT91C_BASE_LCDC->LCDC_FRMCFG   = (0x02 << 24) |           /* BRSTLN         */
                                   (LCD_W*LCD_H/2);/* FRMSIZE        */

  AT91C_BASE_LCDC->LCDC_FIFO     = 512 - (2 * 4 + 3);      /* FIFOTH         */

  AT91C_BASE_LCDC->LCDC_BA1      = (unsigned int) LCD_BUF0; /* DMA Base Addr  */

  AT91C_BASE_LCDC->LCDC_DMACON   = AT91C_LCDC_DMAEN;        /* Enable DMA     */

  AT91C_BASE_LCDC->LCDC_PWRCON   = (0x0C <<  1) |           /* GUARDTIME      */
                                   (0x01 <<  0) ;           /* LCD_PWR: On    */

  frameBuffer16BitTft240320 = (unsigned short (*)[LCD_W])LCD_BUF0;

}
现在流行有图有真相,呵呵。

(原文件名:1.JPG)







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表