|

楼主 |
发表于 2016-9-14 13:35:25
|
显示全部楼层
回 eric2013 的帖子
eric2013:应该是底层的读写函数和格式化函数有点问题,这两个函数单独测试过没有,还有就是读取过这个NAND的ID没有,看看能否正确读取出来,要先保证你的底层函数是没问题的。 (2016-09-13 10:06)  搞定了,首先是初始化有问题,现在初始化改为:
static void FSMC_NAND_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NANDInitTypeDef FSMC_NANDInitStructure;
FSMC_NAND_PCCARDTimingInitTypeDef p;
/*--NAND Flash GPIOs ÅäÖÃ ------
PD0/FSMC_D2
PD1/FSMC_D3
PD4/FSMC_NOE
PD5/FSMC_NWE
PD7/FSMC_NCE2
PD11/FSMC_A16
PD12/FSMC_A17
PD14/FSMC_D0
PD15/FSMC_D1
PE7/FSMC_D4
PE8/FSMC_D5
PE9/FSMC_D6
PE10/FSMC_D7
PD6/FSMC_NWAIT (±¾ày3ìóÃ2éÑˉ·½ê½ÅDÃ|£¬′Ë¿úÏß×÷ÎaÆÕí¨GPIOêäèë1|Äüê1óÃ)
*/
/* ê1Äü GPIO ê±Öó */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE, ENABLE);
/* ê1Äü FSMC ê±Öó */
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
/*FSMC CLE, ALE, D0->D3, NOE, NWE and NCE23õê¼»ˉ£¬íÆíì¸′óÃêä3ö*/
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 |
GPIO_Pin_7 | GPIO_Pin_11 |GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* GPIOE configuration */
GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 |GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/*--------------FSMC ×üÏß ′æ′¢Æ÷2ÎêyÅäÖÃ------------------------------*/
p.FSMC_SetupTime = 0x0; //½¨á¢ê±¼ä
p.FSMC_WaitSetupTime = 0x4; //μè′yê±¼ä
p.FSMC_HoldSetupTime = 0x2; //±£3Öê±¼ä
p.FSMC_HiZSetupTime = 0x0; //¸ß×轨á¢ê±¼ä
FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND; //ê1óÃFSMC BANK2
FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable; //ê1ÄüFSMCμÄμè′y1|Äü
FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b; //NAND FlashμÄêy¾Y¿í¶èÎa8λ
FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable; //ê1ÄüECCìØDÔ
FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_2048Bytes; //ECCò3′óD¡2048
FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x00;
FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x00;
FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p;
FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;
FSMC_NANDInit(&FSMC_NANDInitStructure);
/* FSMC NAND Bank ê1Äü */
FSMC_NANDCmd(FSMC_Bank2_NAND, ENABLE);
}
然后这个函数改为:
static U32 Init (NAND_DRV_CFG *cfg) {
/* Define spare area layout */
cfg-> gLay-> os_LSN = 0;
cfg-> gLay-> os_COR = 4;
cfg-> gLay-> os_BBM = 5;
cfg-> gLay-> os_ECC = 6;
/* Define page organization */
cfg-> gLay->SectInc = 512;
cfg-> gLay->SpareOfs = 4096;
cfg->PgLay->SpareInc = 16;
NAND_Init();
return RTV_NOERR;
}
再然后是擦除块那个函数static uint8_t FSMC_NAND_EraseBlock(uint32_t _ulBlockNo)也要增加一个等待busy引脚(我的等待busy引脚是D6,例程是G6):
while(GPIO_ReadInputDataBit(FSMC_NWAIT_PORT, FSMC_NWAIT_PIN) == 0);
其他就是修改一些细节。
谢谢你们的例程还有你的回复,谢谢! |
|