打印
[Cortex-M0技术交流]

基于新唐NUC120RD2BN的EBI接口的ILI9327的驱动程序

[复制链接]
5427|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
缥缈九哥|  楼主 | 2011-10-28 01:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 缥缈九哥 于 2011-10-28 09:44 编辑

本程序采用了新唐NUC120RD2BN带了EBI总线的CPU,因为ILI9327只有一个地址线RS,也就是命令,数据寄存器地址,而且又支持16位总线,所以把此地址线接到多余的ALE上,把ALE配置成GPIO模式,把ALE地址锁存的时序忽略掉,直接用EBI总线驱动ILI9327的数据总线。      其余不多说,请查看源码 9G-NUC120_gls-1028.rar (270.54 KB) 文件:ili9327.c
文件内容如下:
* Includes ------------------------------------------------------------------*/
#include <stdio.h>
#include <NUC1xx.H>
#include "Driver\DrvSYS.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvEBI.h"
#define TFT_BL                E_GPA, 15   /* PA.15 = TFT_BL   */
#define TFT_RST               E_GPA, 9   /* PA.9  = TFT_RST  */
#define TFT_DC                E_GPB, 6   /* PB.6  = TFT_DC   */
#define ILI9327_READ()    (*(__IO uint16_t *)(0x60000000))
#define ILI9327_DAT(DAT)    *(__IO uint16_t *)(0x60000000) = DAT
#define ILI9327_CMD(CMD)   {GPIOB->DOUT &= 0xffbf;*(__IO uint16_t *)(0x60000000) = CMD;GPIOB->DOUT |= 0x0040;}

/*
//make by yuanxihua@21cn.com
//BYD LCM
//BM240400-8790FTGB
//262K TFT 240RGB×400dots
//
//ILI9327 is a 262,144-color single-chip SoC driver for a-TFT liquid crystal display
//with resolution of 240RGBx432 dots, comprising a 720-channel source driver, a 432-channel
//gate driver, 233,280 bytes GRAM for graphic data of 240RGBx432 dots, and power supply circuit.
_________________________________________________
| NUC120RD2BN      ILI9327B |
|            |
| PA9  TFT_RST  ---->  RESET  |
| PA15 TFT_BL  ---->  BACKLIGHT |
| PB6  TFT_DC  ---->  RS   |
| NCS  TFT_CS  ---->  CS   |
| NWR  TFT_WR  ---->  WR   |
| NRD  TFT_RD  ---->  RD   |
| AD0  TFT_D0  <--->  DB0   |
| ...  ...   <--->  ...   |
| AD15 TFT_D15  <--->  DB15  |
|_______________________________________________|
*/
uint16_t color_table[16]={0x0000,0xf800,0x07e0,0x001f,0xf81f,0xffe0,0x07ff,0xffff,};
void EBI_Init(void)
{
DRVEBI_CONFIG_T sEBIConfig;
DRVEBI_TIMING_T sEBITiming;
// Open EBI function
sEBIConfig.eDataWidth  = E_DRVEBI_DATA_16BIT;
sEBIConfig.eAddrWidth  = E_DRVEBI_ADDR_16BIT;
sEBIConfig.u32BaseAddress  = DRVEBI_BASE_ADDR;
sEBIConfig.u32Size    = DRVEBI_MAX_SIZE;
  DrvEBI_Open(sEBIConfig);
// Disable nWRH & nWRL for EBI support
outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) & ~(0x3<<2));
outpw(&SYS->ALTMFP, inpw(&SYS->ALTMFP) & ~(0x3<<13));
// Configure EBI timing
// sEBITiming.eMCLKDIV = E_DRVEBI_MCLKDIV_1; // 1656.0 KHZ  //Display And Read ID ERROR!!!
// sEBITiming.eMCLKDIV = E_DRVEBI_MCLKDIV_2; // 1147.0 KHZ  //Display OK, But Read ID ERROR!!!
sEBITiming.eMCLKDIV = E_DRVEBI_MCLKDIV_4; //  666.7 KHZ  //Display OK, And Read ID OK!!!
// sEBITiming.eMCLKDIV = E_DRVEBI_MCLKDIV_8; //  400.0 KHZ
// sEBITiming.eMCLKDIV = E_DRVEBI_MCLKDIV_16; //  211.9 KHZ
// sEBITiming.eMCLKDIV = E_DRVEBI_MCLKDIV_32; //  106.4 KHZ
  sEBITiming.u8ExttALE = 0;
