打印
[程序源码]

ILI9341芯片驱动程序的问题

[复制链接]
3092|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
纪国圣|  楼主 | 2016-3-11 19:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人刚入门stm32不久。最近自己设计了一款stm32最小系统+SD卡+TFT触摸屏。在写3.2寸TFT驱动程序时,参数设置使用了原厂提供的初始化程序,可是屏幕变成背景灰色,有一道一道的纹线,使用原子的驱动程序也出现同样的情况。读取屏幕的ID,可以正确的读到9431。现在卡在这里,不知道怎么办。请各位大神指点迷津。
程序如下:
ILI9341驱动程序:
#include <ILI9341.h>
#include "delay.h"

extern int REK;                        //ID号

void ILI9341_GPIO_config(void)        //引脚配置
{
        GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable , ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3;          
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOA,GPIO_Pin_All);
}

void LCD_WR_DATA(unsigned int val)        //写数据
{  
        LCD_RS_SET;
        LCD_RD_SET;
        LCD_CS_CLR;
        DATAOUT(val);
        LCD_WR_CLR;
        LCD_WR_SET;
        LCD_CS_SET;
}

void LCD_WR_REG(unsigned int reg)                //写命令字
{       
        LCD_RS_CLR;//дµØÖ·
        LCD_RD_SET;
        LCD_CS_CLR;
        DATAOUT(reg);
        LCD_WR_CLR;
        LCD_WR_SET;
        LCD_CS_SET;
}

u16 LCD_RD_DATA(void)        //读数据 使用原子的程序
{                                                                                  
        u16 t;
        GPIOA->CRL=0X88888888;
        GPIOA->CRH=0X88888888;
        GPIOA->ODR=0X0000;     

        LCD_RS_SET;
        LCD_CS_CLR;
        LCD_RD_CLR;                                  
        t=DATAIN;  
        LCD_RD_SET;
        LCD_CS_SET;

        GPIOA->CRL=0X33333333;
        GPIOA->CRH=0X33333333;
        GPIOA->ODR=0XFFFF;  
        return t;  
}

void LCD_Init(void)                //ILI9341初始化
{
        ILI9341_GPIO_config();
       
        LCD_RE_SET;       
        delay_ms(100);
        LCD_RE_CLR;
        delay_ms(200);
        LCD_RE_SET;       
        delay_ms(300);
       
        LCD_WR_REG(0xD3);                                  
        LCD_RD_DATA();                                 //dummy read        
        LCD_RD_DATA();                      
        REK=LCD_RD_DATA();                                                                             
        REK<<=8;
        REK|=LCD_RD_DATA();         
       
LCD_WR_REG(0xCF);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0xC1);
LCD_WR_DATA(0X30);
LCD_WR_REG(0xED);
LCD_WR_DATA(0x64);
LCD_WR_DATA(0x03);
LCD_WR_DATA(0X12);
LCD_WR_DATA(0X81);
LCD_WR_REG(0xE8);
LCD_WR_DATA(0x85);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x79);
LCD_WR_REG(0xCB);
LCD_WR_DATA(0x39);
LCD_WR_DATA(0x2C);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x34);
LCD_WR_DATA(0x02);
LCD_WR_REG(0xF7);
LCD_WR_DATA(0x20);
LCD_WR_REG(0xEA);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x00);
LCD_WR_REG(0xC0); //Power control
LCD_WR_DATA(0x1D); //VRH[5:0]
LCD_WR_REG(0xC1); //Power control
LCD_WR_DATA(0x12); //SAP[2:0];BT[3:0]
LCD_WR_REG(0xC5); //VCM control
LCD_WR_DATA(0x33);
LCD_WR_DATA(0x3F);
LCD_WR_REG(0xC7); //VCM control
LCD_WR_DATA(0x92);
LCD_WR_REG(0x3A); // Memory Access Control
LCD_WR_DATA(0x55);
LCD_WR_REG(0x36); // Memory Access Control
LCD_WR_DATA(0x08);
LCD_WR_REG(0xB1);
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x12);
LCD_WR_REG(0xB6); // Display Function Control
LCD_WR_DATA(0x0A);
LCD_WR_DATA(0xA2);

LCD_WR_REG(0x44);
LCD_WR_DATA(0x02);

LCD_WR_REG(0xF2); // 3Gamma Function Disable
LCD_WR_DATA(0x00);
LCD_WR_REG(0x26); //Gamma curve selected
LCD_WR_DATA(0x01);
LCD_WR_REG(0xE0); //Set Gamma
LCD_WR_DATA(0x0F);
LCD_WR_DATA(0x22);
LCD_WR_DATA(0x1C);
LCD_WR_DATA(0x1B);
LCD_WR_DATA(0x08);
LCD_WR_DATA(0x0F);
LCD_WR_DATA(0x48);
LCD_WR_DATA(0xB8);
LCD_WR_DATA(0x34);
LCD_WR_DATA(0x05);
LCD_WR_DATA(0x0C);
LCD_WR_DATA(0x09);
LCD_WR_DATA(0x0F);
LCD_WR_DATA(0x07);
LCD_WR_DATA(0x00);
LCD_WR_REG(0XE1); //Set Gamma
LCD_WR_DATA(0x00);
LCD_WR_DATA(0x23);
LCD_WR_DATA(0x24);
LCD_WR_DATA(0x07);
LCD_WR_DATA(0x10);
LCD_WR_DATA(0x07);
LCD_WR_DATA(0x38);
LCD_WR_DATA(0x47);
LCD_WR_DATA(0x4B);
LCD_WR_DATA(0x0A);
LCD_WR_DATA(0x13);
LCD_WR_DATA(0x06);
LCD_WR_DATA(0x30);
LCD_WR_DATA(0x38);
LCD_WR_DATA(0x0F);
LCD_WR_REG(0x11); //Exit Sleep
delay_ms(120);
LCD_WR_REG(0x29); //Display on
}

