使用 f_mkfs() 函数进行格式化之前,应该先调用 f_mount() 函数挂载文件系统,否则会出现FR_NOT_ENABLED(逻辑驱动器没有工作区)报错并格式化失败。
static FATFS fs[2]; //文件系统设备结构体
#define FS_VOLUME_SD "0:"
//挂载文件系统
result = f_mount(&fs[0], FS_VOLUME_SD, 1);
if(result != FR_OK)
{
printf("挂载文件系统失败 (%d)\r\n", result);
}
else
{
printf("挂载文件系统成功\r\n");
}
//格式化SD卡
result = f_mkfs(FS_VOLUME_SD,0,0);
if(result != FR_OK)
{
printf("格式化失败 (%d)\r\n", result);
}
else
{
printf("格式化成功\r\n");
}
但是使用 f_mkfs() 函数格式化成功之后把SD卡插入电脑会发现内存少了很多。
原因是: f_mkfs() 函数之间调用了底层函数 disk_ioctl() ,disk_ioctl() 之中调用了 sd_card_info_struct 类型结构体里的 card_capacity 来获取块的大小和扇区数量。但是在SDCard.h 文件中 card_capacity 的数据类型是 uint32_t ,uint32_t 类型数据只能容纳4G左右的地址范围,可能导致SD卡容量读取错误,以至于获取的块的大小和扇区数量错误。
解决方法:在 SDCard.h 文件中把 card_capacity 的数据类型改为 uint64_t ,同时把 c_size 的数据类型也改为 uint64_t ,这样就能够正常读取SD卡内存和地址范围了。使用 f_mkfs() 函数格式化成功之后,SD卡的容量也正常了。
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
sd_card_info_struct sdInfo; //SD卡信息
switch (pdrv) {
//SD卡控制
case FS_SD :
//获取SD卡信息
sd_card_information_get(&sdInfo);
switch(cmd)
{
//同步操作
case CTRL_SYNC:
return RES_OK;
//获取扇区大小
case GET_SECTOR_SIZE:
*(WORD*)buff = 512;
return RES_OK;
//获得块大小
case GET_BLOCK_SIZE:
*(WORD*)buff = sdInfo.card_blocksize;
return RES_OK;
//获得扇区数量
case GET_SECTOR_COUNT:
*(DWORD*)buff = sdInfo.card_capacity / 512;
return RES_OK;
//非法参数
default:
return RES_PARERR;
}
//Nand Flash控制
case FS_NAND :
return RES_PARERR;
}
return RES_PARERR;
}
修改前:
修改后:
容量已经变小的SD卡怎么恢复正常,可以参考: