打印

请教STM32的FSMC 驱动LCD问题,急急急!!

[复制链接]
7241|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 ligping 于 2012-6-8 00:13 编辑

各位大侠、哥哥姐姐好。小弟最近在调液晶HX8347D2.8寸)的驱动,用STM32FSMC外部扩展口跟LCD相连,接口如下:
LCD接口             STM32I/O

D0~D1  -----------------  PD14~PD15
D2~D3-------------------PD0~PD1
D4~D12-----------------PE7~PE15
D13~D15----------------PD8~PD10

RS -------------------PD11(FSMC_A16)

CS--------------------PD7(NE1)

RST------------------PD13

WR------------------PD5(NWE)

RD-------------------PD4(NOE)


程序如下:
#define LCD_REG  *((__IO u16 *)0x60000000) //寄存器
#define LCD_RAM    *((__IO u16 *)0x60020000) //数据C/D(A16)

  
/*---------------------- Graphic LCD size definitions ------------------------*/

#define WIDTH   240 /* Screen Width (in pixels)*/

#define HEIGHT  320  / * Screen Hight (in pixels)*/


#define LCD_RstHigh()         GPIO_WriteBit(GPIOD, GPIO_Pin_13, Bit_SET)
#define LCD_RstLow()      GPIO_WriteBit(GPIOD, GPIO_Pin_13, Bit_RESET)


void LCD_WriteReg (u16 reg, u16 val)
{
   LCD_REG=reg;
   LCD_RAM=val;

}

u16 LCD_ReadReg (u16 reg)
{
            LCD_REG=reg;

            reg = LCD_RAM;

          return reg;
     }


void LCD_BSP_Init(void)
{

GPIO_InitTypeDef
GPIO_InitStructure;

TIM_TimeBaseInitTypeDef

TIM_TimeBaseStructure;


TIM_OCInitTypeDef

TIM_OCInitStructure;


RCC_ClocksTypeDef
RCC_ClocksStatus;



FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStructure;


FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;



RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode
= GPIO_Mode_AF_PP;
//
设置为Alternate function push-pull


GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0// PD.0
D2

                                 |  GPIO_Pin_1// PD.1
D3

                                 | GPIO_Pin_4// PD.4NOE(RD)
                                 | GPIO_Pin_5// PD.5NWE(WE)
                                 | GPIO_Pin_7// PD.7NE1(CS)
                                 | GPIO_Pin_8// PD.8D13
                                 | GPIO_Pin_9// PD.9D14
                                 | GPIO_Pin_10// PD.10
D15

                                 | GPIO_Pin_11// PD.11
A16(RS)

                                 | GPIO_Pin_14// PD.14
D0

                                 | GPIO_Pin_15;// PD.15
D1


GPIO_Init(GPIOD, &GPIO_InitStructure);



GPIO_InitStructure.GPIO_Pin= GPIO_Pin_7// PE.7
D4

                                          | GPIO_Pin_8// PE.8
D5

                                          | GPIO_Pin_9// PE.9
D6

                                          | GPIO_Pin_10// PE.10
D7

                                          | GPIO_Pin_11// PE.10D8
                                          | GPIO_Pin_12// PE.10
D9

                                          | GPIO_Pin_13// PE.10
D10

                                           | GPIO_Pin_14// PE.10
D11

                                           | GPIO_Pin_15;// PE.10D12

GPIO_Init(GPIOE, &GPIO_InitStructure);



/ /* Set PD3(BLCD ) ,PD13(LCD_RST)as alternate function push pull
*/


GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3|GPIO_Pin_13;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


GPIO_Init(GPIOD, &GPIO_InitStructure);


RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

/* Configure the FSMC Parallel interface -------------------------------------*/


FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
//
选择NE1


FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
//
地址数据非复用


FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
//SRAM


FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
//
数据宽度16


FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_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_NORSRAMTimingInitStructure.FSMC_AddressSetupTime= 0;// ADDSET


FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime= 0;// ADDHOLD


FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime= 1;// DATAST


FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 0;// BUSTURN


FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision= 1;// CLKDIV


FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency= 0;// DATLAT


FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_B;// ACCMOD



FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;


FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;


FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);


/* Enable FSMC_Bank1_NORSRAM1 */


FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);




}


