OpenEdv-开源电子网

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

请教原子哥---STM32的FSMC问题

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-5-10
在线时间
0 小时
发表于 2012-5-16 17:04:18 | 显示全部楼层 |阅读模式

 我用FSMC库驱动3.5寸的TFTLCD,打印出的ID是600f,有时是620f,我的是液晶是SSD1289. 这个是不是FSMC的配置还没配置好? 我是这样配置的,应该是没问题的。可ID老是读不出8989


 

void LCD_CtrlLinesConfig(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* 使能 FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO 时钟 */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
                         RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |
                         RCC_APB2Periph_AFIO, ENABLE);

  /* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),
     PD.10(D15), PD.14(D0), PD.15(D1) as alternate function push pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
                                GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |
                                GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
     PE.14(D11), PE.15(D12) as alternate function push pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
                                GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
                                GPIO_Pin_15;
  GPIO_Init(GPIOE, &GPIO_InitStructure);
 
  /* Set PF.00(A0 (RS)) as alternate function push pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_Init(GPIOF, &GPIO_InitStructure);
 
  /* Set PG.12(NE4 (LCD/CS)) as alternate function push pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
}


/**
  * @brief  Configures the Parallel interface (FSMC) for LCD(Parallel mode)
  * @param  None
  * @retval : None
  */
void LCD_FSMCConfig(void)
{
  FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef  p;
/*-- FSMC Configuration ------------------------------------------------------*/
/*----------------------- SRAM Bank 4 ----------------------------------------*/
  /* FSMC_Bank1_NORSRAM4 configuration */
  p.FSMC_AddressSetupTime = 1;//地址建立时间
  p.FSMC_AddressHoldTime = 0;//地址保持时间
  p.FSMC_DataSetupTime = 2;//数据建立时间
  p.FSMC_BusTurnAroundDuration = 0;//1;//0;
  p.FSMC_CLKDivision = 0;//0;
  p.FSMC_DataLatency = 0;//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_NORSRAM4;     
 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 4 (of NOR/SRAM Bank) is enabled */
  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
}

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-16 17:16:58 | 显示全部楼层
8989在读ID的时候,需要比较慢的速度,你把
 p.FSMC_AddressSetupTime = 1;//地址建立时间
  p.FSMC_AddressHoldTime = 0;//地址保持时间
  p.FSMC_DataSetupTime = 2;//数据建立时间
改大一点看看。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-5-10
在线时间
0 小时
 楼主| 发表于 2012-5-16 17:22:00 | 显示全部楼层
回复【2楼】正点原子:
-  p.FSMC_AddressSetupTime = 10;//地址建立时间
  p.FSMC_AddressHoldTime = 10;//地址保持时间
  p.FSMC_DataSetupTime = 20;//数据建立时间
改成这样了,还是一样,
1,0,2别人调试过可以的
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-5-10
在线时间
0 小时
 楼主| 发表于 2012-5-16 17:22:36 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥这么快回复,真是感动,要常来这
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-16 17:30:12 | 显示全部楼层
单个IO测试一下看看。
也就是IO逐个接高,逐个接地试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
发表于 2014-2-15 10:37:11 | 显示全部楼层
原子哥,就是那些地址建立时间什么的一大堆时间不知道怎么设置,看ST的FSMC手册吧,看不懂。。。但是看了F407的手册后,发现配置与手册不一致,人家有最小值,但好多人的配置都比这个小,



不知道这个是怎么设置的~原子哥会不会配置这个,教一下~SSD1289



回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-15 10:57:44 | 显示全部楼层
回复【6楼】正点电子01:
---------------------------------
时间得根据你接的外部器件来设置,不同的器件速度不一样,时间设置就可能有区别了.
至于别人设置的比这个小,你看看寄存器值,是否真比这个小吧.不要单看名字.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

46

主题

