搜索
bottom↓
回复: 0

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

[复制链接]

出0入0汤圆

发表于 2012-2-20 11:50:26 | 显示全部楼层 |阅读模式
本程序采用了新唐NUC120RD2BN带了EBI总线的CPU,因为ILI9327只有一个地址线RS,也就是命令,数据寄存器地址,而且又支持16位总线,所以把此地址线接到多余的ALE上,把ALE配置成GPIO模式,把ALE地址锁存的时序忽略掉,直接用EBI总线驱动ILI9327的数据总线。

      其余不多说,请查看源码文件:ili9327.c

文件内容如下:

* Includes ------------------------------------------------------------------*/
#include <stdio.h>
#include <NUC1xx.H>
#include "Driver\DrvSYS.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvEBI.h"

#define TFT_BL&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; E_GPA, 15 &#160;&#160;/* PA.15 = TFT_BL&#160;&#160; */
#define TFT_RST&#160;&#160;&#160; &#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; E_GPA, 9 &#160;&#160;/* PA.9&#160; = TFT_RST&#160; */
#define TFT_DC&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160; E_GPB, 6 &#160;&#160;/* PB.6&#160; = TFT_DC&#160;&#160; */

#define ILI9327_READ()&#160;&#160;&#160;&#160;(*(__IO uint16_t *)(0x60000000))
#define ILI9327_DAT(DAT)&#160;&#160;&#160; *(__IO uint16_t *)(0x60000000) = DAT
#define ILI9327_CMD(CMD)&#160;&#160;&#160;{GPIOB->DOUT &= 0xffbf;*(__IO uint16_t *)(0x60000000) = CMD;GPIOB->DOUT |= 0x0040;}
&#160;
/*
//make by yuanxihua@21cn.com
//BYD LCM
//BM240400-8790FTGB
//262K TFT&#160;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.
_________________________________________________
|&#160;NUC120RD2BN&#160;&#160;&#160;&#160;&#160;&#160;ILI9327B&#160;|
|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;|
|&#160;PA9&#160;&#160;TFT_RST&#160;&#160;---->&#160;&#160;RESET&#160;&#160;|
|&#160;PA15&#160;TFT_BL&#160;&#160;---->&#160;&#160;BACKLIGHT&#160;|
|&#160;PB6&#160;&#160;TFT_DC&#160;&#160;---->&#160;&#160;RS&#160;&#160;&#160;|
|&#160;NCS&#160;&#160;TFT_CS&#160;&#160;---->&#160;&#160;CS&#160;&#160;&#160;|
|&#160;NWR&#160;&#160;TFT_WR&#160;&#160;---->&#160;&#160;WR&#160;&#160;&#160;|
|&#160;NRD&#160;&#160;TFT_RD&#160;&#160;---->&#160;&#160;RD&#160;&#160;&#160;|
|&#160;AD0&#160;&#160;TFT_D0&#160;&#160;<--->&#160;&#160;DB0&#160;&#160;&#160;|
|&#160;...&#160;&#160;...&#160;&#160;&#160;<--->&#160;&#160;...&#160;&#160;&#160;|
|&#160;AD15&#160;TFT_D15&#160;&#160;<--->&#160;&#160;DB15&#160;&#160;|
|_______________________________________________|

*/
uint16_t color_table[16]={0x0000,0xf800,0x07e0,0x001f,0xf81f,0xffe0,0x07ff,0xffff,};

