SD 移植fatfs文件系统

为SPI FLASH移植fatFs文件系统心得 (二)

为SPI FLASH移植fatFs文件系统心得 (二)

喻时耕宇 喻时耕宇
1 年前
今天算是移植成功了,由于下载的是最新的fatFs,网上资料基本都是以前的系统。有些地方还是改动比较多的,这里全部列出来。
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(),否则读写都只能从文件头开始,完全没法使用。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值