项目中使用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. 时钟配置void RCC_HSE_Configuration(void)
{
RCC_DeInit(); // 将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON); // 设置HSE晶振打开
if(RCC_WaitForHSEStartUp() == SUCCESS) // 等待HSE起振,SUCCESS:HSE晶振稳定且就绪
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); // 设置AHB时钟(HCLK)RCC_SYSCLK_DIV1:系统时钟1分频 AHB时钟=系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1); // 设置高速AHB时钟APB(PCLK2) // RCC_HCLK_Div1:HCLK1分频,APB2时钟=HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); // 设置低速AHB时钟APB1(PCLK1) RCC_HCLK_Div2:HCLK2分频,APB1时钟=HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // 设置PLL时钟源及倍频系数 8/1*9 = 72MHz
RCC_PLLCmd(ENABLE); // 使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // 检查指定的RCC标志位(PLL准备好标志)设置与否
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // 设置系统时钟(SYSCLK)
while(RCC_GetSYSCLKSource() != 0x08); // 0x08:PLL作为系统时钟
}
}
2.时钟使能void RCC_Configuration(void)
{
// SystemInit();
RCC_HSE_Configuration();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 端口的复用功能使能打开
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); // FSMC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 串口1,PC通讯
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 串口2, 预留通讯接口
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); // 串口3,显示屏通讯
}
3.GPIO配置// FSMC端口初始化
/* 数据总线端口IO配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_0 | GPIO_Pin_1 |
GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
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);
/* 地址总线端口IO配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
/* NOE and NWE IO配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* NCE4_1 IO配置 */ // 测试:NCE_4_2 和 NE_2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_9;
GPIO_Init(GPIOG, &GPIO_InitStructure);
/* NWAIT 信号配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/*FSMC_NIOS16端配置*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
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); // PCCARD 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 输入 PC卡存在的检测信号
以上是用户手册要求的16PCCard的链接要求,而我们实际中使用了A[4:1] NIOS16 D[15:0] NCE4_1 NOE NWE NWAIT 其他端子均没有使用......
希望大神参看一下程序,给写指导意见,非常感谢... |