void LCD_OSL_Init(void)
{


//
复位LCD


LCD_RstHigh();


LCD_Delayms(100);


LCD_RstLow();


LCD_Delayms(100);


LCD_RstHigh();


OSTimeDlyHMSM (0, 0, 0, 100);




//Driving ability Setting


LCD_WriteReg(0xEA,0x00);


LCD_WriteReg(0xEB,0x20);


LCD_WriteReg(0xEC,0x0C);


LCD_WriteReg(0xED,0xC4);


LCD_WriteReg(0xE8,0x40);


LCD_WriteReg(0xE9,0x38);


LCD_WriteReg(0xF1,0x01);


LCD_WriteReg(0xF2,0x10);



LCD_WriteReg(0x27,0xA3);


//Gamma setting


LCD_WriteReg(0x40,0x01);


LCD_WriteReg(0x41,0x00);


LCD_WriteReg(0x42,0x00);



LCD_WriteReg(0x43,0x10);


LCD_WriteReg(0x44,0x0E);


LCD_WriteReg(0x45,0x24);



LCD_WriteReg(0x46,0x04);


LCD_WriteReg(0x47,0x50);


LCD_WriteReg(0x48,0x02);


LCD_WriteReg(0x49,0x13);


LCD_WriteReg(0x4A,0x19);


LCD_WriteReg(0x4B,0x19);


LCD_WriteReg(0x4C,0x16);


LCD_WriteReg(0x50,0x1B);


LCD_WriteReg(0x51,0x31);


LCD_WriteReg(0x52,0x2F);


LCD_WriteReg(0x53,0x3F);


LCD_WriteReg(0x54,0x3F);


LCD_WriteReg(0x55,0x3E);



LCD_WriteReg(0x56,0x2F);


LCD_WriteReg(0x57,0x7B);


LCD_WriteReg(0x58,0x09);



LCD_WriteReg(0x59,0x06);


LCD_WriteReg(0x5A,0x06);


LCD_WriteReg(0x5B,0x0C);


LCD_WriteReg(0x5C,0x1D);


LCD_WriteReg(0x5D,0xCC);

// ----------- Power Voltage Setting ----------//

LCD_WriteReg(0x1B,0x18);


LCD_WriteReg(0x1A,0x01);



LCD_WriteReg(0x24,0x15);


LCD_WriteReg(0x25,0x50);


LCD_WriteReg(0x23,0x8B);



LCD_WriteReg(0x18,0x36);


LCD_WriteReg(0x19,0x01);


LCD_WriteReg(0x01,0x00);


LCD_WriteReg(0x1F,0x88);



LCD_Delayms(5);


LCD_WriteReg(0x1F,0x80);


LCD_Delayms(5);


LCD_WriteReg(0x1F,0x90);


LCD_Delayms(5);


LCD_WriteReg(0x1F,0xD0);


LCD_Delayms(5);


LCD_WriteReg(0x17,0x05);


LCD_WriteReg(0x36,0x00);


LCD_WriteReg(0x28,0x38);


LCD_Delayms(40);


LCD_WriteReg(0x28,0x3C);



//------------------ Set GRAM area ---------------//

LCD_WriteReg(0x02,0x00);



LCD_WriteReg(0x03,0x00);


LCD_WriteReg(0x04,0x00);


LCD_WriteReg(0x05,0xEF);


LCD_WriteReg(0x06,0x00);


LCD_WriteReg(0x07,0x00);


LCD_WriteReg(0x08,0x01);


LCD_WriteReg(0x09,0x3F);


LCD_WriteReg(0x22,0x00);




}
沙发
ligping|  楼主 | 2012-6-8 00:13 | 只看该作者
第一次发帖子,望大侠们能指点一二!!!

使用特权

评论回复
板凳
acgean| | 2012-6-8 08:45 | 只看该作者
唉, 又是个连问题都不说, 却让人给改程序的帖子。

使用特权

评论回复
地板
IJK| | 2012-6-8 09:26 | 只看该作者
指点什么?
如果LCD可以显示,那就没有问题啊。

使用特权

评论回复
5
ilovezeno| | 2012-6-8 13:21 | 只看该作者
你先读读LCD驱动芯片的型号,如果读的出来说明io设置没问题。
如果读不出来或者和8347对应的值不同,那就说明连线有问题。

