OpenEdv-开源电子网

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

STM32f103ZE用FSMC驱动5寸TFT,TFT驱动IC是1963的,驱动失败求救

[复制链接]

0

主题

0

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-9-26
在线时间
11 小时
发表于 2016-11-5 16:34:21 | 显示全部楼层 |阅读模式
3金钱
STM32f103ZE用FSMC驱动5寸TFT,TFT驱动IC是1963的,驱动失败,代码是移植原子哥的综合测试实验的,仿真测试发现没有读出的屏幕id lcddev.id=0x00000000的,这个是为什么,硬件电路接发差不多都和原子哥的精英板类似,不同的是复位键和背光键,都换了引脚配配置,一直读不出id号,是不是FSMC根本没配置好???下面贴上代码,在FSMC配置好后,使用了液晶硬复位函数函数,仿真发现执行了液晶硬复位函数后,屏幕高亮了一下白屏,然后按了下来,求解答帮助,谢谢了

void LCD_Init(void)
{                                                                                   
        RCC->AHBENR|=1<<8;                      //使能FSMC时钟          
  //RCC->APB2ENR|=1<<3;             //使能PORTB时钟
        //RCC->APB2ENR|=1<<0;             //使能PORTD时钟
        RCC->APB2ENR|=1<<5;             //使能PORTD时钟
        RCC->APB2ENR|=1<<6;             //使能PORTE时钟
        RCC->APB2ENR|=1<<8;              //使能PORTG时钟         
//         GPIOB->CRL&=0XFFFFFFF0;                //PB0 推挽输出 背光
//         GPIOB->CRL|=0X00000003;          
        GPIOD->CRH&=0XFFF0FFFF;                //PD12 推挽输出 背光
        GPIOD->CRH|=0X00030000;               
        //PORTD复用推挽输出        
        GPIOD->CRH&=0X000FF000;   //PD8,9,10,13,14,15
        GPIOD->CRH|=0XBB300BBB;
        GPIOD->CRL&=0XFF00FF00;   //PD0,1,4,5
        GPIOD->CRL|=0X00BB00BB;            
        //PORTE复用推挽输出        
        GPIOE->CRH&=0X00000000;   //PE8-15
        GPIOE->CRH|=0XBBBBBBBB;
        GPIOE->CRL&=0X0FFFFFFF;   //PE7
        GPIOE->CRL|=0XB0000000;                                                                                                                  
        //PORTG12复用推挽输出                                                                                                               
        GPIOG->CRH&=0XFFF0FFFF;   //PG12
        GPIOG->CRH|=0X000B0000;
        GPIOG->CRL&=0XFFFFFFF0;   //PG0->RS
        GPIOG->CRL|=0X0000000B;  
//  Lcd_Reset();//液晶硬复位函数
        //寄存器清零
        //bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
        //这里我们使用NE4 ,也就对应BTCR[6],[7]。                                    
        FSMC_Bank1->BTCR[6]=0X00000000;
        FSMC_Bank1->BTCR[7]=0X00000000;
        FSMC_Bank1E->BWTR[6]=0X00000000;
        //操作BCR寄存器        使用异步模式
        FSMC_Bank1->BTCR[6]|=1<<12;                //存储器写使能
        FSMC_Bank1->BTCR[6]|=1<<14;                //读写使用不同的时序
        FSMC_Bank1->BTCR[6]|=1<<4;                 //存储器数据宽度为16bit             
        //操作BTR寄存器       
        //读时序控制寄存器                                                             
  FSMC_Bank1->BTCR[7]|=0<<28;                //模式A                                                                             
        FSMC_Bank1->BTCR[7]|=1<<0;                 //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns(实际>200ns)                  
        //因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
        FSMC_Bank1->BTCR[7]|=0XF<<8;          //数据保存时间为16个HCLK                  
        //写时序控制寄存器  
        FSMC_Bank1E->BWTR[6]|=0<<28;         //模式A                                                                      
        FSMC_Bank1E->BWTR[6]|=0<<0;                //地址建立时间(ADDSET)为1个HCLK
        //4个HCLK(HCLK=72M)因为液晶驱动IC的写信号脉宽,最少也得50ns。72M/4=24M=55ns           
        FSMC_Bank1E->BWTR[6]|=3<<8;         //数据保存时间为4个HCLK       
        //使能BANK1,区域4
        FSMC_Bank1->BTCR[6]|=1<<0;                //使能BANK1,区域4       
        Lcd_Reset();//液晶硬复位函数
//        delay_ms(50);                                         // delay 50 ms
          lcddev.id=LCD_ReadReg(0x0000);        //读ID(9320/9325/9328/4531/4535等IC)   
          if(lcddev.id<0XFF||lcddev.id==0XFFFF||lcddev.id==0X9300)//读到ID不正确,新增lcddev.id==0X9300判断,因为9341在未被复位的情况下会被读成9300
        {       
                //尝试9341 ID的读取               
                LCD_WR_REG(0XD3);                                  
                lcddev.id=LCD_RD_DATA();        //dummy read        
                lcddev.id=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);                                  
                        lcddev.id=LCD_RD_DATA();         //dummy read          
                         lcddev.id=LCD_RD_DATA();           //读回0X01                          
                         lcddev.id=LCD_RD_DATA();         //读回0XD0                                  
                          lcddev.id=LCD_RD_DATA();        //这里读回0X68
                        lcddev.id<<=8;
                          lcddev.id|=LCD_RD_DATA();        //这里读回0X04          
                        if(lcddev.id!=0X6804)                //也不是6804,尝试看看是不是NT35310
                        {
                                LCD_WR_REG(0XD4);                                  
                                lcddev.id=LCD_RD_DATA();//dummy read  
                                lcddev.id=LCD_RD_DATA();//读回0X01         
                                lcddev.id=LCD_RD_DATA();//读回0X53       
                                lcddev.id<<=8;         
                                lcddev.id|=LCD_RD_DATA();        //这里读回0X10         
                                if(lcddev.id!=0X5310)                //也不是NT35310,尝试看看是不是NT35510
                                {
                                        LCD_WR_REG(0XDA00);       
                                        lcddev.id=LCD_RD_DATA();                //读回0X00         
                                        LCD_WR_REG(0XDB00);       
                                        lcddev.id=LCD_RD_DATA();                //读回0X80
                                        lcddev.id<<=8;       
                                        LCD_WR_REG(0XDC00);       
                                        lcddev.id|=LCD_RD_DATA();                //读回0X00               
                                        if(lcddev.id==0x8000)lcddev.id=0x5510;//NT35510读回的ID是8000H,为方便区分,我们强制设置为5510
                                        if(lcddev.id!=0X5510)                        //也不是NT5510,尝试看看是不是SSD1963
                                        {
                                                LCD_WR_REG(0XA1);
                                                lcddev.id=LCD_RD_DATA();
                                                lcddev.id=LCD_RD_DATA();        //读回0X57
                                                lcddev.id<<=8;         
                                                lcddev.id|=LCD_RD_DATA();        //读回0X61       
                                                if(lcddev.id==0X5761)lcddev.id=0X1963;//SSD1963读回的ID是5761H,为方便区分,我们强制设置为1963
                                        }
                                }
                        }
                }         
        }

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

使用道具 举报

13

主题

448

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1755
金钱
1755
注册时间
2015-2-7
在线时间
369 小时
发表于 2016-11-5 18:51:14 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-11-6 19:44:32 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 00:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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