void EBI_Init(void)
{
&#160;DRVEBI_CONFIG_T&#160;sEBIConfig;
&#160;DRVEBI_TIMING_T&#160;sEBITiming;

&#160;// Open EBI function
&#160;sEBIConfig.eDataWidth&#160;&#160;= E_DRVEBI_DATA_16BIT;
&#160;sEBIConfig.eAddrWidth&#160;&#160;= E_DRVEBI_ADDR_16BIT;
&#160;sEBIConfig.u32BaseAddress &#160;= DRVEBI_BASE_ADDR;
&#160;sEBIConfig.u32Size &#160;&#160;&#160;= DRVEBI_MAX_SIZE;
&#160;&#160;DrvEBI_Open(sEBIConfig);

&#160;// Disable nWRH & nWRL for EBI support
&#160;outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) & ~(0x3<<2));
&#160;outpw(&SYS->ALTMFP, inpw(&SYS->ALTMFP) & ~(0x3<<13));

&#160;// Configure EBI timing
//&#160;sEBITiming.eMCLKDIV = E_DRVEBI_MCLKDIV_1;&#160;// 1656.0 KHZ&#160; //Display And Read ID ERROR!!!
//&#160;sEBITiming.eMCLKDIV = E_DRVEBI_MCLKDIV_2;&#160;// 1147.0 KHZ&#160; //Display OK, But Read ID ERROR!!!
&#160;sEBITiming.eMCLKDIV = E_DRVEBI_MCLKDIV_4;&#160;//&#160; 666.7 KHZ&#160; //Display OK, And Read ID OK!!!
//&#160;sEBITiming.eMCLKDIV = E_DRVEBI_MCLKDIV_8;&#160;//&#160; 400.0 KHZ
//&#160;sEBITiming.eMCLKDIV = E_DRVEBI_MCLKDIV_16;&#160;//&#160; 211.9 KHZ
//&#160;sEBITiming.eMCLKDIV = E_DRVEBI_MCLKDIV_32;&#160;//&#160; 106.4 KHZ

&#160;&#160;sEBITiming.u8ExttALE = 0;
&#160;sEBITiming.u8ExtIR2R = 0;
&#160;sEBITiming.u8ExtIW2X = 0;
&#160;sEBITiming.u8ExttAHD = 0;
&#160;sEBITiming.u8ExttACC = 0;
&#160;DrvEBI_SetBusTiming(sEBITiming);
}

void ILI9327_READ_ID(void)
{
&#160;uint16_t i;
&#160;ILI9327_CMD(0xEF);&#160;&#160;&#160;&#160;//Device Code Read
&#160;printf("ILI9327 ID DATA: ");
&#160;for(i=1;i<=6;i++){printf("%04x ",(uint16_t)ILI9327_READ());}
&#160;printf("\n\r\n\r");
}
&#160;
void ILI9327_RESET(void)
{
&#160;//PA9 PA15 PB6 is defined as GPIO;
&#160;outpw(&SYS->GPAMFP, inpw(&SYS->GPAMFP) & ~(0x1<< 9));
&#160;outpw(&SYS->GPAMFP, inpw(&SYS->GPAMFP) & ~(0x1<<15));
&#160;outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) & ~(0x1<< 6));

&#160;//TFT_RST TFT_DC TFT_BL is defined as Output;
&#160;DrvGPIO_Open(TFT_RST, E_IO_OUTPUT);
&#160;DrvGPIO_Open(TFT_DC , E_IO_OUTPUT);
&#160;DrvGPIO_Open(TFT_BL , E_IO_OUTPUT);

&#160;DrvGPIO_SetBit(TFT_DC );
&#160;DrvGPIO_ClrBit(TFT_BL );
&#160;DrvGPIO_SetBit(TFT_RST);
&#160;DrvSYS_Delay(1000);
&#160;DrvGPIO_ClrBit(TFT_RST);&#160; &#160;// RESET LOW&#160; >=&#160;&#160; 1 ms
&#160;DrvSYS_Delay(2000);
&#160;&#160;DrvGPIO_SetBit(TFT_RST);&#160; &#160;// RESET HIGH >= 120 ms
&#160;DrvSYS_Delay(200000);
}

void ILI9327_CLEAR(uint16_t color)
{
&#160;&#160;&#160; uint16_t i,j;

&#160;for(i=0;i<240;i++)
&#160;{&#160;
&#160;&#160;for (j=0;j<400;j++)&#160;{ILI9327_DAT(color);}
&#160;}
}
void Delay_1ms(int delay)
{
&#160;uint32_t i;
&#160;for(i=0;i<delay;i++)DrvSYS_Delay(1000);
}
void ILI9327_TEST(void)
{
&#160;uint16_t i,color;

&#160;printf("%s(%d): Running:&#160; %s()\n\r",__FILE__,__LINE__,__FUNCTION__);

&#160;while(1)
&#160;{
&#160;&#160;color = color_table[(i++)%8];
&#160;&#160;printf("COLOR = 0x%04x \n\r",color);
&#160;&#160;ILI9327_CLEAR(color);

&#160;&#160;Delay_1ms(2000);&#160;&#160; // 2s
&#160;}
}