333

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2013-12-12
在线时间
63 小时
发表于 2014-2-15 11:47:21 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,你好~
你的意思是让我看SSD1289的资料么?
由于调不出现象来,我看了许多别人写的SS1289的程序,发现我和他们的初始化不太一样,但是我的这个也是别人给的F207,麻烦你看看:
void LCD_Init(void)
{
/* 配置LCD控制口线GPIO */
LCD_CtrlLinesConfig();

/* 配置FSMC接口,数据总线 */
LCD_FSMCConfig();

/* FSMC重置后必须加延迟才能访问总线设备  */
LCD_Delay(200000);

    LCD_WriteReg(0x0000,0x0001); //打开晶振
LCD_Delay(10);
    LCD_WriteReg(0x0003,0xA8A4); //0xA8A4
LCD_Delay(10);
    LCD_WriteReg(0x000C,0x0000);
LCD_Delay(10);   
    LCD_WriteReg(0x000D,0x080C);
LCD_Delay(10);   
    LCD_WriteReg(0x000E,0x2B00);
LCD_Delay(10);   
    LCD_WriteReg(0x001E,0x00B0);
LCD_Delay(10);   
    LCD_WriteReg(0x0001,0x6B3F); //驱动输出控制320*240  0x6B3F 0x2B3F
LCD_Delay(10);
    LCD_WriteReg(0x0002,0x0600);
LCD_Delay(10);
    LCD_WriteReg(0x0010,0x0000);
LCD_Delay(10);
    LCD_WriteReg(0x0011,0x6068); //定义数据格式  16位色 
LCD_Delay(10);
    LCD_WriteReg(0x0005,0x0000);
LCD_Delay(10);
    LCD_WriteReg(0x0006,0x0000);
LCD_Delay(10);
    LCD_WriteReg(0x0016,0xEF1C);
LCD_Delay(10);
    LCD_WriteReg(0x0017,0x0003);
LCD_Delay(10);
    LCD_WriteReg(0x0007,0x0233);
LCD_Delay(10);
    LCD_WriteReg(0x000B,0x0000);
LCD_Delay(10);
    LCD_WriteReg(0x000F,0x0000); //扫描开始地址
LCD_Delay(10);
    LCD_WriteReg(0x0041,0x0000);
LCD_Delay(10);
    LCD_WriteReg(0x0042,0x0000);
LCD_Delay(10);
    LCD_WriteReg(0x0048,0x0000);
LCD_Delay(10);
    LCD_WriteReg(0x0049,0x013F);
LCD_Delay(10);
    LCD_WriteReg(0x004A,0x0000);
LCD_Delay(10);
    LCD_WriteReg(0x004B,0x0000);
LCD_Delay(10);
    LCD_WriteReg(0x0044,0xEF00);
LCD_Delay(10);
    LCD_WriteReg(0x0045,0x0000);
LCD_Delay(10);
    LCD_WriteReg(0x0046,0x013F);
LCD_Delay(10);
    LCD_WriteReg(0x0030,0x0707);
LCD_Delay(10);
    LCD_WriteReg(0x0031,0x0204);
LCD_Delay(10);
    LCD_WriteReg(0x0032,0x0204);
LCD_Delay(10);
    LCD_WriteReg(0x0033,0x0502);
LCD_Delay(10);
    LCD_WriteReg(0x0034,0x0507);
LCD_Delay(10);
    LCD_WriteReg(0x0035,0x0204);
LCD_Delay(10);
    LCD_WriteReg(0x0036,0x0204);
LCD_Delay(10);
    LCD_WriteReg(0x0037,0x0502);
LCD_Delay(10);
    LCD_WriteReg(0x003A,0x0302);
LCD_Delay(10);
    LCD_WriteReg(0x003B,0x0302);
LCD_Delay(10);
    LCD_WriteReg(0x0023,0x0000);
LCD_Delay(10);
    LCD_WriteReg(0x0024,0x0000);
LCD_Delay(10);
    LCD_WriteReg(0x0025,0x8000);
LCD_Delay(10);
    LCD_WriteReg(0x004f,0x0000); //行首址0
LCD_Delay(10);
    LCD_WriteReg(0x004e,0x0000); //列首址0
LCD_Delay(10);

    Lcd_Write_Com(0x0022);

LCD_WriteReg(0x00, 0x0001);
LCD_WriteReg(0x02, 0x0600); 
LCD_WriteReg(0x0C, 0x0007);
LCD_WriteReg(0x0D, 0x0006); 
LCD_WriteReg(0x0E, 0x3200);
LCD_WriteReg(0x1E, 0x00BB);
LCD_WriteReg(0x03, 0x6A64); 

LCD_WriteReg(0x0F, 0x0000);
LCD_WriteReg(0x44, 0xEF00);
LCD_WriteReg(0x45, 0x0000);
LCD_WriteReg(0x46, 0x013F);
LCD_WriteReg(0x30, 0x0000);
LCD_WriteReg(0x31, 0x0706);
LCD_WriteReg(0x32, 0x0206);
LCD_WriteReg(0x33, 0x0300);
LCD_WriteReg(0x34, 0x0002);
LCD_WriteReg(0x35, 0x0000);
LCD_WriteReg(0x36, 0x0707);
LCD_WriteReg(0x37, 0x0200);
LCD_WriteReg(0x3A, 0x0908);
LCD_WriteReg(0x3B, 0x0F0D);


LCD_WriteReg(0x28, 0x0006);
LCD_WriteReg(0x2F, 0x12EB);
LCD_WriteReg(0x26, 0x7000);
LCD_WriteReg(0x20, 0xB0E3); 
LCD_WriteReg(0x27, 0x0044); 
LCD_WriteReg(0x2E, 0x7E45);

LCD_WriteReg(0x10, 0x0000);
LCD_Delay(10);
}
中间的那些延时是必要的么?如果是必要的话,我从F207移植过来后,时间肯定是不对了,针对这种情况,不知道原子哥以前移植程序的时候怎么解决的!!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-15 21:23:37 | 显示全部楼层
回复【8楼】正点电子01:
---------------------------------
倒是没测试过是不是必须的,你如果觉得是delay的问题,可以加大一点试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 10:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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