OpenEdv-开源电子网

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

求助:FatFs系统中,NAND无法挂载、格式化的问题

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-7-19
在线时间
2 小时
发表于 2017-7-19 11:28:39 | 显示全部楼层 |阅读模式
1金钱
近期使用STM32F429和NAND Flash做了个板子,NAND是新的(镁光的...4G08ABADA)。根据正点原子开发板F429的FatFS例程移植后,调试中出现如下的情况:

1、FTL层初始化正常,建立FTL表正常,初始化NAND正常、全片擦写寻找坏块功能也正常
2、PageRead、PageWrite正常,数据正确
3、FTL_WriteSector、FTL_ReadSector正常,数据正确
总之以上都正常

但是,在挂FatFs系统时,f_mount不成功,返回的值是13(没有文件系统)
我尝试使用f_mkfs建立文件系统,返回值是12(没有工作区)

请问大家,这种情况是如何造成的?怎样才能成功加载FatFs呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-7-19
在线时间
2 小时
 楼主| 发表于 2017-7-19 13:24:39 | 显示全部楼层
本帖最后由 weihua8206 于 2017-7-19 13:38 编辑

代码如下所示:其中FTL的函数完全是按照原子哥的例程做的

/* Private function prototypes -----------------------------------------------*/
DSTATUS NAND_initialize (void);
DSTATUS NAND_status (void);
DRESULT NAND_read (BYTE*, DWORD, BYTE);

#if _USE_WRITE == 1
  DRESULT NAND_write (const BYTE*, DWORD, BYTE);
#endif /* _USE_WRITE == 1 */

#if _USE_IOCTL == 1
  DRESULT NAND_ioctl (BYTE, void*);
#endif /* _USE_IOCTL == 1 */
  
Diskio_drvTypeDef  NAND_Driver =
{
  NAND_initialize,
  NAND_status,
  NAND_read,
#if  _USE_WRITE == 1
  NAND_write,
#endif /* _USE_WRITE == 1 */  
#if  _USE_IOCTL == 1
  NAND_ioctl,
#endif /* _USE_IOCTL == 1 */
};
DSTATUS NAND_initialize(void)
{
        if(FTL_Init())  {return RES_ERROR;}
        else            {return RES_OK;}
}

DSTATUS NAND_status(void)
{
  DRESULT res = RES_ERROR;

  if(NAND_ReadStatus() == NAND_READY)
  {
    res = RES_OK;
  }
  else
  {
    res = RES_ERROR;
  }

  return res;
}

DRESULT NAND_read(BYTE *buff, DWORD sector, BYTE count)
{
        DRESULT res = RES_ERROR;
        res = FTL_ReadSectors(buff,sector,512,count);        //读取数据

        if(res == 0x00)      {return RES_OK;}               
    else                 {return RES_ERROR;}       
}

#if _USE_WRITE == 1
DRESULT NAND_write(const BYTE *buff, DWORD sector, BYTE count)
{
        DRESULT res = RES_ERROR;
        res=FTL_WriteSectors((u8*)buff,sector,512,count);//写入数据
       
        if(res == 0x00)      {return RES_OK;}               
    else                 {return RES_ERROR;}       
}
#endif /* _USE_WRITE == 1 */

#if _USE_IOCTL == 1
DRESULT NAND_ioctl(BYTE cmd, void *buff)
{
        DRESULT res = RES_ERROR;
        switch(cmd)
        {
                case CTRL_SYNC:
                        res = RES_OK;
                        break;         
                case GET_SECTOR_SIZE:
                        *(WORD*)buff = 512;        //NAND FLASH扇区强制为512字节大小
                        res = RES_OK;
                        break;         
                case GET_BLOCK_SIZE:
                        *(WORD*)buff = nand_dev.page_mainsize/512;//block大小,定义成一个page的大小
                        res = RES_OK;
                        break;         
                case GET_SECTOR_COUNT:
                        *(DWORD*)buff = nand_dev.valid_blocknum*nand_dev.block_pagenum*nand_dev.page_mainsize/512;//NAND FLASH的总扇区大小
                        res = RES_OK;
                        break;
                default:
                        res = RES_PARERR;
                        break;
        }
}
#endif /* _USE_IOCTL == 1 */
回复

使用道具 举报

3

主题

130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3130
金钱
3130
注册时间
2017-3-2
在线时间
324 小时
发表于 2017-7-19 14:13:37 | 显示全部楼层
注意下在挂载盘时,如果申请的变量是指针,则要为其分配内存空间,用完了释放,如果申请的是数组则无需申请内存空间,我以前在这块吃过亏
坚持不懈的努力!
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2017-7-19
在线时间
2 小时
 楼主| 发表于 2017-7-20 15:16:01 | 显示全部楼层
meimengxing2014 发表于 2017-7-19 14:13
注意下在挂载盘时,如果申请的变量是指针,则要为其分配内存空间,用完了释放,如果申请的是数组则无需申请 ...

我申请的是数组
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165359
金钱
165359
注册时间
2010-12-1
在线时间
2110 小时
发表于 2017-7-21 01:36:17 | 显示全部楼层
先f_mount,不管返回值,然后再mkfs
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-12-22 21:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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