FSMC配置问题,希望有经验前辈指点迷津。

2019-10-11 16:08发布

项目中使用STM32F103Ze的FSMC进行并行通讯,但是建立不起来...
   最近又做实验,发现有如下现象:
由于一直用PCCard建立不起来,于是我尝试使用SRAM,我把相应端口配置了之后,再把FSMC配置成SRAM模式,然后我去测片选CS 写使能NWE 读使能NOE 
实验结果为:写的时候 CS拉低 NOE 拉高 NWE 拉低  读的时候 CS拉低 NOE拉低 NWE拉高....表现正常。
但是当我配置回PCCard模式的时候,
实验结果为:写的时候CS拉低 NOE拉高到3.1   NWE竟然也拉高到2.4   读的时候CS拉低 NOE拉高到2.4  NWE拉高到3.1   表明电压不够低已使相应端口进行使能,即读写全部失能,所以无法读写。有意思的是,虽然全部失能,但是当我分别进行读写操作的时候,读写端NWE和NOE的高低端竟然也会进行调换。
因此,我推测可能还是我PCCard的配置没有到位,但是不知道应该如何配置了.....请前辈给写指导。

如下为我的配置代码:
1. 时钟配置
  1. void RCC_HSE_Configuration(void)
  2. {
  3.         RCC_DeInit();                              //  将外设RCC寄存器重设为缺省值   
  4.         RCC_HSEConfig(RCC_HSE_ON);                 //  设置HSE晶振打开
  5.         if(RCC_WaitForHSEStartUp() == SUCCESS)     //  等待HSE起振,SUCCESS:HSE晶振稳定且就绪
  6.         {
  7.                 RCC_HCLKConfig(RCC_SYSCLK_Div1);     //  设置AHB时钟(HCLK)RCC_SYSCLK_DIV1:系统时钟1分频 AHB时钟=系统时钟
  8.                 RCC_PCLK2Config(RCC_HCLK_Div1);      //  设置高速AHB时钟APB(PCLK2) // RCC_HCLK_Div1:HCLK1分频,APB2时钟=HCLK
  9.                 RCC_PCLK1Config(RCC_HCLK_Div2);      //  设置低速AHB时钟APB1(PCLK1) RCC_HCLK_Div2:HCLK2分频,APB1时钟=HCLK/2
  10.                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);   //  设置PLL时钟源及倍频系数  8/1*9 = 72MHz
  11.                 RCC_PLLCmd(ENABLE);                                     //  使能PLL
  12.                 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);     //  检查指定的RCC标志位(PLL准备好标志)设置与否
  13.                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);              //  设置系统时钟(SYSCLK)
  14.                 while(RCC_GetSYSCLKSource() != 0x08);                   //  0x08LL作为系统时钟
  15.         }
  16. }
复制代码 2.时钟使能
  1. void RCC_Configuration(void)
  2. {
  3. //        SystemInit();
  4.         RCC_HSE_Configuration();
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |  
  6.                                                    RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);     //  端口的复用功能使能打开
  8.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);                 //  FSMC时钟
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);         //  串口1,PC通讯
  10.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);         //  串口2, 预留通讯接口
  11.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);         //  串口3,显示屏通讯
  12. }
复制代码 3.GPIO配置
  1. // FSMC端口初始化
  2.         /* 数据总线端口IO配置 */
  3.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_0  | GPIO_Pin_1  | 
  4.                                       GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10;
  5.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  6.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  7.         GPIO_Init(GPIOD, &GPIO_InitStructure);
  8.         
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7  | GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10 |
  10.                                       GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 |
  11.                                       GPIO_Pin_14 | GPIO_Pin_15;
  12.         GPIO_Init(GPIOE, &GPIO_InitStructure);

  13.         /* 地址总线端口IO配置 */         
  14.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
  15. //        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  16. //        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.         GPIO_Init(GPIOF, &GPIO_InitStructure);

  18.         /* NOE and NWE IO配置 */
  19.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
  20.         GPIO_Init(GPIOD, &GPIO_InitStructure);

  21.         /* NCE4_1  IO配置 */   //  测试:NCE_4_2  和  NE_2                                                                        
  22.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_9;
  23.         GPIO_Init(GPIOG, &GPIO_InitStructure);        
  24.         
  25.         /* NWAIT 信号配置 */                
  26.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  27.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  28.         GPIO_Init(GPIOD, &GPIO_InitStructure);

  29.         /*FSMC_NIOS16端配置*/
  30.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  31.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  32.         GPIO_Init(GPIOF, &GPIO_InitStructure);
