STM32/STM8技术william hill官网
直播中

李桂香

7年用户 171经验值
私信 关注
[问答]

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

环境: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("格式化成功!rn");
}
else
{
    printf("格式化失败!rn");
}
#endif  
    return res;
}

回帖(12)

李富贵

2019-6-3 09:30:13
在 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));

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

李桂香

2019-6-3 09:40:52
上电时的初始化函数:
/********************************************************
//函数名称: 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 : %drn", res);
#endif   
   
            g_SDCardInitStatus = SUCCEED;            
        }
        else
        {
            g_SDCardInitStatus = FAILURE;
        }
    }
        
#if (USART_PRINTF_EN)
printf("SD卡初始化结果%drn", g_SDCardInitStatus);
#endif   
   
}
举报

李桂香

2019-6-3 09:52:52
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 : %drn", res);
#endif   
   
            g_SDCardInitStatus = SUCCEED;            
        }
        else
        {
            g_SDCardInitStatus = FAILURE;
        }
    }
        
#if (USART_PRINTF_EN)
printf("SD卡初始化结果%drn", g_SDCardInitStatus);
#endif   
   
}
举报

卢家辉

2019-6-3 10:06:51
文件系统还没研究过。。。帮顶吧!!!
举报

李维嘉

2019-6-3 10:12:08
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替换一下呢
我这不懂,瞎掺和
举报

李飞

2019-6-3 10:18:05
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

王若峰

2019-6-3 10:35:54
你好楼主,我刚开始搞这个fatfs,也是最新的r0.13a版本,使用格式化之后,调用f_getfree接口发现8M的flash,只有差不多一半的剩余空间。请问你这个问题解决了吗?
举报

李桂香

2019-6-3 10:48:59
引用: xieweibin 发表于 2019-6-3 15:41
在 R0.12b这版本中,f_mkfs函数的参数:

FRESULT f_mkfs (  

改了,也没用,我已经放弃了,改用删除的方式了。
举报

李桂香

2019-6-3 11:00:52
引用: zhouxk 发表于 2019-6-3 16:23
BYTE work[FF_MAX_SS]; /* Work area (larger is better for processing time) */
res = f_mkfs("1", FM_FAT32, 0, work, sizeof(work));

谢谢你的掺和
举报

李桂香

2019-6-3 11:17:20
引用: BJJRTD 发表于 2019-6-3 16:47
你好楼主,我刚开始搞这个fatfs,也是最新的r0.13a版本,使用格式化之后,调用f_getfree接口发现8M的flash,只有差不多一半的剩余空间。请问你这个问题解决了吗?

我已经放弃了,改用删除的方式了。
举报

twlllw

2021-10-20 13:58:31
本帖最后由 twlllw 于 2021-10-20 14:01 编辑

   
   f_res=f_mkfs("0:",1,32768);  //R0.11a
// cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1) * 512 * 1024;
//    cardinfo->CardBlockSize = 512;   
    cardinfo->CardCapacity = (cardinfo->SD_csd.DeviceSize + 1);
    //cardinfo->CardCapacity *= 512;  
                cardinfo->CardCapacity *= 1024; //
                cardinfo->CardCapacity *= 1024;
                cardinfo->CardBlockSize = 1024;  
亲试:
cardinfo->CardCapacity *= 512; //格式化后少一半
cardinfo->CardCapacity *= 1024; //完整格式化
举报

twlllw

2021-10-20 13:59:20
f_res=f_mkfs("0:",1,32768);
举报

更多回帖

发帖
×
20
完善资料,
赚取积分