新手入门
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2012-8-26
- 在线时间
- 0 小时
|
我用的是F103ZET,用bank1的NE1,然后RS接的是A0
调了好几天了,在二位的代码基础上写的,觉得lcd驱动的代码应该没有问题啊,但是不知为何读出来的devicecode 是0xb
量过lcd的所有地址和数据管脚,用通用推挽io的方式测过都是通的
求指点,高手们帮我看看吧
LCD_base_addr 改成0x60000000
我一开始是把base地址改过后把所有的fsmc管脚都设成复用推挽输出,用寄存器方式对bctr[0], bctr[1]和bwtr[0]操作
然后担心是因为设成输出了所以读取device code不对,试过只设置fsmc的控制管脚和地址管脚,data管脚默认,还是不行
然后用库里的函数写了一个,也还是没进展,我觉得fsmc的设置应该没有问题啊?高手帮我看看问题到底在哪儿呢?
?//初始化lcd
//该初始化函数可以初始化各种ILI93XX液晶,但是其他函数是基于ILI9320的!!!
//在其他型号的驱动芯片上没有测试!
void LCD_Init(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
RCC->AHBENR|=1<<8; //使能FSMC时钟
RCC->APB2ENR |=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<3; //使能PORTB时钟
RCC->APB2ENR|=1<<5; //使能PORTD时钟
RCC->APB2ENR|=1<<6; //使能PORTE时钟
RCC->APB2ENR|=1<<7; //使能PORTF时钟
RCC->APB2ENR|=1<<8; //使能PORTG时钟
//RCC->APB2ENR |= 1<<7;
RCC->APB2ENR|=1<<0; //使能AFIO时钟
///////////////////
//GPIOB->CRL&=0XFFFFFFF0;//PB0 推挽输出
//GPIOB->CRL|=0X00000003;
GPIOA->CRH&=0XFFFFFF0F;
GPIOA->CRH|=0X00000030;//PA9 推挽输出 背光
GPIOA->ODR|=1<<9; //PA9 输出高
LED = 0;
LED = 1;
//PORTD复用推挽输出
//GPIOD->CRH&=0X00000000;
//GPIOD->CRH|=0XBBbbbBBB;
//PD7:CS PD5:WR~ PD4: RD~
GPIOD->CRL&=0X0F00FFFF;
GPIOD->CRL|=0XB0BB0000;
//PORTE复用推挽输出
// GPIOE->CRH&=0X00000000;
// GPIOE->CRH|=0XBBBBBBBB;
// GPIOE->CRL&=0X00000000;
// GPIOE->CRL|=0XBBBBBBBB;
//PORTE复用推挽输出
GPIOE->CRH&=0X00000000;
GPIOE->CRH|=0XBBBBBBBB;
GPIOE->CRL&=0X0FFFFFFF;
GPIOE->CRL|=0XB0000000;
// GPIOE->CRL&=0X0FFFFFFF;
// GPIOE->CRL|=0XB0000000;
// //PORTG12复用推挽输出 A0 /
// GPIOG->CRH&=0XFFF0FFFF;
// GPIOG->CRH|=0X000B0000;
// GPIOG->CRL&=0XFFFFFFF0;//PG0->RS
// GPIOG->CRL|=0X0000000B;
//PORTF0复用推挽输出 A0
// GPIOF->CRH&=0XFFFfFFF0;
// GPIOF->CRH|=0X0000000B;
// GPIOF->CRL&=0XFFFFFFF0;//PF0->RS
// GPIOF->CRL|=0X0000000B;
// GPIOF->CRH&=0X00000000;
// GPIOF->CRH|=0XbbbbbbbB;
GPIOF->CRL&=0XFFFFFFF0;//PF0->RS
GPIOF->CRL|=0X0000000B;
/* //寄存器清零
//bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
//这里我们使用NE4 ,也就对应BTCR[6],[7]。
FSMC_Bank1->BTCR[0]=0X00000000;
FSMC_Bank1->BTCR[1]=0X00000000;
FSMC_Bank1E->BWTR[0]=0X00000000;
//操作BCR寄存器 使用异步模式
FSMC_Bank1->BTCR[0]|=1<<12;//存储器写使能
FSMC_Bank1->BTCR[0]|=1<<4; //存储器数据宽度为16bit
//操作BTR寄存器
//3个HCLK(HCLK=72M)因为液晶驱动IC的写信号脉宽,最少也得50ns。72M/3=24M=42ns,已经超频了。
FSMC_Bank1->BTCR[1]|=1<<9; //数据保存时间为3个HCLK
//闪存写时序寄存器
FSMC_Bank1E->BWTR[0]=0x0FFFFFFF;//默认值
//使能BANK4(PC卡设备)
FSMC_Bank1->BTCR[0]|=1<<0;
////////////////////////////////////////////////////////
//RCC->AHBENR |= 1<<8; //开启FSMC时钟
//RCC->APB2ENR |= 1<<0; //开启辅助时钟AFIO
//FSMC->BCR1 = 0X00001050;//sram 16BIT 模式B 位4,5->01:16位(default) 位6->1:允许对NOR闪存存储器的访问操作。 位12->1:允许FSMC对存储器的写操作;这是复位后的默认状态。
//FSMC->BTR1 = 0X00000501; //位3:0->地址建立时间 0001->2个HCLK时钟周期 ; 位7:4->地址保持时间 0101->6个HCLK时钟周期
//FSMC->BCR1 |= 0X00000001; //位0->存储器块使能位 1:启用对应的存储器块。
//FSMC ->BWTR1=0X0FFFFFFF; //这个寄存器包含了每个存储器块的控制信息,可以用于SRAM、ROM和NOR闪存存储器。如果FSMC_BCRx寄存器中设置了EXTMOD位,则这个寄存器对应写操作。
*/
/*-- FSMC Configuration ------------------------------------------------------*/
/*----------------------- SRAM Bank 1 ----------------------------------------*/
/* FSMC_Bank1_NORSRAM4 configuration */
/*
p.FSMC_AddressSetupTime = 1;
p.FSMC_AddressHoldTime = 0;
p.FSMC_DataSetupTime = 2;
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A;
/* Color LCD configuration ------------------------------------
LCD configured as follow:
- Data/Address MUX = Disable
- Memory Type = SRAM
- Data Width = 16bit
- Write Operation = Enable
- Extended Mode = Enable
- Asynchronous Wait = Disable
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
//FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* BANK 1 (of NOR/SRAM Bank 1~4) is enabled
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);*/
////////////////////////////////////////////////////////
delay_ms(50); // delay 50 ms
//while(1)
//{
LCD_WriteReg(0x0000,0x0001);
//}
delay_ms(50); // delay 50 ms
//因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
FSMC_Bank1->BTCR[1]|=0XF<<8; //数据保存时间为16个HCLK
DeviceCode = LCD_ReadReg(0x0000);
FSMC_Bank1->BTCR[1]&=~(0XF<<8); //数据保存时间为0
//因为液晶驱动IC的写信号脉宽,最少也得50ns。72M/3=24M=42ns,已经超频了。
FSMC_Bank1->BTCR[1]|=1<<9; //数据保存时间为3个HCLK
printf(" LCD ID:%x\n",DeviceCode); //打印LCD ID
if(DeviceCode==0x9325||DeviceCode==0x9328)//ILI9325 OK |/|/|
{
LCD_WriteReg(0x00e7,0x0010);
LCD_WriteReg(0x0000,0x0001);//开启内部时钟
LCD_WriteReg(0x0001,0x0100);
LCD_WriteReg(0x0002,0x0700);//电源开启
//LCD_WriteReg(0x0003,(1<<3)|(1<<4) ); //65K RGB
//DRIVE TABLE(寄存器 03H)
//BIT3=AM BIT4:5=ID0:1
//AM ID0 ID1 FUNCATION
// 0 0 0 R->L D->U
// 1 0 0 D->U R->L
// 0 1 0 L->R D->U
// 1 1 0 D->U L->R
// 0 0 1 R->L U->D
// 1 0 1 U->D R->L
// 0 1 1 L->R U->D 正常就用这个.
// 1 1 1 U->D L->R
LCD_WriteReg(0x0003,(1<<12)|(3<<4)|(1<<3) );//65K
LCD_WriteReg(0x0004,0x0000);
LCD_WriteReg(0x0008,0x0207);
LCD_WriteReg(0x0009,0x0000);
LCD_WriteReg(0x000a,0x0000);//display setting
LCD_WriteReg(0x000c,0x0001);//display setting
LCD_WriteReg(0x000d,0x0000);//0f3c
LCD_WriteReg(0x000f,0x0000);
//电源配置
LCD_WriteReg(0x0010,0x0000);
LCD_WriteReg(0x0011,0x0007);
LCD_WriteReg(0x0012,0x0000);
LCD_WriteReg(0x0013,0x0000);
delay_ms(50);
LCD_WriteReg(0x0010,0x1590);
LCD_WriteReg(0x0011,0x0227);
delay_ms(50);
LCD_WriteReg(0x0012,0x009c);
delay_ms(50);
LCD_WriteReg(0x0013,0x1900);
LCD_WriteReg(0x0029,0x0023);
LCD_WriteReg(0x002b,0x000e);
delay_ms(50);
LCD_WriteReg(0x0020,0x0000);
LCD_WriteReg(0x0021,0x013f);
delay_ms(50);
//伽马校正
LCD_WriteReg(0x0030,0x0007);
LCD_WriteReg(0x0031,0x0707);
LCD_WriteReg(0x0032,0x0006);
LCD_WriteReg(0x0035,0x0704);
LCD_WriteReg(0x0036,0x1f04);
LCD_WriteReg(0x0037,0x0004);
LCD_WriteReg(0x0038,0x0000);
LCD_WriteReg(0x0039,0x0706);
LCD_WriteReg(0x003c,0x0701);
LCD_WriteReg(0x003d,0x000f);
delay_ms(50);
LCD_WriteReg(0x0050,0x0000); //水平GRAM起始位置
LCD_WriteReg(0x0051,0x00ef); //水平GRAM终止位置
LCD_WriteReg(0x0052,0x0000); //垂直GRAM起始位置
LCD_WriteReg(0x0053,0x013f); //垂直GRAM终止位置
LCD_WriteReg(0x0060,0xa700);
LCD_WriteReg(0x0061,0x0001);
LCD_WriteReg(0x006a,0x0000);
LCD_WriteReg(0x0080,0x0000);
LCD_WriteReg(0x0081,0x0000);
LCD_WriteReg(0x0082,0x0000);
LCD_WriteReg(0x0083,0x0000);
LCD_WriteReg(0x0084,0x0000);
LCD_WriteReg(0x0085,0x0000);
LCD_WriteReg(0x0090,0x0010);
LCD_WriteReg(0x0092,0x0000);
LCD_WriteReg(0x0093,0x0003);
LCD_WriteReg(0x0095,0x0110);
LCD_WriteReg(0x0097,0x0000);
LCD_WriteReg(0x0098,0x0000);
//开启显示设置
LCD_WriteReg(0x0007,0x0133);
LCD_WriteReg(0x0020,0x0000);
LCD_WriteReg(0x0021,0x013f);
}
int main(void)
{
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72);
//uart_init(72,9600);
LCD_Init();
LCD_ShowString(0,0,"START INITing...");
while(1)//初始化ov7670
{
LCD_ShowString(0,0,"TEST OK");
delay_ms(511);
LCD_ShowString(0,0," ");
};
}
|
|