本帖最后由 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; } |
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));
试试,看是不是这个导致的。
评分
查看全部评分
/********************************************************
//函数名称: 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
}
/********************************************************
//函数名称: 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
}
res = f_mkfs("1", FM_FAT32, 0, work, sizeof(work));
这两条中,其中FF_MAX_SS是多少? sizeof(work)得到的值是多少?
要不要直接用512替换一下呢
我这不懂,瞎掺和
评分
查看全部评分
1。。数据长度问题,超过32位后最高位溢出
2。。问题:在arm7上跑了个fatfs系统 ,格式化TF卡的时候,8G卡,格成了3个多G?? f_mkfs(0, 0, 4096)
解决方法
评分
查看全部评分
改了,也没用,我已经放弃了,改用删除的方式了。
谢谢你的掺和
我已经放弃了,改用删除的方式了。
使用DiskGenius软件
1. 右击选择“删除当前分区”;
2. 点击左上角的“保存更改”;
3. 点击上方的“新建分区”-- “确定”;
4. 点击左上角的“保存更改”;