硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4780|回复: 3
收起左侧

[RL-FlashFS] 使用Rl-FlashFS文件系统出现挂载文件系统失败 (2:卷错误,挂载失败...

[复制链接]

4

主题

15

回帖

27

积分

新手上路

积分
27
QQ
发表于 2016-9-12 16:05:38 | 显示全部楼层 |阅读模式
我参考了“基于RL-FlashFS的F429驱动NAND Flash”的程序,移植到我的裸跑(不跑系统)的STM32F407上,NAND Flash是K9F8G08U0M三星的8Gbit空间,编译成功,但格式化时出现“挂载文件系统失败 (2:卷错误,挂载失败,对于FAT文件系统意味着无效的MBR,启动记录或者非FAT格式)”,窜口打印以下信息:

【0 - ViewNandCapacity】
正在进行低级格式化中....
低级格式化完成....
挂载文件系统失败 (2:卷错误,挂载失败,对于FAT文件系统意味着无效的MBR,启动记录或者非FAT格式)
挂载失败,NAND Flash需要进行FAT32格式化
正在进行FAT32格式化中....
格式化失败
------------------------------------------------------------------
Volume访问错误
NAND Flash剩余容量 =          0字节
卸载文件系统成功
NAND Flash总容量 =          0字节
NAND Flash的总扇区数 = 0
NAND Flash读扇区大小 = 512字节
NAND Flash写扇区大小 = 512字节
卸载成功
------------------------------------------------------------------

请问这可能是什么问题引起的呢?

        #define NAND_PAGE_SIZE             ((uint16_t)0x1000) /* 4 * 1024 bytes per page w/o Spare Area */
    #define NAND_BLOCK_SIZE            ((uint16_t)0x0040) /* 64 pages per block */
    #define NAND_ZONE_SIZE             ((uint16_t)0x1000) /* 4096 Block per zone */
    #define NAND_SPARE_AREA_SIZE       ((uint16_t)0x0080) /* last 128 bytes as spare area */
    #define NAND_MAX_ZONE              ((uint16_t)0x0001) /* 1 zones of 4096 block */

    /* 命令代码定义 */
    #define NAND_CMD_COPYBACK_A            ((uint8_t)0x00)        /* PAGE COPY-BACK 命令序列*/
    #define NAND_CMD_COPYBACK_B            ((uint8_t)0x35)
    #define NAND_CMD_COPYBACK_C            ((uint8_t)0x85)
    #define NAND_CMD_COPYBACK_D            ((uint8_t)0x10)

    //#define NAND_CMD_STATUS                ((uint8_t)0x70)        //读NAND Flash的状态字

    #define MAX_PHY_BLOCKS_PER_ZONE  4096 //每个区最大物理块号
    #define MAX_LOG_BLOCKS_PER_ZONE  4000 //每个区最大逻辑块号

    #define NAND_BLOCK_COUNT            4096 //1024 //块个数
    #define NAND_PAGE_TOTAL_SIZE        (NAND_PAGE_SIZE + NAND_SPARE_AREA_SIZE) //页面总大小
上面是关于nand flash相关大小的定义。

读写和擦除的写入地址时是按这样的:

        NAND_ADDR_AREA = _usAddrInPage;
    NAND_ADDR_AREA = (_usAddrInPage & 0x1F00) >> 8;
    NAND_ADDR_AREA = _ulPageNo;
    NAND_ADDR_AREA = (_ulPageNo & 0xFF00) >> 8;
    NAND_ADDR_AREA = (_ulPageNo & 0x030000) >> 16;

初始化是这样的:

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   
    */

    /* 使能GPIO时钟*/
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE, ENABLE);

    /* 使能FSMC时钟 */
    RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);

    /*  配置GPIOD */
    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_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_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_NOPULL;

    GPIO_Init(GPIOD, &GPIO_InitStructure);

    /*  配置GPIOE */
    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_NOPULL;
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    /*  配置GPIOD, PD6作为忙信息,配置为输入*/

    /* INT2 引脚配置为内部上拉输入,用于忙信号 */
    GPIO_InitStructure.GPIO_Pin = FSMC_NWAIT_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_Init(FSMC_NWAIT_PORT, &GPIO_InitStructure);

    /* 配置FSMC时序 */
    /*
        Defines the number of HCLK cycles to setup address before the command assertion for NAND-Flash
        read or write access  to common/Attribute or I/O memory space (depending on the memory space
        timing to be configured).This parameter can be a value between 0 and 0xFF.
    */
      //p.FSMC_SetupTime = 0x01;  ---- 01 err, 02 ok
      p.FSMC_SetupTime = 0x2;

    /*
        Defines the minimum number of HCLK cycles to assert the command for NAND-Flash read or write
        access to common/Attribute or I/O memory space (depending on the memory space timing to be
        configured). This parameter can be a number between 0x00 and 0xFF
    */
    //p.FSMC_WaitSetupTime = 0x03; ---- 03 err;  05 ok
    p.FSMC_WaitSetupTime = 0x5;

    /*
        Defines the number of HCLK clock cycles to hold address (and data for write access) after the
        command deassertion for NAND-Flash read or write access to common/Attribute or I/O memory space
         (depending on the memory space timing to be configured).
        This parameter can be a number between 0x00 and 0xFF
    */
    //p.FSMC_HoldSetupTime = 0x02;  --- 02 err  03 ok
    p.FSMC_HoldSetupTime = 0x3;

    /*
        Defines the number of HCLK clock cycles during which the databus is kept in HiZ after the start
        of a NAND-Flash  write access to common/Attribute or I/O memory space (depending on the memory
        space timing to be configured). This parameter can be a number between 0x00 and 0xFF
    */
    //p.FSMC_HiZSetupTime = 0x01;
    p.FSMC_HiZSetupTime = 0x1;


    FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND;                      /* 定义FSMC NAND BANK 号 */
    FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Disable;        /* 插入等待时序使能 */
    FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;    /* 数据宽度8bit */
    FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Disable;                         /* ECC错误检查和纠正功能失能 */
    FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_4096Bytes;    /* ECC 页面大小 */
    FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x01;                        /* CLE低和RE低之间的延迟,HCLK周期数 */
    FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x01;                        /* ALE低和RE低之间的延迟,HCLK周期数*/
    FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p;                /* FSMC Common Space Timing */
    FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;            /* FSMC Attribute Space Timing */

    FSMC_NANDInit(&FSMC_NANDInitStructure);

    /* FSMC NAND Bank使能 */
    FSMC_NANDCmd(FSMC_Bank2_NAND, ENABLE);
}