使用特权

评论回复
6
ligping|  楼主 | 2012-6-8 13:50 | 只看该作者
IO没有问题,现在问题是连读LCD的寄存器都没有成功,就是读LCD的ID号都读不出来。

使用特权

评论回复
7
ligping|  楼主 | 2012-6-8 13:53 | 只看该作者
FSMC的时间怎么设置啊,看了资料,都还是算不出来.
[img][/img] ,LCD的 Tcc =10ns。

使用特权

评论回复
8
ligping|  楼主 | 2012-6-8 13:59 | 只看该作者

使用特权

评论回复
9
ligping|  楼主 | 2012-6-8 14:09 | 只看该作者
由公式:DATAST × HCLK = tWRLW , DATAST= 15/13.8 ns = 1.08 ,取 1 不知道对不。 再由公式((ADDSET + 1) + (DATAST + 1)) × HCLK = max(tCYC, tCYC(READ)) ,即((ADDSET + 1) + (DATAST + 1)) × HCLK = 66 ,算出 ADDSET = 66/13.8 - 3 = 1.7,这取 2 。最后 得出
Address setup time: 0x1
Address hold time: 0x0
Data setup time: 0x2   。不知道这个设置是否有问题。

使用特权

评论回复
10
ilovezeno| | 2012-6-8 16:27 | 只看该作者
IO没有问题,现在问题是连读LCD的寄存器都没有成功,就是读LCD的ID号都读不出来。
ligping 发表于 2012-6-8 13:50
序列号都读不出你怎么知道io没问题的。。。。。

使用特权

评论回复
11
ilovezeno| | 2012-6-8 16:28 | 只看该作者
IO没有问题,现在问题是连读LCD的寄存器都没有成功,就是读LCD的ID号都读不出来。
ligping 发表于 2012-6-8 13:50
序列号都读不出你怎么知道io没问题的。。。。。

使用特权

评论回复
12
ligping|  楼主 | 2012-6-8 17:06 | 只看该作者
检查很多遍了,IO连接真的是没有问题了。

使用特权

评论回复
13
ligping|  楼主 | 2012-6-8 17:08 | 只看该作者
楼上能帮我看看,FSMC时间设置是否有问题吗?

使用特权

评论回复
14
IJK| | 2012-6-8 17:32 | 只看该作者
楼上能帮我看看,FSMC时间设置是否有问题吗?
ligping 发表于 2012-6-8 17:08


FSMC时间设置很容易,先设置慢点就行了:

FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime= 20;// ADDSET
FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime= 20;// ADDHOLD
FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime= 21;// DATAST
FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration = 20;// BUSTURN
FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision= 2;// CLKDIV
FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency= 20;// DATLAT

使用特权

评论回复
15
IJK| | 2012-6-8 17:35 | 只看该作者
多说一句:
ID读对之前,需要借助示波器来调试, 否则基本上是 事倍功半。

使用特权

评论回复
16
ligping|  楼主 | 2012-6-9 11:08 | 只看该作者
谢谢楼上的建议

使用特权

评论回复
17
ligping|  楼主 | 2012-6-11 11:02 | 只看该作者
终于初始化成功了,果然是硬件的问题。谢谢各位大侠的帮助。

使用特权

评论回复
18
贞观之治| | 2013-1-23 14:28 | 只看该作者
这里高手很多,不怕问题,就怕你说不清问题

使用特权

评论回复
19
a874321| | 2013-5-28 10:45 | 只看该作者
估计还有软件问题:RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);


RCC_APB2Periph_GPIOB 改成 RCC_APB2Periph_GPIOE 才对

使用特权

评论回复
20
zhjb1| | 2023-2-2 10:59 | 只看该作者
本帖最后由 zhjb1 于 2023-2-2 11:02 编辑

楼主,您好!
我的问题与您的一样,读出的数据无论设定PAGE=00,01,02,03,只有在PAGE=00读出的是0x75,测试其他LCD Id,比如93xx,5345,9481,等等都正常,最后只好定义读出为0x75 则定义lcd ID=0x8347,以后就都正常了.可以显示字符,数字,画圆,画方等等.
我这款LCD是8位数据口.LCD320X240 dots
谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

86

帖子

1

粉丝