void ILI9327_Init(void)
{&#160;
&#160;printf("*** ILI9327 Driver V1.00 Build by yuanxihua@21cn.com on ("__DATE__ " - " __TIME__ ")\n\r\n\r");

&#160;EBI_Init();

&#160;ILI9327_RESET();
&#160;ILI9327_READ_ID();

&#160;&#160;&#160; ILI9327_CMD(0xE9);&#160;&#160;//
&#160;&#160;&#160; ILI9327_DAT(0x20);
&#160;&#160;&#160; ILI9327_CMD(0x11); &#160;&#160;//exit_sleep_mode
&#160;&#160;&#160; DrvSYS_Delay(100000);&#160;//100 ms

&#160;&#160;&#160; ILI9327_CMD(0xD1); &#160;&#160;//VCOM Control
&#160;&#160;&#160; ILI9327_DAT(0x00);
&#160;&#160;&#160; ILI9327_DAT(0x6b);
&#160;&#160;&#160; ILI9327_DAT(0x18);
&#160;&#160;&#160; ILI9327_CMD(0xD0); &#160;&#160;//Power_Setting
&#160;&#160;&#160; ILI9327_DAT(0x07);
&#160;&#160;&#160; ILI9327_DAT(0x04);
&#160;&#160;&#160; ILI9327_DAT(0x88);
&#160;&#160;&#160; ILI9327_CMD(0x36);&#160;&#160;//set_address_mode
&#160;&#160;&#160; ILI9327_DAT(0x88);
&#160;&#160;&#160; ILI9327_CMD(0xC1);&#160;&#160;//Display_Timing_Setting for Normal/Partial Mode
&#160;&#160;&#160; ILI9327_DAT(0x10);
&#160;&#160;&#160; ILI9327_DAT(0x10);
&#160;&#160;&#160; ILI9327_DAT(0x02);
&#160;&#160;&#160; ILI9327_DAT(0x02);
&#160;&#160;&#160; ILI9327_CMD(0xC0); &#160;&#160;//Panel Driving Setting
&#160;&#160;&#160; ILI9327_DAT(0x00);
&#160;&#160;&#160; ILI9327_DAT(0x35);
&#160;&#160;&#160; ILI9327_DAT(0x00);
&#160;&#160;&#160; ILI9327_DAT(0x00);
&#160;&#160;&#160; ILI9327_DAT(0x01);
&#160;&#160;&#160; ILI9327_DAT(0x02);
&#160;&#160;&#160; ILI9327_CMD(0xC5); &#160;&#160;//Frame Rate Control
&#160;&#160;&#160; ILI9327_DAT(0x02);
&#160;&#160;&#160; ILI9327_CMD(0xD2); &#160;&#160;//Power_Setting for Normal Mode
&#160;&#160;&#160; ILI9327_DAT(0x01);
&#160;&#160;&#160; ILI9327_DAT(0x44);
&#160;&#160;&#160; ILI9327_CMD(0xC8);&#160;&#160;//Gamma Setting
&#160;&#160;&#160; ILI9327_DAT(0x00);
&#160;&#160;&#160; ILI9327_DAT(0x56);
&#160;&#160;&#160; ILI9327_DAT(0x45);
&#160;&#160;&#160; ILI9327_DAT(0x04);
&#160;&#160;&#160; ILI9327_DAT(0x03);
&#160;&#160;&#160; ILI9327_DAT(0x01);
&#160;&#160;&#160; ILI9327_DAT(0x23);
&#160;&#160;&#160; ILI9327_DAT(0x12);
&#160;&#160;&#160; ILI9327_DAT(0x77);
&#160;&#160;&#160; ILI9327_DAT(0x40);
&#160;&#160;&#160; ILI9327_DAT(0x09);
&#160;&#160;&#160; ILI9327_DAT(0x06);
&#160;&#160;&#160; ILI9327_DAT(0x88);
&#160;&#160;&#160; ILI9327_DAT(0x88);
&#160;&#160;&#160; ILI9327_DAT(0x88);
&#160;&#160;&#160; ILI9327_CMD(0x3A); &#160;&#160;//set_pixel_format
&#160;ILI9327_DAT(0x55);&#160;&#160;&#160;
&#160;ILI9327_CMD(0x2A);&#160;&#160;//set_column_address
&#160;ILI9327_DAT(0x00);
&#160;ILI9327_DAT(0x00);
&#160;ILI9327_DAT(0x00);
&#160;ILI9327_DAT(0xEF);
&#160;ILI9327_CMD(0x2B);&#160;&#160;//set_page_address
&#160;ILI9327_DAT(0x00);
&#160;ILI9327_DAT(0x20);
&#160;ILI9327_DAT(0x01);
&#160;ILI9327_DAT(0xAF);
&#160;ILI9327_CMD(0x29); &#160;&#160;//set_display_on
&#160;ILI9327_CMD(0x2C);&#160;&#160;//write_memory_start

&#160;DrvGPIO_SetBit(TFT_BL );

&#160;ILI9327_TEST();
}

