OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7503|回复: 6

请教下,如果把 fatfs 搞到 nand flash 的芯片里面去 ??

[复制链接]

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
发表于 2016-9-11 20:04:11 | 显示全部楼层 |阅读模式
5金钱
请教下,如果把 fatfs 搞到 nand flash 的芯片里面去 ??

看历程貌似也没有搞明白,请指教指教 ??

最佳答案

查看完整内容[请看2#楼]

简单,用你的nand flash接口来写fatfs的diskio就行了. 通常情况下,fatfs不适合nand flash. 如果非要用fatfs那应该写一个FTL层来接口fatfs和nand flash.FTL做的事主要就是磨损平衡和垃圾回收.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-9-11 20:04:12 | 显示全部楼层
简单,用你的nand flash接口来写fatfs的diskio就行了.
通常情况下,fatfs不适合nand flash.
如果非要用fatfs那应该写一个FTL层来接口fatfs和nand flash.FTL做的事主要就是磨损平衡和垃圾回收.
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2016-9-14 12:20:19 | 显示全部楼层
zmingwang 发表于 2016-9-11 20:04
简单,用你的nand flash接口来写fatfs的diskio就行了.
通常情况下,fatfs不适合nand flash.
如果非要用fatf ...

你好,一般nand flash 是如何使用的????

(是不是直接进行地址操作? )
还有这个 nand flash.FTL 哪里可以找到 或 是自己写 ??
回复

使用道具 举报

5

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1522
金钱
1522
注册时间
2014-5-16
在线时间
217 小时
发表于 2016-9-14 13:36:33 | 显示全部楼层
hpdell 发表于 2016-9-14 12:20
你好,一般nand flash 是如何使用的????

(是不是直接进行地址操作? )

如果你存储的数据不是频繁更新的,那怎么用都可以,自己写个简单的读写方法就行了.
如果要存储文件,并希望用文件IO来访问,那就需要为NAND FLASH安装一个文件系统,开源的有UFFS,YAFFS2等.或者用KEIL提供的文件系统,最方便,就是不开源.
回复

使用道具 举报

lllyyl1987 该用户已被删除
发表于 2017-1-4 16:17:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

260

主题

810

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1898
金钱
1898
注册时间
2012-10-28
在线时间
357 小时
 楼主| 发表于 2017-1-4 23:50:37 | 显示全部楼层
lllyyl1987 发表于 2017-1-4 16:17
请问,你的问题解决了吗,我也在用FATfs来管理nandflash,但是一直也没有成功,想请教一下

/*
********************************************************************************************************
函数名称:NAND_FlashFatfsDemo
函数功能: 测试 nand flash 读写功能,带 fatfs 文件管理系统操作
参数:    无
返回值:  无
********************************************************************************************************
*/  
void NAND_FlashFatfsDemo(void)
{
//  static u8 nand_tx_buff[8192*4], nand_rx_buff[8192*4];
  uint32_t RWDataSize = 8192 * 4;
  uint8_t  * nand_tx_buff =  (uint8_t  *)mymalloc(SRAMEX, RWDataSize );       
  uint8_t  * nand_rx_buff =  (uint8_t  *)mymalloc(SRAMEX, RWDataSize );       
  
  uint8_t res;
  FATFS Nand_fs;//逻辑磁盘工作区.         
  FIL file;                          //文件1
  UINT bw;                        //读写变量
  
  uint32_t cc;
  uint8_t i = 0;  
  u8 work[_MAX_SS];         /* Work area (larger is better for processing time) */  
  
//    FILINFO fileinfo;        //文件信息
//    DIR DirInf;                          //目录
//    FIL ftemp;                          //文件2.

  
  if(( !nand_tx_buff) || ( !nand_rx_buff ))
  {
    #if  NAND_FLASH_DEBUG_SWITCH > 0U
    printf("NAND SDRAM mymalloc Error ... ... \r\n");
    #endif
  }
  
  for(cc=0;cc < ( RWDataSize );cc++)
  {
    nand_tx_buff[cc] = i * 1;
    nand_rx_buff[cc] = 0 ;
    i ++;
  }

  res = f_mount( &Nand_fs,"2:",1);                                 //挂载FLASH.
  if(FR_OK != res)
  {
    printf("f_mount NAND 失败 ... ...  0x%x\r\n", res);
   
    if(0x0D == res)
    {
      if(FTL_Format())           // 使用 fatfs 格式化函数前,先 擦除nand flash 所以的好块
      {
        printf("NAND Flash Format Error ... ...  \r\n");
        
        myfree(SRAMEX, nand_tx_buff);
        myfree(SRAMEX, nand_rx_buff);        
        return ;
      }
      else
      {
        res = f_mkfs("2:", 1, 4096, work, sizeof(work) );         //格式化FLASH,2,盘符;1,不需要引导区,8个扇区为1个簇
        if(res == 0)
        {
          res = f_setlabel((const TCHAR *)"2:NANDDISK");                //设置Flash磁盘的名字为:NANDDISK
          if(FR_OK == res)
          {
            printf("NAND Flash 磁盘设置成功  ... ... \r\n");
          }
         
          printf("NAND Flash Format Finish  ... ... \r\n");                //格式化完成
        }
        else
          printf("NAND Flash Format Error   ... ... %d \r\n", res);           //格式化失败  
      }
    }
  }
  else
    printf("f_mount NAND 成功 ... ...  \r\n");
  
//  res = f_opendir(&DirInf, "2:");     /* 2: 表示盘符 ,在读写文件前必须先打开目录 */
  res = f_open(&file, "2:/NAND_1.txt", FA_CREATE_ALWAYS | FA_WRITE );

  res = f_write(&file, &nand_tx_buff[0], RWDataSize, &bw);
  
  res = f_close(&file);

//  res = f_opendir(&DirInf, "2:");     /* 2: 表示盘符  文件关闭后需要重新打开 根目录,否则读取失败 */
  res = f_open(&file, "2:/NAND_1.txt", FA_READ);
  res = f_read (&file, &nand_rx_buff[0], RWDataSize, &bw );
  res = f_mount( NULL, "2:", 1);   
  
  if( Buffercmp_8(&nand_tx_buff[0], &nand_rx_buff[0], RWDataSize ) == 0)
    printf("NAND Flash Fatfs Read Write 8192 * 4 Test OK     .. DD \r\n\r\n");
  else
    printf("NAND Flash Fatfs Read Write 8192 * 4 Test Error  .. EE \r\n\r\n");
  
  
  myfree(SRAMEX, nand_tx_buff);
  myfree(SRAMEX, nand_rx_buff);

}
回复

使用道具 举报

0

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2016-3-17
在线时间
33 小时
发表于 2017-4-10 14:57:30 | 显示全部楼层
谢谢分享
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 05:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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