这两天学着用了一下FATS文件系统,虽然工作中没用到,但是对个人的经验积累还是有用的。看了一下,代码并不多,但是精简啊,指针跳来跳去的一不小心就晕了。
所以也遇到了不少问题啊。
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
DSTATUS stat;
int result;
switch (pdrv) {
case DEV_RAM :
// result = RAM_disk_initialize();
// translate the reslut code here
return stat;
case DEV_MMC :
// result = MMC_disk_initialize();
// translate the reslut code here
return stat;
case DEV_USB :
// result = USB_disk_initialize();
// translate the reslut code here
return stat;
}
return STA_NOINIT;
}
[/mw_shl_code] 根据传入参数0,到了case DEV_RAM: 问题来了,我是TF卡啊,这里应该是case DEV_MMC:啊。 那这就好理解了,传入参数有问题,应该是1. 这个传入参数是从这里出来的vol = get_ldnumber那就进这个函数仔细看吧。 int get_ldnumber ( /* Returns logical drive number(-1:invalid drive) */ const TCHAR** path /*Pointer to pointer to the path name */ ) 输入参数是path地址,我的地址是 "0:/test.txt" , 程序里判断句 i = *tp++,也就是地址冒号前的'0'。 经过下面的一段
这里就讲一下我遇到的第一步就懵逼的问题。
那就是
FRESULT f_mount (
FATFS* fs, /* Pointer to the filesystem object (NULL:unmount)*/
const TCHAR* path, /* Logical drive number to be mounted/unmounted */
BYTE opt /* Mode option 0o not mount (delayed mount), 1:Mount immediately */
)
上面就是我杠上的原因,挂载成功了你却告诉我没有文件系统。 然后跟踪f_open函数里面调用了find_volume 判断逻辑驱动号,如果需要的话就挂载。 继续跟踪find_volume里面调用了vol = get_ldnumber获取逻辑驱动号 返回的是0 然后回到find_volume fs->pdrv = LD2PD(vol),修改了pdrv. 然后下一句是 stat = disk_initialize(fs->pdrv);好吧,这里终于到了接口文件diskio.c里面. 跟踪进去一看, [mw_shl_code=c,true]DSTATUS disk_initialize (
BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{
DSTATUS stat;
int result;
switch (pdrv) {
case DEV_RAM :
// result = RAM_disk_initialize();
// translate the reslut code here
return stat;
case DEV_MMC :
// result = MMC_disk_initialize();
// translate the reslut code here
return stat;
case DEV_USB :
// result = USB_disk_initialize();
// translate the reslut code here
return stat;
}
return STA_NOINIT;
}
[/mw_shl_code] 根据传入参数0,到了case DEV_RAM: 问题来了,我是TF卡啊,这里应该是case DEV_MMC:啊。 那这就好理解了,传入参数有问题,应该是1. 这个传入参数是从这里出来的vol = get_ldnumber那就进这个函数仔细看吧。 int get_ldnumber ( /* Returns logical drive number(-1:invalid drive) */ const TCHAR** path /*Pointer to pointer to the path name */ ) 输入参数是path地址,我的地址是 "0:/test.txt" , 程序里判断句 i = *tp++,也就是地址冒号前的'0'。 经过下面的一段
开启调试模式返回的竟然是0XFFFFFFF即 -1。
又到get_ldnumber里面看到
if ((i -= '0') < FF_VOLUMES) { /* If drive id is found, get the valueand strip it */这里FF_VOLUMES 在ffconfig.h里面定义的是1
#define FF_VOLUMES 1 /* Number of volumes (logical drives) to beused. (1-10) */
导致我的i -= '0', i =1; 不满足< FF_VOLUMES导致返回了vol的初始化值 -1.
那好啊,我修改一下FF_VOLUMES =2
擦,结果返回了错误12,逻辑驱动没有工作区域,那我刚才挂载的呢!等等,我刚才挂载的是地址是默认地址"" ,而默认地址是0:啊。来来来,赶快修改成 f_mount(&fs,"1:",1);
回头总结一下问题,主要是逻辑驱动号没弄好,因为diskio.c的默认分了三种类型的存储类型RAM/MMC/USB 而默认的是RAM所以,如果在不修改它的框架情况下,就要逻辑驱动号对应。
TF卡对应MMC所以要地址要是 1: ,ffconfig里默认了只有一个逻辑驱动号0所以需要修改设置
FF_VOLUMES = 2 程序这样写 f_mount(&fs,"1:",1); f_open(&fsrc,"1:/test.txt",FA_OPEN_EXISTING| FA_READ);
FAT 0.13 f_mount(&fs,"",1)挂载失败的原因-OpenEdv-开源电子网
发布评论