void LCD_SetArea(unsigned int stx,unsigned int sty,unsigned int endx,unsigned int endy)        //设置窗口
{
        LCD_WR_REG(0x2A);  
//        LCD_WR_DATA((stx>>8)&0x00ff);   
//        LCD_WR_DATA(stx&0x00ff);           
//        LCD_WR_DATA((endx>>8)&0x00ff);
//        LCD_WR_DATA(endx&0x00ff);       
        LCD_WR_DATA(0x00);   
        LCD_WR_DATA(0x00);           
        LCD_WR_DATA(0x01);
        LCD_WR_DATA(0x3f);       
//        LCD_WR_DATAX(stx);
//        LCD_WR_DATAX(endx);

        LCD_WR_REG(0x2B);  
//        LCD_WR_DATA((sty>>8)&0x00ff);
//        LCD_WR_DATA(sty&0x00ff);       
//        LCD_WR_DATA((endy>>8)&0x00ff);
//        LCD_WR_DATA(endy&0x00ff);       
        LCD_WR_DATA(0x00);   
        LCD_WR_DATA(0x00);           
        LCD_WR_DATA(0x00);
        LCD_WR_DATA(0xef);       
//        LCD_WR_DATAX(sty);
//        LCD_WR_DATAX(endy);
}

void LCD_SetAreaXY(unsigned char x,unsigned int y)
{
        LCD_SetArea(x,y,x,y);       
}

void LcdWirteColorData(unsigned int color)        //写颜色值至ILI9341
{
        LCD_RS_SET;
        LCD_RD_SET;
        LCD_CS_CLR;
        DATAOUT(color);
        LCD_WR_CLR;
        LCD_WR_SET;
        LCD_CS_SET;       
}

void LCD_Clear(unsigned int color)        //清屏操作
{  
        unsigned int i,j;

        LCD_SetArea(0,0,239,319);
        LCD_WR_REG(0x2C);
        for(i = 0;i < 320;i++)
        {
                for(j = 0;j < 240;j++)
                {
                        LcdWirteColorData(color);
                }
        }
}
主函数:
int REK = 0xffff;

int main(void)
{       
                USART3_Config(9600);
                delay_init();
                LCD_Init();
                LCD_Clear(Yellow);
                while(1)
                {
                        printf("ID is :%x\n",REK);
                        LCD_Clear(Yellow);
                }
}

相关帖子

沙发
纪国圣|  楼主 | 2016-3-11 19:49 | 只看该作者
电路图如图所示:

使用特权

评论回复
板凳
纪国圣|  楼主 | 2016-3-11 20:56 | 只看该作者
新人第一次发帖,别沉呀。

使用特权

评论回复
地板
淼淼森森| | 2016-3-11 21:57 | 只看该作者
你好,我也用过ILI9341,请问屏之前用过吗,屏的电路中有个电阻断开就可以了,可以发下屏的资料吗

使用特权

评论回复
5
淼淼森森| | 2016-3-11 22:01 | 只看该作者
要不你看下屏的资料,屏自身的电路有两种连接方式,你换了试下,我当时就是这样解决的,希望能帮到你

使用特权

评论回复
6
纪国圣|  楼主 | 2016-3-11 22:13 | 只看该作者
这个是厂家的产品承认书,还有一份ILI9341的说明书太大,传不上来。
还有,屏上只有电容,没有看到电阻。 SPEC-Z320IT008_v0.3.pdf (535.42 KB)

使用特权

评论回复
7
纪国圣|  楼主 | 2016-3-11 22:21 | 只看该作者
以前用过这个厂家生产的屏,也是ILI9341,不过是37Pin的。当时厂家提供的驱动也是出现这样的问题。后来在参数设置那随便改了几个,居然给我调通了。后来厂家不生产那个屏了,我就换了这个40Pin的屏,现在出现这问题,真心没辙了。

使用特权

评论回复
8
lgq1542380129| | 2016-3-12 09:31 | 只看该作者
读出ID署名FSMC配置的时序没有问题。应该是在写入RAM时,少写
一条指令

使用特权

评论回复
9
纪国圣|  楼主 | 2016-3-12 09:52 | 只看该作者
这款屏的说明书有点怪,在厂家发给我的ILI9341的说明书上居然没有看到有关0xCF,0xED之类的说明。

使用特权

评论回复
10
纪国圣|  楼主 | 2016-3-12 11:30 | 只看该作者
lgq1542380129 发表于 2016-3-12 09:31
读出ID署名FSMC配置的时序没有问题。应该是在写入RAM时,少写
一条指令

关键是我也不知道漏写了哪一条指令,这些参数设置都大同小异的,参照别人的程序也都那样。看手册也看迷糊了,厂家发给我的手册里面居然没有对0xCF等寄存器的描述。

使用特权

评论回复
11
纪国圣|  楼主 | 2016-3-19 12:35 | 只看该作者
千万别沉呀。

使用特权

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

本版积分规则

77

主题

407

帖子

5

粉丝