复制代码 4.FSMC配置
void FSMC_Configuration(void)
{
        FSMC_PCCARDInitTypeDef FSMC_PCCARDInitStructure;
        FSMC_NAND_PCCARDTimingInitTypeDef p;

//  FSMC 时间配置
        p.FSMC_SetupTime = 0x0f;
        p.FSMC_WaitSetupTime = 0x0f;
        p.FSMC_HoldSetupTime = 0x0f;
        p.FSMC_HiZSetupTime = 0x0f;

//  FSMC工作参数配置
        FSMC_PCCARDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable;       //  等待功能使能
        FSMC_PCCARDInitStructure.FSMC_TCLRSetupTime = 0x10;                                               //  CLE(命令锁存使能)到RE的延迟
        FSMC_PCCARDInitStructure.FSMC_TARSetupTime = 0x10;                                                    //  ALE(地址锁存使能)到RE的延迟
        FSMC_PCCARDInitStructure.FSMC_CommonSpaceTimingStruct = &p;                               //  指令空间时间
        FSMC_PCCARDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;                       //  属性空间时间
        FSMC_PCCARDInitStructure.FSMC_IOSpaceTimingStruct = &p;                                       //  IO空间时间           

        FSMC_PCCARDInit(&FSMC_PCCARDInitStructure);                                //  CCARD Init     函数内部定义为了16为数据宽度
        FSMC_PCCARDCmd(ENABLE);                                                    //  enable PCCARD model         PCR4[2] = 1
}


另外还有我们的硬件接线如下:
16位PC卡 
FSMC信号名称  输入/输出   功能 
A[10:0]        输出     地址总线 
NIOS16         输入     I/O空间的数据传输宽度(仅适合16位传输) 
NIORD          输出     I/O空间的输出使能 
NIOWR          输出     I/O空间的写使能 
NREG           输出     指示操作是在通用或属性空间的寄存器信号 
D[15:0]        入/出    双向数据总线 
NCE4_1         输出     片选1 
NCE4_2         输出     片选2(指示操作是16位还是8位) 
NOE            输出     输出使能 
NWE            输出     写使能 
NWAIT          输入     进入FSMC的PC卡等待信号(存储器信号为IORDY) 
INTR           输入     进入FSMC的PC卡中断信号(仅适合可以产生中断的PC卡) 
CD             输入     C卡存在的检测信号

以上是用户手册要求的16PCCard的链接要求,而我们实际中使用了A[4:1] NIOS16 D[15:0] NCE4_1 NOE NWE NWAIT  其他端子均没有使用......

希望大神参看一下程序,给写指导意见,非常感谢...
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
15条回答
MichealLee
2019-10-12 18:36
回复【6楼】正点原子:
---------------------------------
我们的FSMC通讯选择的是PCCard模式,关于FSMC的PCard和NAND Flash的操作,请问您熟悉不熟悉?
我有个疑问是,能够帮我解释一下数据手册上的这句话:“当在I/O模式下使用PC卡或CF卡,在整个操作期间NIOS16输入引脚必须保持接地电平,否则FSMC可能不能正常操作。即NIOS16输入引脚一定不能连接到卡上,但可以直接接地(仅允许16位访问)。 ----STM32官方手册 19.6.1”
其中的“在I/O模式下使用”是什么意思?PCard的配置存储器也是分了三类:通用,属性,I/O,这是否表示在使用PCard的时候需要手动选择某种模式,然后再进行配置,使得FSMC的读写时序符合外部芯片的读写时序??

一周热门 更多>