为SPI FLASH移植fatFs文件系统心得 (二)
今天算是移植成功了,由于下载的是最新的fatFs,网上资料基本都是以前的系统。有些地方还是改动比较多的,这里全部列出来。
函数f_mkfs的功能是创建文件系统,在任何介质第一次使用的时候都要使用该函数。
有些参数,需要说明,au代表最小操作的单元,如果写入0则默认为4096,该单元越大,读写大文件越快,但是碎片和存储空间的浪费也就越多。
work为操作的缓存,至少应该是每个sector的大小。
opt有点坑,是2个参数有个或的操作,和以前的版本很不一样,卡在这里很久。这个函数的运行还和下面函数
GET_BLOCK_SIZE返回的参数有关。BLOCK_SIZE的真实作用是擦出的最小单位,在SD卡中一般为512B,norflash datasheet里也有一个block,但和这个含义不同,spi flash本来最小擦出单位是4096,因为我只用到512,所以这个地方也要以512为擦除单位,才能初始化成功。
函数 f_mount()功能是挂在存储介质,挂在之前必须在介质中写入文件系统。
所以第一次写读文件的顺序如下。
另外使用这个文件系统我觉得至少把_FS_MINIMIZE 开到2 得到f_lseek(),否则读写都只能从文件头开始,完全没法使用。。
FRESULT f_mkfs (
const TCHAR* path, /* Logical drive number */
BYTE opt, /* Format option */
DWORD au, /* Size of allocation unit [byte] */
void* work, /* Pointer to working buffer */
UINT len /* Size of working buffer */
)
函数f_mkfs的功能是创建文件系统,在任何介质第一次使用的时候都要使用该函数。
有些参数,需要说明,au代表最小操作的单元,如果写入0则默认为4096,该单元越大,读写大文件越快,但是碎片和存储空间的浪费也就越多。
work为操作的缓存,至少应该是每个sector的大小。
opt有点坑,是2个参数有个或的操作,和以前的版本很不一样,卡在这里很久。这个函数的运行还和下面函数
DRESULT disk_ioctl (
BYTE pdrv, /* Physical drive nmuber (0..) */
BYTE cmd, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
DRESULT res=RES_OK;
switch (pdrv) {
case DEV_RAM :
return res;
case DEV_MMC :
switch (cmd)
{
case GET_BLOCK_SIZE:
*(DWORD*)buff = 512;
break;
case GET_SECTOR_SIZE:
*(DWORD*)buff = 512;
break;
case GET_SECTOR_COUNT:
*(DWORD*)buff = 0x400;
break;
}
return res;
case DEV_USB :
return res;
}
return RES_PARERR;
}
GET_BLOCK_SIZE返回的参数有关。BLOCK_SIZE的真实作用是擦出的最小单位,在SD卡中一般为512B,norflash datasheet里也有一个block,但和这个含义不同,spi flash本来最小擦出单位是4096,因为我只用到512,所以这个地方也要以512为擦除单位,才能初始化成功。
FRESULT f_mount (
FATFS* fs, /* Pointer to the file system object (NULL:unmount)*/
const TCHAR* path,/* Logical drive number to be mounted/unmounted */
BYTE opt
/* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */
)
函数 f_mount()功能是挂在存储介质,挂在之前必须在介质中写入文件系统。
所以第一次写读文件的顺序如下。
f_mkfs("",FM_FAT|FM_SFD,1024,work,sizeof work);
f_mount (&fs,"",1);
f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_READ | FA_WRITE);
f_write(&fil, writeByte, sizeof writeByte, &bw);
f_read(&fil, readByte, sizeof writeByte, &bw);
f_close(&fil);
f_mount(0, "", 1);
另外使用这个文件系统我觉得至少把_FS_MINIMIZE 开到2 得到f_lseek(),否则读写都只能从文件头开始,完全没法使用。。