新手入门
- 积分
- 9
- 金钱
- 9
- 注册时间
- 2024-12-5
- 在线时间
- 2 小时
|
2金钱
使用F429的FMC驱动IS61WV102416BLL芯片。
现在问题是不能正常读写,摆脱大佬帮我看看问题出现在哪里。已经调了一个周了,一直没找到原因
下边是程序源码
#define Bank1_SRAM3_ADDR ((u32)(0x68000000))
void FSMC_SRAM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
FMC_NORSRAMInitTypeDef FMC_NORSRAMInitStructure;
FMC_NORSRAMTimingInitTypeDef readWriteTiming;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG时钟
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC,ENABLE);//使能FSMC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource2|GPIO_PinSource3|GPIO_PinSource4|GPIO_PinSource5|GPIO_PinSource12|GPIO_PinSource13|GPIO_PinSource14|GPIO_PinSource15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化
GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource2|GPIO_PinSource3|GPIO_PinSource4|GPIO_PinSource5|GPIO_PinSource10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化
GPIO_InitStructure.GPIO_Pin = GPIO_PinSource11|GPIO_PinSource12|GPIO_PinSource13|GPIO_PinSource14|GPIO_PinSource15|GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource8|GPIO_PinSource9|GPIO_PinSource10|GPIO_PinSource4|GPIO_PinSource5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化
//
GPIO_InitStructure.GPIO_Pin = GPIO_PinSource0|GPIO_PinSource1|GPIO_PinSource3|GPIO_PinSource7|GPIO_PinSource8|GPIO_PinSource9|GPIO_PinSource10|GPIO_PinSource11|GPIO_PinSource12|GPIO_PinSource13|GPIO_PinSource14|GPIO_PinSource15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource0,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource1,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource3,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource0,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource1,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource2,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource3,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource4,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource5,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOG,GPIO_PinSource10,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource0,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource1,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource2,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource3,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource4,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource5,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource13,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource14,GPIO_AF_FMC);
GPIO_PinAFConfig(GPIOF,GPIO_PinSource15,GPIO_AF_FMC);
readWriteTiming.FMC_AddressSetupTime =1; //地址建立时间(ADDSET)
readWriteTiming.FMC_DataSetupTime = 2; ////数据建立时间(DATAST)
readWriteTiming.FMC_AddressHoldTime = 0; //地址保持时间
readWriteTiming.FMC_BusTurnAroundDuration = 0;
readWriteTiming.FMC_CLKDivision = 0;
readWriteTiming.FMC_DataLatency = 0;
readWriteTiming.FMC_AccessMode = FMC_AccessMode_A; //模式A
// WriteTiming.FMC_AddressSetupTime = 0; //地址建立时间(ADDSET)
// WriteTiming.FMC_DataSetupTime = 3; ////数据建立时间(DATAST)
// WriteTiming.FMC_AddressHoldTime = 0; //地址保持时间
// WriteTiming.FMC_BusTurnAroundDuration = 0;
// WriteTiming.FMC_CLKDivision = 0;
// WriteTiming.FMC_DataLatency = 0;
// WriteTiming.FMC_AccessMode = FMC_AccessMode_A; //模式A
FMC_NORSRAMInitStructure.FMC_Bank = FMC_Bank1_NORSRAM3;
FMC_NORSRAMInitStructure.FMC_DataAddressMux = FMC_DataAddressMux_Disable;
FMC_NORSRAMInitStructure.FMC_MemoryType = FMC_MemoryType_SRAM;
FMC_NORSRAMInitStructure.FMC_MemoryDataWidth = FMC_NORSRAM_MemoryDataWidth_16b;
FMC_NORSRAMInitStructure.FMC_BurstAccessMode = FMC_BurstAccessMode_Disable;
FMC_NORSRAMInitStructure.FMC_AsynchronousWait = FMC_AsynchronousWait_Disable;
FMC_NORSRAMInitStructure.FMC_WaitSignalPolarity = FMC_WaitSignalPolarity_Low;
FMC_NORSRAMInitStructure.FMC_WrapMode = FMC_WrapMode_Disable;
FMC_NORSRAMInitStructure.FMC_WaitSignalActive = FMC_WaitSignalActive_BeforeWaitState;
FMC_NORSRAMInitStructure.FMC_WriteOperation = FMC_WriteOperation_Enable;
FMC_NORSRAMInitStructure.FMC_WaitSignal = FMC_WaitSignal_Disable;
FMC_NORSRAMInitStructure.FMC_ExtendedMode = FMC_ExtendedMode_Disable;
FMC_NORSRAMInitStructure.FMC_WriteBurst = FMC_WriteBurst_Disable;
FMC_NORSRAMInitStructure.FMC_ContinousClock = FMC_CClock_SyncOnly;
FMC_NORSRAMInitStructure.FMC_ReadWriteTimingStruct = &readWriteTiming;
FMC_NORSRAMInitStructure.FMC_WriteTimingStruct = &readWriteTiming;
FMC_NORSRAMInit(&FMC_NORSRAMInitStructure); //初始化FSMC配置
FMC_NORSRAMCmd(FMC_Bank1_NORSRAM3, ENABLE); // 使能BANK1区域3
}
//在指定地址(WriteAddr+Bank1_SRAM3_ADDR)开始,连续写入n个字节.
//pBuffer:字节指针
//WriteAddr:要写入的地址
//n:要写入的字节数
void FMC_SRAM_WriteBuffer(u16* pBuffer,u32 WriteAddr,u32 n)
{
for(;n!=0;n--)
{
*(vu16*)(Bank1_SRAM3_ADDR+WriteAddr)=*pBuffer++;
WriteAddr+=2;
}
}
//在指定地址((WriteAddr+Bank1_SRAM3_ADDR))开始,连续读出n个字节.
//pBuffer:字节指针
//ReadAddr:要读出的起始地址
//n:要写入的字节数
void FMC_SRAM_ReadBuffer(u16* pBuffer,u32 ReadAddr,u32 n)
{
for(;n!=0;n--)
{
*pBuffer++=*(vu16*)(Bank1_SRAM3_ADDR+ReadAddr);
ReadAddr+=2;
}
}
//外部内存测试(最大支持2M字节内存测试)
void fmc_sram_test(void)
{
u32 i=0;
u16 temp=0;
for(i=0;i<1024*1024*2*2;i+=2048)
{
FMC_SRAM_WriteBuffer(&temp,i,1);
temp++;
}
temp = 0;
//依次读出之前写入的数据
for(i=0;i<1024*1024*2*2;i+=2048)
{
FMC_SRAM_ReadBuffer(&temp,i,1);
printf("%d\r\n",temp);
}
}
下面是芯片时序手册
 
程序执行结果
 
|
|