佚名通过本文主要向大家介绍了stm32驱动nandflash,nandflash驱动,linux nandflash驱动,nandflash驱动下载,uboot nandflash驱动等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: STM32驱动NANDFLASH某些位出错
描述:
目前的错误现象:连续写三个块,大概有20个位置出错,每一个出错位置基本是分布在不同的页,也就是说一个页只会错一字节(1位、2位)。不清楚到底是什么原因引起的,我把各个保持时间,建立时间什么的都加大道0x32个系统时钟还是没什么效果,。系统采用STM32 的FSMC,72M系统时钟。
NAND FLASH型号:MT29F16G08CBACA
请给位帮忙看看
以下是按页读写操作
描述:
本帖最后由 u010149173 于 2014-11-17 10:49:51 编辑
stm32NANDFLASHMT29F16G08CBACA
现在需要做存储文件信息,没有做文件管理,ecc。目前的错误现象:连续写三个块,大概有20个位置出错,每一个出错位置基本是分布在不同的页,也就是说一个页只会错一字节(1位、2位)。不清楚到底是什么原因引起的,我把各个保持时间,建立时间什么的都加大道0x32个系统时钟还是没什么效果,。系统采用STM32 的FSMC,72M系统时钟。
NAND FLASH型号:MT29F16G08CBACA
请给位帮忙看看

void FSMC_NAND_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NANDInitTypeDef FSMC_NANDInitStructure;
FSMC_NAND_PCCARDTimingInitTypeDef p;
/* Enable the FSMC Clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
/*-- GPIO Configuration ------------------------------------------------------*/
/* CLE, ALE, D0->D3, NOE, NWE and NCE2 NAND pin configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15 |
GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* D4->D7 NAND pin configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* NWAIT NAND pin configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* INT2 NAND pin configuration */
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
// GPIO_Init(GPIOG, &GPIO_InitStructure);
/*-- FSMC Configuration ------------------------------------------------------*/
p.FSMC_SetupTime =0X01;//0x1;// 0x07;//
p.FSMC_WaitSetupTime =0X03;// 0x3;//0x07;//
p.FSMC_HoldSetupTime = 0X02;//0x2;//0x07;//
p.FSMC_HiZSetupTime = 0X01;//0x1;//0x07;//
FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND;
FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable;
FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable;
FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_4096Bytes;
// FSMC_NANDInitStructure.FSMC_AddressLowMapping = FSMC_AddressLowMapping_Direct;
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 Cmd Test */
FSMC_NANDCmd(FSMC_Bank2_NAND, ENABLE);
}
void FlashWait()
{
while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6) == Bit_RESET);
}
以下是按页读写操作
u32 FSMC_NAND_WriteBigPage(u8 *pBuffer, u32 PageAddress, u32 NumPageToWrite)
{
u32 index = 0x00, numpagewritten = 0x00, addressstatus = NAND_VALID_ADDRESS;
u32 status = NAND_READY, size = 0x00;
while((NumPageToWrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY))
{
/* Page write command and address */
*(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_PAGEPROGRAM;
*(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = 0;
*(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = 0;
*(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(PageAddress);
*(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(PageAddress);
*(vu8 *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(PageAddress);
/* Calculate the size */
size = NAND_PAGE_SIZE;//NAND_PAGE_SIZE +6;// (NAND_PAGE_SIZE * numpagewritten);
/* Write data */
for(; index < size; index++)
{
*(vu8 *)(Bank_NAND_ADDR | DATA_AREA) = pBuffer[index];
}
*(vu8 *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE_TRUE1;
/* Check status for successful operation */
status = FSMC_NAND_GetStatus();
if(status == NAND_READY)
{
numpagewritten++;
NumPageToWrite--;
/* Calculate Next small page Address */
if(PageAddress++ > (NAND_MAX_ZONE*NAND_ZONE_SIZE*NAND_BLOCK_SIZE))
&nbs