OpenEdv-开源电子网

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

STM32读TFTLCD屏问题

[复制链接]

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-11-3 10:37:39 | 显示全部楼层 |阅读模式
5金钱
修改程序后,LCD屏读不出,但是能够打印出  ID9341。

使用原子哥的例程做出的接口修改:
#define LCD_LED PEout(15) //LCD背光     PE15 

#define LCD_CS_SET  GPIOC->BSRR=1<<12    //片选端口       PC12
#define LCD_RS_SET GPIOB->BSRR=1<<5    //数据/命令          B5   
#define LCD_WR_SET GPIOC->BSRR=1<<10    //写数据 PC10
#define LCD_RD_SET GPIOC->BSRR=1<<11    //读数据 PC11
   
#define LCD_CS_CLR  GPIOC->BRR=1<<12     //片选端口       PC12
#define LCD_RS_CLR GPIOB->BRR=1<<5     //数据/命令          B5   
#define LCD_WR_CLR GPIOC->BRR=1<<10     //写数据 PC10
#define LCD_RD_CLR GPIOC->BRR=1<<11     //读数据 PC11  

//PD0~15,作为数据线
#define DATAOUT(x) GPIOD->ODR=x; //数据输出
#define DATAIN     GPIOD->IDR;   //数据输入

下面是寄存器修改:
u16 LCD_RD_DATA(void)
{   
u16 t;
  GPIOD->CRL=0X88888888; //PB0-7  上拉输入
GPIOD->CRH=0X88888888; //PB8-15 上拉输入
GPIOD->ODR=0X0000;     //全部输出0

LCD_RS_SET;
LCD_CS_CLR;
//读取数据(读寄存器时,并不需要读2次)
LCD_RD_CLR;
if(lcddev.id==0X8989)delay_us(2);//FOR 8989,延时2us   
LCD_RD_SET;
t=DATAIN;  
LCD_CS_SET; 

GPIOD->CRL=0X33333333; //PB0-7  上拉输出
GPIOD->CRH=0X33333333; //PB8-15 上拉输出
GPIOD->ODR=0XFFFF;    //全部输出高
return t;  
}

u16 LCD_ReadPoint(u16 x,u16 y)
{
  u16 r,g,b;
if(x>=lcddev.width||y>=lcddev.height)return 0; //超过了范围,直接返回   
LCD_SetCursor(x,y);
if(lcddev.id==0X9341||lcddev.id==0X6804)LCD_WR_REG(0X2E); //9341/6804发送读GRAM指令
else LCD_WR_REG(R34);       //其他IC发送读GRAM指令
GPIOD->CRL=0X88888888; //PB0-7  上拉输入
GPIOD->CRH=0X88888888; //PB8-15 上拉输入
GPIOD->ODR=0XFFFF;     //全部输出高

LCD_RS_SET;
LCD_CS_CLR;    
//读取数据(读GRAM时,第一次为假读)
LCD_RD_CLR;
  delay_us(1);//延时1us   
LCD_RD_SET;
  //dummy READ
LCD_RD_CLR;   
delay_us(1);//延时1us   
LCD_RD_SET;
  r=DATAIN;  
  if(lcddev.id==0X9341)
{  
LCD_RD_CLR;   
LCD_RD_SET;
b=DATAIN;//读取蓝色值    
g=r&0XFF;//对于9341,第一次读取的是RG的值,R在前,G在后,各占8位
g<<=8;
}else if(lcddev.id==0X6804)
{
LCD_RD_CLR;   
LCD_RD_SET;
r=DATAIN;//6804第二次读取的才是真实值 
}  
LCD_CS_SET;

GPIOD->CRL=0X33333333; //PB0-7  上拉输出
GPIOD->CRH=0X33333333; //PB8-15 上拉输出
GPIOD->ODR=0XFFFF;    //全部输出高  
if(lcddev.id==0X9325||lcddev.id==0X4535||lcddev.id==0X4531||lcddev.id==0X8989||lcddev.id==0XB505)return r; //这几种IC直接返回颜色值
else if(lcddev.id==0X9341)return (((r>>11)<<11)|((g>>10)<<5)|(b>>11)); //ILI9341需要公式转换一下
else return LCD_BGR2RGB(r); //其他IC
}

void LCD_Init(void)

    RCC->APB2ENR|=1<<3;//先使能外设PORTB时钟
RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟
RCC->APB2ENR|=1<<5;//先使能外设PORTD时钟
  RCC->APB2ENR|=1<<6;//先使能外设PORTE时钟