sEBITiming.u8ExtIR2R = 0;
sEBITiming.u8ExtIW2X = 0;
sEBITiming.u8ExttAHD = 0;
sEBITiming.u8ExttACC = 0;
DrvEBI_SetBusTiming(sEBITiming);
}
void ILI9327_READ_ID(void)
{
uint16_t i;
ILI9327_CMD(0xEF);    //Device Code Read
printf("ILI9327 ID DATA: ");
for(i=1;i<=6;i++){printf("%04x ",(uint16_t)ILI9327_READ());}
printf("\n\r\n\r");
}

void ILI9327_RESET(void)
{
//PA9 PA15 PB6 is defined as GPIO;
outpw(&SYS->GPAMFP, inpw(&SYS->GPAMFP) & ~(0x1<< 9));
outpw(&SYS->GPAMFP, inpw(&SYS->GPAMFP) & ~(0x1<<15));
outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) & ~(0x1<< 6));
//TFT_RST TFT_DC TFT_BL is defined as Output;
DrvGPIO_Open(TFT_RST, E_IO_OUTPUT);
DrvGPIO_Open(TFT_DC , E_IO_OUTPUT);
DrvGPIO_Open(TFT_BL , E_IO_OUTPUT);
DrvGPIO_SetBit(TFT_DC );
DrvGPIO_ClrBit(TFT_BL );
DrvGPIO_SetBit(TFT_RST);
DrvSYS_Delay(1000);
DrvGPIO_ClrBit(TFT_RST);   // RESET LOW  >=   1 ms
DrvSYS_Delay(2000);
  DrvGPIO_SetBit(TFT_RST);   // RESET HIGH >= 120 ms
DrvSYS_Delay(200000);
}
void ILI9327_CLEAR(uint16_t color)
{
    uint16_t i,j;
for(i=0;i<240;i++)
{
  for (j=0;j<400;j++) {ILI9327_DAT(color);}
}
}
void Delay_1ms(int delay)
{
uint32_t i;
for(i=0;i<delay;i++)DrvSYS_Delay(1000);
}
void ILI9327_TEST(void)
{
uint16_t i,color;
printf("%s(%d): Running:  %s()\n\r",__FILE__,__LINE__,__FUNCTION__);
while(1)
{
  color = color_table[(i++)%8];
  printf("COLOR = 0x%04x \n\r",color);
  ILI9327_CLEAR(color);
  Delay_1ms(2000);   // 2s
}
}
void ILI9327_Init(void)
{  
printf("*** ILI9327 Driver V1.00 Build by yuanxihua@21cn.com on ("__DATE__ " - " __TIME__ ")\n\r\n\r");
EBI_Init();
ILI9327_RESET();
ILI9327_READ_ID();
    ILI9327_CMD(0xE9);  //
    ILI9327_DAT(0x20);
    ILI9327_CMD(0x11);   //exit_sleep_mode
    DrvSYS_Delay(100000); //100 ms
    ILI9327_CMD(0xD1);   //VCOM Control
    ILI9327_DAT(0x00);
    ILI9327_DAT(0x6b);
    ILI9327_DAT(0x18);
    ILI9327_CMD(0xD0);   //Power_Setting
    ILI9327_DAT(0x07);
    ILI9327_DAT(0x04);
    ILI9327_DAT(0x88);
    ILI9327_CMD(0x36);  //set_address_mode
    ILI9327_DAT(0x88);
    ILI9327_CMD(0xC1);  //Display_Timing_Setting for Normal/Partial Mode
    ILI9327_DAT(0x10);
    ILI9327_DAT(0x10);
    ILI9327_DAT(0x02);
    ILI9327_DAT(0x02);
    ILI9327_CMD(0xC0);   //Panel Driving Setting
    ILI9327_DAT(0x00);
    ILI9327_DAT(0x35);
    ILI9327_DAT(0x00);
    ILI9327_DAT(0x00);
    ILI9327_DAT(0x01);
    ILI9327_DAT(0x02);
    ILI9327_CMD(0xC5);   //Frame Rate Control
    ILI9327_DAT(0x02);
    ILI9327_CMD(0xD2);   //Power_Setting for Normal Mode
    ILI9327_DAT(0x01);
    ILI9327_DAT(0x44);
    ILI9327_CMD(0xC8);  //Gamma Setting
    ILI9327_DAT(0x00);
    ILI9327_DAT(0x56);
    ILI9327_DAT(0x45);
    ILI9327_DAT(0x04);
    ILI9327_DAT(0x03);
    ILI9327_DAT(0x01);
    ILI9327_DAT(0x23);
    ILI9327_DAT(0x12);
    ILI9327_DAT(0x77);
    ILI9327_DAT(0x40);
    ILI9327_DAT(0x09);
    ILI9327_DAT(0x06);
    ILI9327_DAT(0x88);
    ILI9327_DAT(0x88);
    ILI9327_DAT(0x88);
    ILI9327_CMD(0x3A);   //set_pixel_format
ILI9327_DAT(0x55);   
ILI9327_CMD(0x2A);  //set_column_address
ILI9327_DAT(0x00);
ILI9327_DAT(0x00);
ILI9327_DAT(0x00);
ILI9327_DAT(0xEF);
ILI9327_CMD(0x2B);  //set_page_address
ILI9327_DAT(0x00);
ILI9327_DAT(0x20);
ILI9327_DAT(0x01);
ILI9327_DAT(0xAF);
ILI9327_CMD(0x29);   //set_display_on
ILI9327_CMD(0x2C);  //write_memory_start
DrvGPIO_SetBit(TFT_BL );
ILI9327_TEST();
}
void ILI9327_SLEEP(void)
{
ILI9327_CMD(0x10);  //enter_sleep_mode
}

