搜索
查看: 3008|回复: 6

[已解决] 请教FATFS0.12C,f_mkfs()用法。

[复制链接]

该用户从未签到

9

主题

30

帖子

6

蝴蝶豆

中级会员

最后登录
2019-6-24
发表于 2019-5-23 12:34:25 | 显示全部楼层 |阅读模式
之前项目里用的是Fatfs  v0.11版本,正常。现要支持对exFat格式U盘扫描,升级为 v0.12c。但发现f_mkfs()变化很大,除了新添加参数之外,原先的文件系统格式常数,也有变化。旧版本中,有0:flash,1:sfd。  而新版本里:FM_FAT:0x01,FM_FAT32:0X02......FM_SFD:0X08。

我对SPI flash(不是U盘,是板上焊的华邦存储芯片,8M容量)格式化完成之后,无法进行文件操作。

哪位有使用fatfs v0.12a之后版本成功的示例,共享、指导一下,谢谢。
回复

使用道具 举报

该用户从未签到

6

主题

547

帖子

62

蝴蝶豆

金牌会员

最后登录
2021-12-18
发表于 2019-5-23 15:54:25 | 显示全部楼层
FRESULT result;
FATFS fs;           /* File system object for flash disk logical drive */
FIL fil;            /* File object */
FILINFO fno;
char spath[4];      /* SFLASH logical drive path */
BYTE work[FF_MAX_SS];
uint32_t br, bw;

typedef struct _filesystem_info_t
{
        int total_space;
        int free_space;
} filesystem_info;

filesystem_info fatfs_info;

filesystem_info fatfs_get_info(uint8_t *drv)
{
        FATFS *fs;
        uint8_t res;
        DWORD fre_clust=0, fre_sect=0, tot_sect=0;
  
        filesystem_info info;
  
        memset(&info, 0x0, sizeof(filesystem_info));
  
        res = f_getfree((const TCHAR*)drv, &fre_clust, &fs);
        if(res==0)
    {                                                                                          
                tot_sect = (fs->n_fatent - 2) * fs->csize;
                fre_sect = fre_clust * fs->csize;
                if(tot_sect<20480)
                {
            info.total_space = tot_sect>>1;
            info.free_space = fre_sect>>1;
                }
                else
                {
            info.total_space = tot_sect>>11;
            info.free_space = fre_sect>>11;
                }
    }
       
    return info;
}

void uctsk_lua_init(void)
{
        FATFS_LinkDriver( &SFLASH_Driver, spath );
        f_mount( &fs, (TCHAR const*) spath, 0 );
        fatfs_info = fatfs_get_info( (uint8_t*) spath );
        if ( fatfs_info.total_space == 0 || fatfs_info.free_space <= 0x100 )//0x1BC0
        {
                f_mkfs ( (TCHAR const*) spath, FM_ANY, 0, work, sizeof(work));
                fatfs_info = fatfs_get_info( (uint8_t*) spath );
        }
        FATFS_UnLinkDriver( spath );
}
以上是我使用的,可以参考

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

30

帖子

6

蝴蝶豆

中级会员

最后登录
2019-6-24
 楼主| 发表于 2019-5-23 16:43:08 | 显示全部楼层
yklstudent-1794 发表于 2019-5-23 15:54
FRESULT result;
FATFS fs;           /* File system object for flash disk logical drive */
FIL fil;   ...

我 res_flash = f_mkfs("1:",FM_ANY, 0, work, sizeof work); 也能成功。返回0;

比你的少了:FATFS_LinkDriver()调用。跟这个有关系么??

回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

30

帖子

6

蝴蝶豆

中级会员

最后登录
2019-6-24
 楼主| 发表于 2019-5-23 17:10:31 | 显示全部楼层
可能我没表达清楚。我同时挂了两个存储设备,系统如何区分 0:和1:分别代表 SPI-flash和U盘?(也就是说,如何将“0:”与某个存储器绑定)
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

30

帖子

6

蝴蝶豆

中级会员

最后登录
2019-6-24
 楼主| 发表于 2019-5-25 18:45:10 | 显示全部楼层
yklstudent-1794 发表于 2019-5-23 15:54
FRESULT result;
FATFS fs;           /* File system object for flash disk logical drive */
FIL fil;   ...

SFLASH_Driver  这个的驱动实例,可否也分享一下?谢谢。
回复 支持 反对

使用道具 举报

该用户从未签到

9

主题

30

帖子

6

蝴蝶豆

中级会员

最后登录
2019-6-24
 楼主| 发表于 2019-5-27 00:30:48 | 显示全部楼层
困扰我许久了,今天终于解决了。感谢论坛里诸位大神的回贴帮助。
解决办法:
ffconf.h文件中,我将 _MAX_SS 和 _MIN_SS均置为512了……问题所在。
改为:
#define        _MIN_SS                512
#define        _MAX_SS                4096
即可。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2 总结问题

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

19

主题

199

帖子

18

蝴蝶豆

版主

最后登录
2021-12-15
发表于 2020-7-31 09:59:23 | 显示全部楼层
dabendan001 发表于 2019-5-27 00:30
困扰我许久了,今天终于解决了。感谢论坛里诸位大神的回贴帮助。
解决办法:
ffconf.h文件中,我将 _MAX_SS ...

我也遇到这个问题,你是多大的sd卡?
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-20 04:27 , Processed in 0.191075 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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