RCC->APB2ENR|=1<<0;    //开启辅助时钟
JTAG_Set(SWD_ENABLE);  //开启SWD
 

GPIOC->CRH&=0XFFF000FF;
GPIOC->CRH|=0X00033300;  
GPIOC->ODR|=0X1C00;
 
GPIOE->CRH&=0X0FFFFFFF;
GPIOE->CRH|=0X30000000; 
GPIOE->ODR|=0X8000;

GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000; 
GPIOB->ODR|=0X0020;
   
//PORTD 推挽输出
    GPIOD->CRH&=0X00000000; 
    GPIOD->CRH|=0X33333333; 
    GPIOD->CRL&=0X00000000; 
    GPIOD->CRL|=0X33333333; 
    GPIOD->ODR|=0XFFFFFFFF;

delay_ms(50); // delay 50 ms 
LCD_WriteReg(0x0000,0x0001);
delay_ms(50); // delay 50 ms 
  lcddev.id = LCD_ReadReg(0x0000);   
  if(lcddev.id<0XFF||lcddev.id==0XFFFF||lcddev.id==0X9300)//读到ID不正确,新增lcddev.id==0X9300判断,因为9341在未被复位的情况下会被读成9300
{
  //尝试9341 ID的读取
LCD_WR_REG(0XD3);   
LCD_RD_DATA(); //dummy read
  LCD_RD_DATA();       //读到0X00
  lcddev.id=LCD_RD_DATA();   //读取93   
  lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA();   //读取41     
  if(lcddev.id!=0X9341) //非9341,尝试是不是6804
{
  LCD_WR_REG(0XBF);   
LCD_RD_DATA(); //dummy read  
LCD_RD_DATA();      //读回0X01   
LCD_RD_DATA(); //读回0XD0  
  lcddev.id=LCD_RD_DATA();//这里读回0X68 
lcddev.id<<=8;
  lcddev.id|=LCD_RD_DATA();//这里读回0X04    
  } 
if(lcddev.id!=0X9341&&lcddev.id!=0X6804)lcddev.id=0x9341;//新增,用于识别9341     
}
  printf(" LCD ID:%x\r\n",lcddev.id); //打印LCD ID 

请问各问大神是什么地方出错了。

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

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
 楼主| 发表于 2014-11-3 10:55:33 | 显示全部楼层
我用mini的时候,数据线使用的是PB0-PB15,这是可以的,但是我用自己的板子时候,芯片103VB,数据线改为PD0-PD15后,LCD就不显示了。
回复

使用道具 举报

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-2-24
在线时间
4 小时
发表于 2014-11-3 11:56:07 | 显示全部楼层
回复【2楼】chenwangchris:
---------------------------------
请问可以写屏幕吗?
你看看写屏幕函数有啥问题不
回复

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
 楼主| 发表于 2014-11-3 13:27:11 | 显示全部楼层
回复【3楼】denishan:
---------------------------------
我试过原子哥的程序,写屏幕函数没问题,我只是修改了接口定义,其他没变
回复

使用道具 举报

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-2-24
在线时间
4 小时
发表于 2014-11-3 13:40:48 | 显示全部楼层
回复【4楼】chenwangchris:
---------------------------------
按理来说只改接口定义完全能显示的。。。
你的意思是LCD不能显示是吧?还是不能读取一个点的值?
ID都读到了,这应该就成功一半了。
你看看的LCD所有相关IO有没有干别的事?
回复

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
 楼主| 发表于 2014-11-3 13:54:15 | 显示全部楼层
回复【5楼】denishan:
---------------------------------
好的,我检查一下
回复

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
 楼主| 发表于 2014-11-3 14:05:24 | 显示全部楼层
回复【5楼】denishan:
---------------------------------
IO口没有重复使用的
回复

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
 楼主| 发表于 2014-11-3 14:05:51 | 显示全部楼层
回复【5楼】denishan:
---------------------------------
LCD不能显示,更不能写入
回复

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
 楼主| 发表于 2014-11-3 14:10:44 | 显示全部楼层
回复【5楼】denishan:
---------------------------------
原子哥的TFTLCD屏上有个引脚标记5V,必须接5V吗
回复

使用道具 举报

2

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2014-2-24
在线时间
4 小时
发表于 2014-11-3 15:29:45 | 显示全部楼层
回复【9楼】chenwangchris:
---------------------------------
你的屏幕是MINI板配套的吗?我没有原子哥的板,但是我看原理图,那个屏VCC是3.3V,但是背光VDD要5V?你确定背光点亮了吗?
回复

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
 楼主| 发表于 2014-11-3 16:38:07 | 显示全部楼层
