打印

STM32通过FSMC控制LCD的问题

[复制链接]
7610|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zq1987731|  楼主 | 2009-8-15 16:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近做点小东西时用到了压箱底N久的一块屏(SED1335控制器,320×240单色),我将其挂在FSMC总线上,然后配置FSMC总线时用到如下子程序:

=========================我是分割线=========================
    void FSMC_Configuration(void)
    {
        GPIO_InitTypeDef                GPIO_InitStructure;
        FSMC_NORSRAMTimingInitTypeDef   FSMC_NORSRAMTimingInitStructure;
        FSMC_NORSRAMInitTypeDef         FSMC_NORSRAMInitStructure;
    RCC_APB2PeriphClockCmd(          RCC_APB2Periph_GPIOD
                                     | RCC_APB2Periph_GPIOE
          | RCC_APB2Periph_GPIOF
          | RCC_APB2Periph_GPIOG, ENABLE);
        GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode    = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_0            // PD.0     →  D2
                                        | GPIO_Pin_1            // PD.1     →  D3
                                        | GPIO_Pin_4            // PD.4     →  NOE
                                        | GPIO_Pin_5            // PD.5     →  NWE
                                        | 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_Init(GPIOE, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_0;           // PF.0     →   A0
        GPIO_Init(GPIOF, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_12;          // PG.12    →   NE4
        GPIO_Init(GPIOG, &GPIO_InitStructure);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
        // Set the BANK and the chip select signal
        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;   
        // Set whether the data bus and address bus time-multiplexing
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
        // Set the type of memory
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
        // Data width settings
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
        // Set whether to use burst mode access
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
        // Set up "WAIT" an effective signal level
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        // Set whether to use loop-back mode
        FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
        // Set "WAIT" signal the effective time
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
        // Set whether to "write" operation
        FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
        // Set whether or not to use "WAIT" signal
        FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
        // Set whether or not to use an independent "write" timing
        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
        // Set whether to use burst mode to write
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
        // Set up "reading" & "write" timing
  FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime       = 0;       // ADDSET
        FSMC_NORSRAMTimingInitStructure.FSMC_AddressHoldTime        = 0;       // ADDHOLD
        FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime          = 7;      // DATAST
        FSMC_NORSRAMTimingInitStructure.FSMC_BusTurnAroundDuration  = 0;      // BUSTURN
        FSMC_NORSRAMTimingInitStructure.FSMC_CLKDivision            = 0;      // CLKDIV
        FSMC_NORSRAMTimingInitStructure.FSMC_DataLatency            = 0;      // DATLAT
        FSMC_NORSRAMTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A;    // ACCMOD
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_NORSRAMTimingInitStructure;
        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
    }
=========================我是分割线=========================
    然后向LCD总线读写时要搞成这样才正确(拿写命令的子程序举例):

    __inline void LCD_Write_Control_Byte(UINT32 DATA)
    {   
        UINT32 i;
  i = 7; while(i--);    // 这个延时如果不加,那显示就出错
  *((volatile UINT8 * )0x6C000001) = DATA;
    }
=========================我是分割线=========================
    现在有一点没搞明白...我看人家的例程都是直接读写丝毫不见延时痕迹的,而我的却要用i = 7; while(i--);这样的延时才能显示正常,这是怎么回事呢?屏的关系么?还是FSMC总线写入需要时间,上一个操作还没完成我下一个数据又送过去了?另外这句延时是否和上面FSMC配置中FSMC_NORSRAMTimingInitStructure.FSMC_DataSetupTime          = 7;      // DATAST
有所关联??
沙发
zq1987731|  楼主 | 2009-8-17 20:10 | 只看该作者
自己顶..

使用特权

评论回复
板凳
acteler| | 2009-8-17 20:24 | 只看该作者
这个肯定会用到,希望香主支持一下...

使用特权

评论回复
地板
香水城| | 2009-8-17 21:08 | 只看该作者
要看你那个SED1335控制器的时序才能知道问题在哪里。

使用特权

评论回复
5
soft_wind| | 2009-8-18 08:53 | 只看该作者
香版说得对,需要看时序图,上面对各个信号的长短有要求。
也可以试着修改FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime参数,先改个大一点儿的值比如说10,再慢慢往下减。我以前连过,没太大问题。

使用特权

评论回复
6
zq1987731|  楼主 | 2009-8-18 20:39 | 只看该作者
FSMC_NORSRAMTimingInitStructure.FSMC_AddressSetupTime这个参数...我修改成0是因为这时候屏照样能工作....
各位非常抱歉,本人语言表达能力实在有限,现在把问题换成如下形式:

    首先假设在FSMC上向外部设备读、写数据各需要10个周期(根据时序图配置好了FSMC),
    然后假设从绝对地址处(这里的绝对地址位于SRAM上)读、写数据各需要1个周期,
    那么在程序中是不加任何延时的从绝对地址(这里的绝对地址是外设地址了)取出一个数据,然后再写回去是2个周期还是要20个周期??
    用程序表达就是如下两段:
====================第一段====================
*((volatile UINT8 * )0x6C000001) = W_DATA;
R_DATA = *((volatile UINT8 * )0x6C000001) ;
====================第二段====================
*((volatile UINT8 * )0x6C000001) = W_DATA;
死等9个周期的语句;     
R_DATA = *((volatile UINT8 * )0x6C000001) ;
死等9个周期的语句;

============================================
之所以这么问是因为我怀疑情况如第二段程序这样,写完一个数据要延时死等FSMC直到收/发完才能继续收/发下一个数据。

使用特权

评论回复
7
zq1987731|  楼主 | 2009-8-19 18:54 | 只看该作者
继续顶!

使用特权

评论回复
8
zq1987731|  楼主 | 2009-8-21 10:15 | 只看该作者
继续顶! !

使用特权

评论回复
9
mengyu2008| | 2010-4-24 09:09 | 只看该作者

使用特权

评论回复
10
zhongjru| | 2010-4-26 23:18 | 只看该作者
遇到过类似情况,SED1335芯片太慢,2次命令之间必须等待,最快的方式是检测1335的BUSY信号

使用特权

评论回复
11
王紫豪| | 2010-6-29 03:26 | 只看该作者
得检查 busy,等待他忙

使用特权

评论回复
12
wintonson| | 2010-9-18 19:36 | 只看该作者
我认为是1335的busy信号的问题!

使用特权

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

本版积分规则

95

主题

759

帖子

3

粉丝