搜索
bottom↓
回复: 13

求助LM3S9B96的EPI驱动并口LCD不能成功

[复制链接]

出0入0汤圆

发表于 2011-10-11 19:01:36 | 显示全部楼层 |阅读模式
使用LM3S9B96的EPI驱动LCD(SSD1298)
接法如下:

(原文件名:LCD.JPG)
本意是RS用手动的方式
EPI配置如下:
void epi_port_init(void)
{
        /*使能EPI接口*/
        SysCtlPeripheralEnable(SYSCTL_PERIPH_EPI0);
        /*使能各个使用的IO口*/
        //SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
        //SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
        SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);
        /*设置IO口功能*/
        GPIOPinConfigure(GPIO_PH3_EPI0S0);
        GPIOPinConfigure(GPIO_PH2_EPI0S1);
        GPIOPinConfigure(GPIO_PC4_EPI0S2);
        GPIOPinConfigure(GPIO_PC5_EPI0S3);
        GPIOPinConfigure(GPIO_PC6_EPI0S4);
        GPIOPinConfigure(GPIO_PC7_EPI0S5);
        GPIOPinConfigure(GPIO_PH0_EPI0S6);
        GPIOPinConfigure(GPIO_PH1_EPI0S7);
        GPIOPinConfigure(GPIO_PE0_EPI0S8);
        GPIOPinConfigure(GPIO_PE1_EPI0S9);
        GPIOPinConfigure(GPIO_PH4_EPI0S10);
        GPIOPinConfigure(GPIO_PH5_EPI0S11);
        GPIOPinConfigure(GPIO_PF4_EPI0S12);
        GPIOPinConfigure(GPIO_PG0_EPI0S13);
        GPIOPinConfigure(GPIO_PG1_EPI0S14);
        GPIOPinConfigure(GPIO_PF5_EPI0S15);
       
        GPIOPinConfigure(GPIO_PJ4_EPI0S28);
        GPIOPinConfigure(GPIO_PJ5_EPI0S29);
        GPIOPinConfigure(GPIO_PJ6_EPI0S30);
       
        GPIOPinTypeEPI(GPIO_PORTC_BASE, EPI_PORTC_PINS);
        GPIOPinTypeEPI(GPIO_PORTE_BASE, EPI_PORTE_PINS);
        GPIOPinTypeEPI(GPIO_PORTF_BASE, EPI_PORTF_PINS);
        GPIOPinTypeEPI(GPIO_PORTG_BASE, EPI_PORTG_PINS);
        GPIOPinTypeEPI(GPIO_PORTH_BASE, EPI_PORTH_PINS);
        GPIOPinTypeEPI(GPIO_PORTJ_BASE, EPI_PORTJ_PINS);

        EPIDividerSet(EPI0_BASE, 6);
        EPIModeSet(EPI0_BASE, EPI_MODE_HB16);
        EPIConfigHB16Set(EPI0_BASE,EPI_HB16_MODE_ADDEMUX | EPI_HB16_RDWAIT_0 | EPI_HB16_WRWAIT_0 | EPI_HB16_CSCFG_CS,0);       
        EPIAddressMapSet(EPI0_BASE, EPI_ADDR_PER_SIZE_256B | EPI_ADDR_PER_BASE_A);
        RS_LOW();
}
这是LCD初始化:
void lcd_init(void)
{
        epi_port_init();
        DeviceCode = read_reg(0x0000);
        if (DeviceCode == 0x8999)
        {
                // power supply setting
                // set R07h at 0021h (GON=1,DTE=0,D[1:0]=01)
                write_reg(0x07,0x0021);
                // set R00h at 0001h (OSCEN=1)
                write_reg(0x00,0x0001);
                // set R07h at 0023h (GON=1,DTE=0,D[1:0]=11)
                write_reg(0x07,0x0023);
                // set R10h at 0000h (Exit sleep mode)
                write_reg(0x10,0x0000);
                // Wait 30ms
                delay(3000);
                // set R07h at 0033h (GON=1,DTE=1,D[1:0]=11)
                write_reg(0x07,0x0033);
                // Entry mode setting (R11h)
                // R11H Entry mode
                // vsmode DFM1 DFM0 TRANS OEDef WMode DMode1 DMode0 TY1 TY0 ID1 ID0 AM LG2 LG2 LG0
                //   0     1    1     0     0     0     0      0     0   1   1   1  *   0   0   0
                write_reg(0x11,0x6070);
                // LCD driver AC setting (R02h)
                write_reg(0x02,0x0600);
                // power control 1
                // DCT3 DCT2 DCT1 DCT0 BT2 BT1 BT0 0 DC3 DC2 DC1 DC0 AP2 AP1 AP0 0
                // 1     0    1    0    1   0   0  0  1   0   1   0   0   1   0  0
                // DCT[3:0] fosc/4 BT[2:0]  DC{3:0] fosc/4
                write_reg(0x03,0x0804);//0xA8A4
                write_reg(0x0C,0x0000);//
                write_reg(0x0D,0x080C);//
                // power control 4
                // 0 0 VCOMG VDV4 VDV3 VDV2 VDV1 VDV0 0 0 0 0 0 0 0 0
                // 0 0   1    0    1    0    1    1   0 0 0 0 0 0 0 0
                write_reg(0x0E,0x2900);
                write_reg(0x1E,0x00B8);
                write_reg(0x01,0x2B3F);//驱动输出控制320*240  0x6B3F
                write_reg(0x10,0x0000);
                write_reg(0x05,0x0000);
                write_reg(0x06,0x0000);
                write_reg(0x16,0xEF1C);
                write_reg(0x17,0x0003);
                write_reg(0x07,0x0233);//0x0233
                write_reg(0x0B,0x0000|(3<<6));
                write_reg(0x0F,0x0000);//扫描开始地址
                write_reg(0x41,0x0000);
                write_reg(0x42,0x0000);
                write_reg(0x48,0x0000);
                write_reg(0x49,0x013F);
                write_reg(0x4A,0x0000);
                write_reg(0x4B,0x0000);
                write_reg(0x44,0xEF00);
                write_reg(0x45,0x0000);
                write_reg(0x46,0x013F);
                write_reg(0x30,0x0707);
                write_reg(0x31,0x0204);
                write_reg(0x32,0x0204);
                write_reg(0x33,0x0502);
                write_reg(0x34,0x0507);
                write_reg(0x35,0x0204);
                write_reg(0x36,0x0204);
                write_reg(0x37,0x0502);
                write_reg(0x3A,0x0302);
                write_reg(0x3B,0x0302);
                write_reg(0x23,0x0000);
                write_reg(0x24,0x0000);
                write_reg(0x25,0x8000);   // 65hz
                write_reg(0x4f,0);        // 行首址0
                write_reg(0x4e,0);        // 列首址0       

        }
        else
        {
                printf("LCD model is not recognized,DeviceCode = 0x%x!\r\n",DeviceCode);
                return;
        }
        //数据总线测试,用于测试硬件连接是否正常.
        lcd_data_bus_test();
        lcd_clear(Red);       
}

