OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4230|回复: 5

ILI9341芯片驱动程序的问题

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-3-12
在线时间
6 小时
发表于 2016-3-12 09:41:54 | 显示全部楼层 |阅读模式
1金钱
本人刚入门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;//D′μ&#216;&#214;·
        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);                         //读ID号         
        LCD_RD_DATA();                                         
        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);
                }
}电路图如图所示:
未命名.JPG
产品规格书:
SPEC-Z320IT008_v0.3.pdf (535.42 KB, 下载次数: 350)

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-3-12
在线时间
6 小时
 楼主| 发表于 2016-3-12 09:48:11 | 显示全部楼层
难道没有人遇到过这样的问题吗?
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2016-3-12
在线时间
6 小时
 楼主| 发表于 2016-3-12 09:49:32 | 显示全部楼层
以前用过这个厂家生产的屏,也是ILI9341,不过是37Pin的。当时厂家提供的驱动也是出现这样的问题。后来在参数设置那随便改了几个,居然给我调通了。后来厂家不生产那个屏了,我就换了这个40Pin的屏,现在出现同样的问题,真心没辙了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-3-16 01:28:58 | 显示全部楼层
找厂家。这种问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-3-16 10:49:28 | 显示全部楼层
jiguosheng 发表于 2016-3-12 09:49
以前用过这个厂家生产的屏,也是ILI9341,不过是37Pin的。当时厂家提供的驱动也是出现这样的问题。后来在参 ...

可以联系我
我是初学者
专注显示科技 - - - 让每一DOT诠释生命的精彩
TFT显示屏:   https://boy-display.taobao.com
回复

使用道具 举报

9

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
552
金钱
552
注册时间
2013-12-15
在线时间
29 小时
发表于 2016-3-16 10:51:11 | 显示全部楼层
jiguosheng 发表于 2016-3-12 09:49
以前用过这个厂家生产的屏,也是ILI9341,不过是37Pin的。当时厂家提供的驱动也是出现这样的问题。后来在参 ...

异常描述不是很清晰,可以联系我解决
我是初学者
专注显示科技 - - - 让每一DOT诠释生命的精彩
TFT显示屏:   https://boy-display.taobao.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 23:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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