你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

TF卡使用FATFS的f_mkfs格式化之后容量减少了一半

[复制链接]
luo_fe 提问时间:2017-9-29 11:27 /
悬赏3ST金币已解决
本帖最后由 luo_fe 于 2017-10-10 11:05 编辑

环境:TF卡+SPI+FATFS R0.13。
结果:我使用了容量不同的TF卡(128M、2G、4G、8G、16G),调用f_mkfs函数对TF卡格式化之后,所有的卡插到电脑上发现容量都少了一半,不多不少就是一半!


格式化的源码:
/********************************************************
//函数名称: FATFS_Format_Disk
//函数功能: 文件系统格式化磁盘的函数
//输    入: BYTE drv——磁盘号,0:FDISK, 1:SFD
//输    出: FRESULT——格式化结果
//备    注: 对卡进行格式化,驱动器号一般为0
            格式完之后,插入电脑中会重新格式化,并且容量减半!!!
********************************************************/
FRESULT FATFS_Format_Disk(BYTE drv)
{
    BYTE work[FF_MAX_SS]; /* Work area (larger is better for processing time) */
    u8 i = 0;

    do
    {
        switch(drv)
        {
            case 0:
            {
                /* Create FAT volume */
                res = f_mkfs("", FM_FAT32, 0, work, sizeof(work));
            }
            break;

            case 1:
            {
                /* Create FAT volume */
                res = f_mkfs("1:", FM_FAT32, 0, work, sizeof(work));
            }
            break;

            default:
            {
                /* Create FAT volume */
                res = f_mkfs("", FM_FAT32, 0, work, sizeof(work));
            }
            break;
        }
        if(i++ >= 10)
        {
            break;
        }
    }while(res != FR_OK);

    /* Register work area */
    f_mount(&fs[0], "", 1);

//    /* Unregister work area */
//    f_mount(NULL, "", 0);

#if USART_FATFS_PRINTF_EN
if(res == FR_OK)
{
    printf("格式化成功!\r\n");
}
else
{
    printf("格式化失败!\r\n");
}
#endif  
    return res;
}


最佳答案

查看完整内容

在 R0.12b这版本中,f_mkfs函数的参数: FRESULT f_mkfs ( const TCHAR* path, /* [IN] Logical drive number */ BYTE opt, /* [IN] Format options */ DWORD au, /* [IN] Size of the allocation unit */ void* work, /* [指针] Working buffer */ UINT len /* [IN] Size of working buffer */ ); 参数:path 当给定0时, 首先在驱动器上的第一个扇区创建一 ...
<
收藏 2 评论11 发布时间:2017-9-29 11:27

举报

11个回答
无薪税绵 回答时间:2017-9-29 11:27:47
在 R0.12b这版本中,f_mkfs函数的参数:

FRESULT f_mkfs (  
  const TCHAR* path,  /* [IN] Logical drive number */  
  BYTE  opt,          /* [IN] Format options */  
  DWORD au,           /* [IN] Size of the allocation unit */  
  void* work,         /* [指针]  Working buffer */  
  UINT len            /* [IN] Size of working buffer */  
);  

参数:path
当给定0时,
首先在驱动器上的第一个扇区创建一个分区表,
然后文件系统被创建在分区上。
这被称为FDISK格式化,用于硬盘和存储卡。
当给定1时,文件系统从第一个扇区开始创建,
而没有分区表。这被称为超级软盘(SFD)格式化,
用于软盘和可移动磁盘。

参数:au
指定每簇中以字节为单位的分配单元大小。
数值必须是0或从512到32K之间2的幂。
当指定0时,簇大小取决于卷大小。

我建议把
res = f_mkfs("", FM_FAT32, 0, work, sizeof(work));
改为
res = f_mkfs("", FM_FAT32, 512, work, sizeof(work));

试试,看是不是这个导致的。

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

luo_fe 回答时间:2017-9-29 11:32:18
上电时的初始化函数:
/********************************************************
//函数名称: FATFS_Init
//函数功能: SD卡文件系统初始化
//输    入: 无
//输    出: 无
//备    注:
********************************************************/
void FATFS_Init(void)
{
    u8 i = 0;
   
    do
    {
        g_SDCardInitStatus = SD_Init();
        i++;
    }while((i < 10) && (g_SDCardInitStatus != SUCCEED));
    if(g_SDCardInitStatus == SUCCEED)
    {
        /* Register work area */
        f_mount(&fs[0], "", 1);
        if(res == FR_OK)
        {
                    
#if (USART_PRINTF_EN)
printf("注册工作区res : %d\r\n", res);
#endif   
   
            g_SDCardInitStatus = SUCCEED;            
        }
        else
        {
            g_SDCardInitStatus = FAILURE;
        }
    }
        
#if (USART_PRINTF_EN)
printf("SD卡初始化结果%d\r\n", g_SDCardInitStatus);
#endif   
   
}
luo_fe 回答时间:2017-9-29 11:36:45
PS,上电时TF卡和FATFS初始化程序:
/********************************************************
//函数名称: FATFS_Init
//函数功能: SD卡文件系统初始化
//输    入: 无
//输    出: 无
//备    注:
********************************************************/
void FATFS_Init(void)
{
    u8 i = 0;
   
    do
    {
        g_SDCardInitStatus = SD_Init();
        i++;
    }while((i < 10) && (g_SDCardInitStatus != SUCCEED));
    if(g_SDCardInitStatus == SUCCEED)
    {
        /* Register work area */
        f_mount(&fs[0], "", 1);
        if(res == FR_OK)
        {
                    
#if (USART_PRINTF_EN)
printf("注册工作区res : %d\r\n", res);
#endif   
   
            g_SDCardInitStatus = SUCCEED;            
        }
        else
        {
            g_SDCardInitStatus = FAILURE;
        }
    }
        
#if (USART_PRINTF_EN)
printf("SD卡初始化结果%d\r\n", g_SDCardInitStatus);
#endif   
   
}
MrJiu 回答时间:2017-9-29 16:31:32
文件系统还没研究过。。。帮顶吧!!!
toofree 回答时间:2018-2-13 09:29:57
BYTE work[FF_MAX_SS]; /* Work area (larger is better for processing time) */
res = f_mkfs("1", FM_FAT32, 0, work, sizeof(work));

这两条中,其中FF_MAX_SS是多少? sizeof(work)得到的值是多少?
要不要直接用512替换一下呢
我这不懂,瞎掺和

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

feixiang20 回答时间:2018-2-13 09:47:04
具体也说不好,给你个参考吧
1。。数据长度问题,超过32位后最高位溢出

2。。问题:在arm7上跑了个fatfs系统 ,格式化TF卡的时候,8G卡,格成了3个多G?? f_mkfs(0, 0, 4096)
解决方法
1.png

评分

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

查看全部评分

小李的她 回答时间:2018-3-21 08:15:45
你好楼主,我刚开始搞这个fatfs,也是最新的r0.13a版本,使用格式化之后,调用f_getfree接口发现8M的flash,只有差不多一半的剩余空间。请问你这个问题解决了吗?
luo_fe 回答时间:2018-7-9 13:54:41
无薪税绵 发表于 2017-9-29 11:27
在 R0.12b这版本中,f_mkfs函数的参数:

FRESULT f_mkfs (  

改了,也没用,我已经放弃了,改用删除的方式了。
luo_fe 回答时间:2018-7-9 13:55:02
toofree 发表于 2018-2-13 09:29
BYTE work[FF_MAX_SS]; /* Work area (larger is better for processing time) */
res = f_mkfs("1", FM_FA ...

谢谢你的掺和
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版