其他相关代码:
void write_cmd(unsigned short cmd)
{
        RS_LOW();
        LCD_ADDR = cmd;
}

unsigned short read_data(void)
{
        unsigned short temp;
        RS_HIGH();
        temp = LCD_ADDR;
        RS_LOW();
        return temp;
}

void write_data(unsigned short data_code )
{
        RS_HIGH();
        LCD_ADDR = data_code;
        RS_LOW();
}

void write_reg(unsigned char reg_addr,unsigned short reg_val)
{
        write_cmd(reg_addr);
        write_data(reg_val);
}

unsigned short read_reg(unsigned char reg_addr)
{
        unsigned short val=0;
        write_cmd(reg_addr);
        val = read_data();
        return (val);
}


void lcd_SetCursor(unsigned int x,unsigned int y)
{
        //    write_reg(32,x);    /* 0-239 */
        //    write_reg(33,y);    /* 0-319 */
        write_reg(0x004e,x);    /* 0-239 */
        write_reg(0x004f,y);    /* 0-319 */
}
/* 读取指定地址的GRAM */
static unsigned short lcd_read_gram(unsigned int x,unsigned int y)
{
        unsigned short temp;
        lcd_SetCursor(x,y);
        rw_data_prepare();
        /* dummy read */
        temp = read_data();
        temp = read_data();
        return temp;
}
static void lcd_data_bus_test(void)
{
        unsigned short temp1;
        unsigned short temp2;
        //    /* [5:4]-ID~ID0 [3]-AM-1垂直-0水平 */
        //    write_reg(0x0003,(1<<12)|(1<<5)|(1<<4) | (0<<3) );

        /* wirte */
        lcd_SetCursor(0,0);
        rw_data_prepare();
        write_data(0x5555);

        lcd_SetCursor(1,0);
        rw_data_prepare();
        write_data(0xAAAA);

        /* read */
        lcd_SetCursor(0,0);
        temp1 = lcd_read_gram(0,0);
        temp2 = lcd_read_gram(1,0);

        if( (temp1 == 0x5555) && (temp2 == 0xAAAA) )
        {
                printf(" data bus test pass!\r\n");
        }
        else
        {
                printf(" data bus test error: %04X %04X\r\n",temp1,temp2);
        }
}