然后在File_Config.c里面定义以下:

// <e>NAND Flash Drive 0
// ===================
// <i>Enable NAND Flash Drive  [N0:]
#define NAND0_EN    1

//   <o&gtage size  <528=> 512 + 16 bytes
//                                 <1056=> 1024 + 32 bytes
//                 <2112=>2048 + 64 bytes
//                 <4224=>4096 + 128 bytes
//                 <8448=>8192 + 256 bytes
//   <i>Define program Page size in bytes (User + Spare area).
#define NAND0_PGSZ  4224

//   <o>Block Size <8=>8 pages <16=>16 pages <32=>32 pages
//                 <64=>64 pages <128=>128 pages <256=>256 pages
//   <i>Define number of pages in a block.
#define NAND0_PGCNT 64

//   <o>Device Size [blocks] <512-32768>
//   <i>Define number of blocks in NAND Flash device.
#define NAND0_BLCNT 4096

//   <o&gtage Caching <0=>OFF <1=>1 page <2=>2 pages <4=>4 pages
//                   <8=>8 pages <16=>16 pages <32=>32 pages
//   <i>Define number of cached Pages.
//   <i>Default: 4 pages
#define NAND0_CAPG  8

//   <o>Block Indexing <0=>OFF <1=>1 block <2=>2 blocks <4=>4 blocks
//                     <8=>8 blocks <16=>16 blocks <32=>32 blocks
//                     <64=>64 blocks <128=>128 blocks <256=>256 blocks
//   <i>Define number of indexed Flash Blocks.
//   <i>Increase this number for better performance.
//   <i>Default: 16 blocks
#define NAND0_CABL  16

//   <o>Software ECC <0=>None <1=>Hamming (SLC)
//   <i>Enable software ECC calculation only,
//   <i>if not supported by hardware.
#define NAND0_SWECC 1

//   <o>File System Cache <0=>OFF <1=>1 KB <2=>2 KB <4=>4 KB
//                        <8=>8 KB <16=>16 KB <32=>32 KB
//   <i>Define System Cache buffer size for file IO.
//   <i>Increase this number for faster r/w access.
//   <i>Default: 4 kB
#define NAND0_CASZ  8

//   <e>Relocate Cache Buffers
//   <i>Use this option to locate Cache buffers
//   <i>at specific address in RAM or SDRAM.
#define NAND0_RELOC 0

//     <o>Base address <0x0000-0xFFFFFE00:0x200>
//     <i>Define base address for Cache Buffers.
#define NAND0_CADR  0x80000000

//   </e>
//   <q>FAT Journal
//   <i>Enable FAT Journal in order to guarantee
//   <i>fail-safe FAT file system operation.
#define NAND0_FSJ     0

//   <q>Default Drive [N0:]
//   <i>Used when Drive letter not specified
#define NAND0_DEF   1


请教各位大神,是什么问题呢?是不是还有其他地方没定义呢?已经弄了几天了,现在没头绪了,哪位帮忙看下,谢谢!
回复

使用道具 举报

4

主题

15

回帖

27

积分

新手上路

积分
27
QQ
 楼主| 发表于 2016-9-12 16:18:07 | 显示全部楼层
要是需要代码来找问题的话我就传上来,请各位分析下,谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2016-9-13 10:06:17 | 显示全部楼层
应该是底层的读写函数和格式化函数有点问题,这两个函数单独测试过没有,还有就是读取过这个NAND的ID没有,看看能否正确读取出来,要先保证你的底层函数是没问题的。
回复

使用道具 举报

4

主题

15

回帖

27

积分

新手上路

积分
27
QQ
 楼主| 发表于 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-&gtgLay-&gtos_LSN = 0;
  cfg-&gtgLay-&gtos_COR = 4;
  cfg-&gtgLay-&gtos_BBM = 5;
  cfg-&gtgLay-&gtos_ECC = 6;

  /* Define page organization */
  cfg-&gtgLay->SectInc  =  512;
  cfg-&gtgLay->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);

其他就是修改一些细节。

谢谢你们的例程还有你的回复,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 12:01 , Processed in 0.165415 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表