新手入门
- 积分
- 6
- 金钱
- 6
- 注册时间
- 2019-9-26
- 在线时间
- 11 小时
|
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
}
}
}
}
}
|
|