9回答

0收藏

请教stm32f0-discovery点亮TFT液晶屏的问题

STMCU STMCU 8536 人阅读 | 9 人回复 | 2012-12-25

      论坛的各位前辈,小弟最近在玩stm32f0-discovery点亮TFT液晶屏的时候遇到一个非常诡异的问题,在这里向各位请教,希望大家能够帮助我。谢谢!
      使用的硬件:(1)标准的stm32f0-discovery探索板;(2)9320的320*240的TFT液晶屏
      遇到的问题:在完成了TFT的初始化配置之后,我在主函数中通过读寄存器0x0000进而读出TFT的ID。可是在试验过程中,却发现读取ID的过程并不是每一次都能成功的。某些时候,可以读取出的正确的ID值9320,但是也有些时候(并且这种情况也常会出现)却读出了错误的ID值9300。
      我很奇怪,为什么相同的代码,并且在硬件连接完全相同的情况下,得到的结果却不同。导致这种问题的原因到底是什么呢?请各位前辈帮帮小弟!

                 读取成功时的截图
         

                     读取失败时的截图

            
分享到:
回复

使用道具 举报

回答|共 9 个

倒序浏览

沙发

xieyuanfu

发表于 2012-12-25 14:27:15 | 只看该作者

占沙发  等人 来帮你解决
板凳

xiaopaohu123

发表于 2012-12-25 14:30:03 | 只看该作者

数据线估计有干扰,不可靠,降低点SPI 的速度
地板

GY@艳

发表于 2012-12-25 14:43:36 | 只看该作者

我不会,但是帮忙顶下
爱板  爱板  爱板     https://www.cirmall.com
5#

littleway_3007505

发表于 2012-12-25 14:54:03 | 只看该作者

powerdruy 发表于 2012-12-25 14:30
读时序是不是没调好

能说得再具体一些嘛?以下是我读部分的代码
/****************************************************/
/* 函数功能:从ILI9320中读数据                      */
/* 入口参数;数据                               */
/****************************************************/
    uint16_t Lcd_Read_Data(void)
        {
                   unsigned short val,val1,val2;
                Set_Rs;
            Set_nWr;
            Clr_nRd;

                GPIOB->MODER&=0xFFFF0000;                  
                  GPIOC->MODER&=0xFFFF0000;
                val1 = GPIOB->IDR;
                val2 = GPIOC->IDR;
                val=((val1)&(0x00FF))+((val2<<8)&(0xFF00));           
                GPIOB->MODER|=0x00005555; //输入完了后从新设置为输出
                GPIOC->MODER|=0x00005555;

                Set_nRd;
            return val;
        }

/******************************************************/
/* 函数功能读寄存器里的数据                        */
/* 入口参数;com2:寄存器号                           */
/******************************************************/
         uint16_t Lcd_Read_Com_Data(uint16_t com2)
         {
                uint16_t value;
                Clr_Cs;
                Lcd_Write_Com(com2);
                value=Lcd_Read_Data();
                Set_Cs;
                return value;

         }

主函数部分:
uint16_t id1=0;
uint16_t id2=0;

int main(void)
{
                Device_Init();
        Lcd_Write_Com_Data(0x0000,0x0001);
        delay_ms(50);
        id1=Lcd_Read_Com_Data(0x0000);       
                                                          
        delay_ms(50);
        Lcd_Write_Com_Data(0x0053,0x013F);
               delay_ms(50);
               id2=Lcd_Read_Com_Data(0x0053);
              delay_ms(50);

       
        main_init(); //TFT初始化
        delay_ms(50);
                while (1)
        {
        }
}
6#

xiaopaohu123

发表于 2012-12-25 15:26:45 | 只看该作者

powerdruy 发表于 2012-12-25 15:19
他这个是TFT屏幕,显然是用16bit并口的

需要SPI先进行配置的
7#

xiaopaohu123

发表于 2012-12-25 15:31:05 | 只看该作者

xiaopaohu123 发表于 2012-12-25 15:26
需要SPI先进行配置的

实在不好意思,我想当然了,我最近接触的LCD,都是需要先SPI配置的,以为9320和我的一样的。
8#

littleway_3007505

发表于 2012-12-25 15:48:33 | 只看该作者

powerdruy 发表于 2012-12-25 15:19
他这个是TFT屏幕,显然是用16bit并口的

是这样的,我使用的是i80,并没有使用spi,并且是16位数据。
9#

littleway_3007505

发表于 2012-12-25 15:50:21 | 只看该作者

powerdruy 发表于 2012-12-25 15:21
Lcd_Write_Com(com2);
delay_ms(50);
value=Lcd_Read_Data();

好的,我再试看看,谢谢你了
10#

littleway_3007505

发表于 2012-12-25 16:00:13 | 只看该作者

powerdruy 发表于 2012-12-25 15:19
试着在每个读之间加延时函数

试过了,还是不行。还是会出现读取为9300的情况。并且我在读取函数后面加了一个清屏的函数,当读取9320成功的时候,清屏函数也产生作用,将整个屏幕刷成某个颜色;当读取失败的时候,清屏函数也跟着失效。但是会有以下的情况出现:调试时读取和清屏都是失败的,然后我将电源断开,隔几分钟后再将电源接上,TFT就直接显示刷屏的颜色了。但是这种情况也不是一定的,也是时有时无的。总之很奇怪。
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条