void lcd_clear(unsigned short Color)
{
        unsigned int index=0;
        lcd_SetCursor(0,0);
        rw_data_prepare();                      /* Prepare to write GRAM */
        for (index=0; index<(LCD_WIDTH*LCD_HEIGHT); index++)
        {
                write_data(Color);
        }
}

读取LCD DeviceCode没有问题,但是总线测试就不过了,不知道为何啊

很奇怪的是,不但读设备代码没有问题,执行LCD Clear的时候能把屏幕刷成指定的颜色,但是写RAM再读就不对

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2011-10-11 19:10:16 | 显示全部楼层
SSD1289很慢的.要调得很慢才能测通.

出0入0汤圆

 楼主| 发表于 2011-10-11 19:15:01 | 显示全部楼层
调慢了,
CS都调成6.5us了
WR RD   3.1us了
逻辑分析仪测的,不知道准不准

出0入0汤圆

发表于 2011-10-11 21:31:20 | 显示全部楼层
换个型号的控制器测下吧. 反正我是再也不会使用SSD1289的屏了.

出0入0汤圆

 楼主| 发表于 2011-10-11 21:55:30 | 显示全部楼层
唉,老大整了一堆SSD1289,告诉我9320供应商说要停产了,以后都是这种了。。。

出10入0汤圆

发表于 2011-10-11 23:35:15 | 显示全部楼层
STM32的FMSC驱动TFT的例子很火!今天终于看到LM3S上也玩 总线刷屏 了!
呵呵,我也一直想这么做,不过到现在板都没画出来!
支持!!!期待楼主快点弄出来!

出0入0汤圆

 楼主| 发表于 2011-10-12 11:39:51 | 显示全部楼层
嗯,结贴了

上面做法完全没问题,是因为单片机一只引脚虚焊造成的

16位复用,非复用,通用模式,都试过了,实在调试不通,技穷了的时候换了个9320的屏,读ID出来竟然是9120,才意识到是否某根数据线有问题

仔细排查没发现

最后从MCU的根部量起,才发现AD9在作怪.....

出0入0汤圆

发表于 2011-10-12 11:47:04 | 显示全部楼层
9B96是用在项目上吗,多少钱一片?个人目前在用6K系列的,想升级到9000系列的。

出0入0汤圆

 楼主| 发表于 2011-10-12 12:40:12 | 显示全部楼层
还没有用在项目上,样品价70RMB

出0入0汤圆

发表于 2011-12-23 19:42:06 | 显示全部楼层
回复【楼主位】tuy0326
-----------------------------------------------------------------------

请教楼主,RGB接口的其它液晶屏是不是也可以直接以总线形式挂载在EPI上呢,我的TFT液晶控制器是HX8347,不知是否可以用EPI直接控制。谢谢指教

出0入0汤圆

 楼主| 发表于 2011-12-26 12:47:40 | 显示全部楼层
可以的,只是那些同步信号可能要你自己产生了,比如水平和垂直信号

出0入0汤圆

发表于 2011-12-30 10:33:07 | 显示全部楼层
带控制器的屏对外接口一般都有8080,6080接口,这些都是支持8/16总线驱动的,可以用LM3S9B9X EPI的H16模式来驱动,速度会快些。我最近也想玩下,看看驱动SSD1963带个7寸屏如何。

出0入0汤圆

发表于 2012-11-17 16:17:56 | 显示全部楼层
我也想自己弄个试试看效果怎么样

出0入0汤圆

发表于 2012-11-19 21:54:37 | 显示全部楼层
直接LPC1788/LPC1850/LPC4350解决不是更好!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-20 23:17

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

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