void ILI9327_WAKEUP(void)
{
ILI9327_CMD(0x11);  //exit_sleep_mode
}
void EBI_test(void)
{
uint32_t i,j=0;  
uint32_t data;
printf("%s(%d): Running:  %s()\n\r",__FILE__,__LINE__,__FUNCTION__);
EBI_Init();
printf("MCLK of EBI colck is %d KHz.\n\r", (DrvSYS_GetHCLKFreq()/4)/1000);
//PA9 PB6 is defined as GPIO;
outpw(&SYS->GPAMFP, inpw(&SYS->GPAMFP) & ~(0x1<<9));
outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) & ~(0x1<<6));
//TFT_RST TFT_DC TFT_BLis defined as Output;
DrvGPIO_Open(TFT_RST, E_IO_OUTPUT);
DrvGPIO_Open(TFT_DC , E_IO_OUTPUT);
DrvGPIO_Open(TFT_BL , E_IO_OUTPUT);
DrvGPIO_Open(E_GPB, 1 , E_IO_OUTPUT); //LED test...
DrvGPIO_SetBit(TFT_DC );
DrvGPIO_SetBit(TFT_RST);
DrvGPIO_ClrBit(TFT_BL );
while(0)
{
  //test for write
  *(__IO uint16_t *)((uint32_t)0x60000000) = 0xffff;
  *(__IO uint16_t *)((uint32_t)0x60000000) = 0x0000;
}
while(0)
{  
  //test for read
  data =  *(__IO uint16_t *)((uint32_t)0x60000000);
  printf("Running %d Times : D15-D0:%1d%1d%1d%1d%1d%1d%1d%1d_%1d%1d%1d%1d%1d%1d%1d%1dB\n\r",j++,
  (data>>15)&0x1,(data>>14)&0x1,(data>>13)&0x1,(data>>12)&0x1,
  (data>>11)&0x1,(data>>10)&0x1,(data>> 9)&0x1,(data>> 8)&0x1,
  (data>> 7)&0x1,(data>> 6)&0x1,(data>> 5)&0x1,(data>> 4)&0x1,
  (data>> 3)&0x1,(data>> 2)&0x1,(data>> 1)&0x1,(data>> 0)&0x1);
  for(i=0;i<0x200000;i++); //delay about 1 second
}
while(1)
{
  printf("Running %d Times...\n\r",j++);
  //test for IO
  DrvGPIO_SetBit(TFT_RST);
  DrvGPIO_SetBit(TFT_DC );
  DrvGPIO_SetBit(TFT_BL );
  GPIOB->DOUT |= (1 << 1);
  for(i=0;i<0x200000;i++);
  DrvGPIO_ClrBit(TFT_RST);
  DrvGPIO_ClrBit(TFT_DC );
  DrvGPIO_ClrBit(TFT_BL );
  GPIOB->DOUT &= ~(1 << 1);
  for(i=0;i<0x200000;i++);
}
}
文件结束。