回复【10楼】denishan:
---------------------------------
背光接了5V了,还是不显示
回复

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
 楼主| 发表于 2014-11-3 16:40:24 | 显示全部楼层
回复【10楼】denishan:
---------------------------------
对,屏幕是mini配套的
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-3 18:12:48 | 显示全部楼层
你这个ID,可能是最后的if强制设置成9341,而不是你真正读取到的
把这句话:
if(lcddev.id!=0X9341&&lcddev.id!=0X6804)lcddev.id=0x9341;//新增,用于识别9341 
删掉,然后再测试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
 楼主| 发表于 2014-11-3 22:00:21 | 显示全部楼层
回复【13楼】正点原子:
-确实如原子哥所料,删除过后,ID就为0了
回复

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
 楼主| 发表于 2014-11-3 22:22:09 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
我关于IO的设置没出错,为什么就不行了呢,其他都没动过
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-3 23:16:00 | 显示全部楼层
回复【15楼】chenwangchris:
---------------------------------
先把IO依次接0和1,看看读出来的数据,有规律不。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
 楼主| 发表于 2014-11-4 10:18:04 | 显示全部楼层
回复【16楼】正点原子:
---------------------------------
原子哥,请问您说的“先把IO依次接0和1”是什么意思?
我用mini开发板试的时候,数据线0-15用PB,完全可以显示,但换成PA,屏幕就不显示了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-4 23:14:20 | 显示全部楼层
回复【17楼】chenwangchris:
---------------------------------
比如所有IO上拉输入
你读出来,是不是应该0XFFFF?
然后最低位接GND,读出来,是不是0XFFFE?
以此类推,看看有没有问题,这就检测了16个数据口是否正常了

这就是解决问题的思路。思路决定出路啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-5-4
在线时间
0 小时
 楼主| 发表于 2014-11-7 10:30:59 | 显示全部楼层
回复【18楼】正点原子:
---------------------------------
测过之后,数据口全部都是正常的,是不是程序不对了,可是我只改动了引脚的定义,其他都没动过
回复

使用道具 举报

13

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2013-12-12
在线时间
13 小时
发表于 2014-11-7 12:44:11 | 显示全部楼层
背光亮了么?写不进去的话,如果数据线没问题,估计就是控制信号的问题了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-7 15:15:07 | 显示全部楼层
回复【19楼】chenwangchris:
---------------------------------
那得继续查其他问题了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-8-16
在线时间
2 小时
发表于 2016-8-16 16:54:51 | 显示全部楼层
正点原子 发表于 2014-11-4 23:14
回复【17楼】chenwangchris:
---------------------------------
比如所有IO上拉输入
你读出来,是不是应该 ...

GPIOD->CRL=0X88888888; //PB0-7  上拉输入
GPIOD->CRH=0X88888888; //PB8-15 上拉输入
GPIOD->ODR=0X0000;     //全部输出0

LCD_RS_SET;
LCD_CS_CLR;
//读取数据(读寄存器时,并不需要读2次)
LCD_RD_CLR;
if(lcddev.id==0X8989)delay_us(2);//FOR 8989,延时2us          
LCD_RD_SET;
t=DATAIN;  
LCD_CS_SET;

GPIOD->CRL=0X33333333; //PB0-7  上拉输出
GPIOD->CRH=0X33333333; //PB8-15 上拉输出
GPIOD->ODR=0XFFFF;    //全部输出高
在这段程序中GPIOD设置成上拉输入,GPIOD->ODR的值不应该是0x1111吗,为什么是0x0000,      GPIOD->CRL=0X33333333; 这句注释为什么写的是上拉输出,这不是推挽输出吗,也没有上拉输出这个说法啊,本人初学STM32,请大神指点一下这段程序中IO口为什么这样设置啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-8-17 20:56:45 | 显示全部楼层
ycs268106 发表于 2016-8-16 16:54
GPIOD->CRL=0X88888888; //PB0-7  上拉输入
GPIOD->CRH=0X88888888; //PB8-15 上拉输入
GPIOD->ODR=0X0 ...

0X0000说明是下拉。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
20
金钱
20
注册时间
2015-1-11
在线时间
0 小时
发表于 2017-3-9 09:27:17 | 显示全部楼层
我有相同的问题,请问怎么解决的?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 05:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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