void ILI9327_SLEEP(void)
{
&#160;ILI9327_CMD(0x10);&#160;&#160;//enter_sleep_mode
}
&#160;
void ILI9327_WAKEUP(void)
{
&#160;ILI9327_CMD(0x11);&#160;&#160;//exit_sleep_mode
}


void EBI_test(void)
{
&#160;uint32_t i,j=0;&#160;
&#160;uint32_t data;

&#160;printf("%s(%d): Running:&#160; %s()\n\r",__FILE__,__LINE__,__FUNCTION__);

&#160;EBI_Init();

&#160;printf("MCLK of EBI colck is %d KHz.\n\r", (DrvSYS_GetHCLKFreq()/4)/1000);

&#160;//PA9 PB6 is defined as GPIO;
&#160;outpw(&SYS->GPAMFP, inpw(&SYS->GPAMFP) & ~(0x1<<9));
&#160;outpw(&SYS->GPBMFP, inpw(&SYS->GPBMFP) & ~(0x1<<6));

&#160;//TFT_RST TFT_DC TFT_BLis defined as Output;
&#160;DrvGPIO_Open(TFT_RST, E_IO_OUTPUT);
&#160;DrvGPIO_Open(TFT_DC , E_IO_OUTPUT);
&#160;DrvGPIO_Open(TFT_BL , E_IO_OUTPUT);
&#160;DrvGPIO_Open(E_GPB, 1 , E_IO_OUTPUT); //LED test...

&#160;DrvGPIO_SetBit(TFT_DC );
&#160;DrvGPIO_SetBit(TFT_RST);
&#160;DrvGPIO_ClrBit(TFT_BL );

&#160;while(0)
&#160;{&#160;
&#160;&#160;//test for write
&#160;&#160;*(__IO uint16_t *)((uint32_t)0x60000000) = 0xffff;
&#160;&#160;*(__IO uint16_t *)((uint32_t)0x60000000) = 0x0000;
&#160;}
&#160;while(0)
&#160;{&#160;&#160;
&#160;&#160;//test for read
&#160;&#160;data = &#160;*(__IO uint16_t *)((uint32_t)0x60000000);
&#160;&#160;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++,
&#160;&#160;(data>>15)&0x1,(data>>14)&0x1,(data>>13)&0x1,(data>>12)&0x1,
&#160;&#160;(data>>11)&0x1,(data>>10)&0x1,(data>> 9)&0x1,(data>> 8)&0x1,
&#160;&#160;(data>> 7)&0x1,(data>> 6)&0x1,(data>> 5)&0x1,(data>> 4)&0x1,
&#160;&#160;(data>> 3)&0x1,(data>> 2)&0x1,(data>> 1)&0x1,(data>> 0)&0x1);
&#160;&#160;for(i=0;i<0x200000;i++); //delay about 1 second
&#160;}
&#160;while(1)
&#160;{
&#160;&#160;printf("Running %d Times...\n\r",j++);
&#160;&#160;//test for IO
&#160;&#160;DrvGPIO_SetBit(TFT_RST);
&#160;&#160;DrvGPIO_SetBit(TFT_DC );
&#160;&#160;DrvGPIO_SetBit(TFT_BL );
&#160;&#160;GPIOB->DOUT |= (1 << 1);
&#160;&#160;for(i=0;i<0x200000;i++);
&#160;&#160;DrvGPIO_ClrBit(TFT_RST);
&#160;&#160;DrvGPIO_ClrBit(TFT_DC );
&#160;&#160;DrvGPIO_ClrBit(TFT_BL );
&#160;&#160;GPIOB->DOUT &= ~(1 << 1);

&#160;&#160;for(i=0;i<0x200000;i++);
&#160;}
}

文件结束。
文件源自于飘渺九哥微博

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-26 21:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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