本帖最后由 lhy317409772 于 2015-1-9 09:00 编辑
该问题已经卡住项目不动近半个多月,真诚的希望大家能够给些意见。
问题描述如下:
硬件采用STM32作为主控,PCL6045BL作为运控,之间采用FSMC的PCCard模式进行通讯,16位地址总线,FSMC_A[4:1]---PCL_A[4:1],基地址为0x90000000,写指令为#define outpw(address,data) (*(unsigned short *)(address)=(data))....
问题是,数据总线呈现出来的高低电平为正确的,但是4位地址总线的电平是错误的,错误的方式为,相邻地址的最高位的电平输出不足3.3V,大概为2V左右,而较低位的地址输出则是正确的3.3V。 由于只有个别地址输出电平不足,因此猜测还是软件配置问题。
我的FSMC所有配置如下:
1.时钟配置(72MHz)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_Div2, RCC_PLLMul_12); // 设置PLL时钟源及倍频系数 8/2*12 = 48MHz
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作为系统时钟
}
}
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);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 串口1,PC通讯
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 串口2, 预留通讯接口
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); // 串口3,显示屏通讯
}
2.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_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配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_0;
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);
3.FSMC配置
void FSMC_Configuration(void)
{
FSMC_PCCARDInitTypeDef FSMC_PCCARDInitStructure;
FSMC_NAND_PCCARDTimingInitTypeDef p;
// FSMC 时间配置
p.FSMC_SetupTime = 0x02;
p.FSMC_WaitSetupTime = 0x04;
p.FSMC_HoldSetupTime = 0x02;
p.FSMC_HiZSetupTime = 0x03;
// 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
}
以上。
但是通讯一直都建立不起来,请有过相关经验的网友给些指导,非常感谢。 |