野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20373|回复: 3

FATFS 管理NANAD FLASH前几天可以正常读写,今天又不行了,我快要疯了。。火哥帮我..

[复制链接]
发表于 2016-3-21 22:29:27 | 显示全部楼层 |阅读模式
前几天我还是可以正常的读写nand flash,今天又不行了,f_mount时总是出现FR_NO_FILESYSTE,使用f_mkfs返回值都是成功的,然后继续f_mount还是FR_NO_FILESYSTE。
硬件是没有问题的,我不使用FATFS,直接给NAND FLASH写入数据,然后再读出来是没有问题的。我都快疯掉了,下面是源码,火哥帮我看看哪里有问题。。
#define NAND_PAGE_SIZE ((uint16_t)0x0800) /* 2048 bytes per page w/o Spare Area */
#define NAND_BLOCK_SIZE ((uint16_t)0x0040) /* 64x2048 bytes pages per block */
#define NAND_ZONE_SIZE ((uint16_t)0x0200) /* 512 Block per zone */

#define NAND_SPARE_AREA_SIZE ((uint16_t)0x0040) /* last 64 bytes as spare area */
#define NAND_MAX_ZONE ((uint16_t)0x0002) /* 2 zones of 1024 block */

/*因为nand flash写入的时候需要一整个block擦除,所以只用到了一半的内存也就是64M,另外64M当成数据缓冲*/
DRESULTdisk_ioctl (BYTE drv,BYTE ctrl, void *buff)
{
   DRESULTres = RES_OK;
   uint32_t result;
   switch(ctrl)
   {
      case CTRL_SYNC:
       break;
      case GET_BLOCK_SIZE:
        *(DWORD*)buff = NAND_BLOCK_SIZE;
         break;
      case GET_SECTOR_COUNT:
        *(DWORD*)buff = (((NAND_MAX_ZONE/2) * NAND_ZONE_SIZE) * NAND_BLOCK_SIZE);
        break;
      case GET_SECTOR_SIZE:
       *(WORD*)buff = NAND_PAGE_SIZE;
         break;
     default:
        res = RES_PARERR;
      break;
    }
   return res;
}

DRESULT disk_write (BYTE drv,const BYTE *buff,DWORD sector,BYTE count)
{
     uint32_t result;
     uint32_t BackupBlockAddr;
     uint32_t WriteBlockAddr;
     uint16_t IndexTmp = 0;
     uint16_t OffsetPage;
    /* NAND FLASH写入的block 的地址*/
    WriteBlockAddr = (sector/NAND_BLOCK_SIZE);
     /* 因为只用一半的内存,另一半做为数据缓冲,所以先将FATFS需要写入的那个block数据全部写入到另一半去,
BackupBlockAddr需要偏移512block*/
    BackupBlockAddr = (WriteBlockAddr + (NAND_MAX_ZONE/2)*NAND_ZONE_SIZE);
   /*写入的页地址*/
    OffsetPage = sector%NAND_BLOCK_SIZE;
   if (drv || !count)

   {
      return RES_PARERR;
   }
    /* NAND FLASH要写入的时候,必须要先将这一整个block擦除,才能写入 */
    result = NAND_EraseBlock(BackupBlockAddr*NAND_BLOCK_SIZE);


   /*
将FATFS需要写入的那个block数据,复制到缓冲区 */
   for (IndexTmp = 0; IndexTmp < NAND_BLOCK_SIZE; IndexTmp++ )
  {
     NAND_CopySmallPage(WriteBlockAddr*NAND_BLOCK_SIZE+IndexTmp,BackupBlockAddr*NAND_BLOCK_SIZE+IndexTmp);
  }


   /* 擦除FATFS需要写入数据的block*/
    result = NAND_EraseBlock(WriteBlockAddr*NAND_BLOCK_SIZE);


   /*将缓冲去的数据整合跟当前FATFS的数据整合在一起,写入到FATFS对应的block中*/
    for (IndexTmp = 0; IndexTmp < NAND_BLOCK_SIZE; IndexTmp++ )
   {
      if((IndexTmp>=OffsetPage)&&(IndexTmp < (OffsetPage+count)))
      {
          NAND_WriteSmallPage((uint8_t *)buff, WriteBlockAddr*NAND_BLOCK_SIZE+IndexTmp, 1);
          buff = (uint8_t *)buff + NAND_PAGE_SIZE;
       }
      else
     {
         NAND_CopySmallPage(BackupBlockAddr*NAND_BLOCK_SIZE+IndexTmp,WriteBlockAddr*NAND_BLOCK_SIZE+IndexTmp);
      }
   }
   if(result == NAND_READY)

   {
       return RES_OK;
   }
   else

   {
     return RES_ERROR;
   }
}

回复

使用道具 举报

 楼主| 发表于 2016-3-21 22:33:58 | 显示全部楼层
补充一下,#define _MAX_SS 2048
回复 支持 反对

使用道具 举报

发表于 2016-3-22 14:05:31 | 显示全部楼层
帮顶
回复

使用道具 举报

 楼主| 发表于 2016-3-22 22:05:01 | 显示全部楼层
火哥,帮我解答一下,为什么会这样?
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-12-6 06:42 , Processed in 0.037637 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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