相关帖子

沙发
lwslws201| | 2011-10-28 01:25 | 只看该作者
:victory:

使用特权

评论回复
板凳
lwslws201| | 2011-10-28 01:25 | 只看该作者
我再顶!!

使用特权

评论回复
地板
lwslws201| | 2011-10-28 01:29 | 只看该作者
下次记得帮徒弟顶贴。:loveliness:

使用特权

评论回复
5
plc_avr| | 2011-10-28 05:42 | 只看该作者
顶9G!

使用特权

评论回复
6
缥缈九哥|  楼主 | 2011-10-28 08:59 | 只看该作者
再研究研究ILI9327的手册,看看能不能优化什么的。感觉刷新速度还有待提高。刷新屏幕还有点抖动。哈哈。

使用特权

评论回复
7
缥缈九哥|  楼主 | 2011-10-28 09:48 | 只看该作者
有没有朋友帮助我再看看代码,有什么地方不足,需要提高效率及优化代码的。麻烦帮助我提出,先谢谢了。

使用特权

评论回复
8
hotpower| | 2011-10-29 04:18 | 只看该作者
好!

使用特权

评论回复
9
weshiluwei6| | 2011-10-29 08:47 | 只看该作者
顶 高手

使用特权

评论回复
10
lwslws201| | 2011-10-30 11:34 | 只看该作者
移植9320的驱动就完美了。

使用特权

评论回复
11
缥缈九哥|  楼主 | 2011-10-31 14:40 | 只看该作者
我没有ILI9320的LCD,谁送一个测试呀?哈哈。

使用特权

评论回复
12
缥缈九哥|  楼主 | 2011-11-16 19:32 | 只看该作者
有人说EBI太慢了,可是我已经是调低速度的了。再加快EBI总线 。LCD的总线接口就跟不上了。有什么高招呀?

使用特权

评论回复
13
缥缈九哥|  楼主 | 2011-11-24 23:14 | 只看该作者
看来玩新唐M0的人,用EBI驱动LCD的还没有呀?

使用特权

评论回复
14
缥缈九哥|  楼主 | 2012-1-11 07:56 | 只看该作者
谁提供一个9320的屏来玩一玩?

使用特权

评论回复
15
缥缈九哥|  楼主 | 2012-3-29 08:52 | 只看该作者
NUC1XX驱动LCD的典范。

使用特权

评论回复
16
缥缈九哥|  楼主 | 2012-10-28 11:35 | 只看该作者
新唐m0接TFTLCD的总线典型应用 。

使用特权

评论回复
17
缥缈九哥|  楼主 | 2012-12-23 22:45 | 只看该作者
很不错的驱动例子。

使用特权

评论回复
18
gz123456| | 2013-4-5 19:51 | 只看该作者

使用特权

评论回复
19
dianbeng007| | 2017-10-12 11:25 | 只看该作者
必须顶顶顶

使用特权

评论回复
20
dianbeng007| | 2017-10-12 11:26 | 只看该作者
楼主要是能把lcd用到的常用函数例程放出来就更好了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:童时不懂世事艰,笑谈学成锦衣还。岁月无声已先过,男儿有泪空自弹。    莫待沾霜愁上发,须嬴吐气喜开颜。拼搏半年誓如愿,不到长城心不甘。

67

主题

1871

帖子

270

粉丝