OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2890|回复: 2

fatfs R0.09移植,卡了我半天,fatf_getfree传递drv参数一定要加:(冒号)

[复制链接]

63

主题

305

帖子

1

精华

高级会员

Rank: 4

积分
853
金钱
853
注册时间
2012-8-3
在线时间
79 小时
发表于 2017-8-13 17:39:07 | 显示全部楼层 |阅读模式
本帖最后由 EDA3rd 于 2017-8-13 17:40 编辑

移植原子的fatfs实验,版本的R0.09a,SD卡能正常读取容量,SPI flash读取到的容量居然和SD一样,都是32G:

[mw_shl_code=c,true]
if(exfuns_init()){
printf("exfuns_init failed...");
while(1);
};        //为fatfs相关变量申请内存        
f_mount(0, efs[0]); //挂载SD卡
res=f_mount(1, efs[1]); //挂载FLASH.
printf("res of f_mount = %d\r\n", res);        
if(res==FR_NO_FILESYSTEM)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
{
LCD_ShowString(30,150,200,16,16,"Flash Disk Formatting...");        //格式化FLASH
printf("Flash Disk Formatting...\r\n");
res=f_mkfs(1, 1, 4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
if(res==0)
{
printf("SPI Flash Format Finish!\r\n");
//        f_setlabel((const TCHAR *)"1:ALIENTEK");        //设置Flash磁盘的名字为:ALIENTEK
LCD_ShowString(30,150,200,16,16,"Flash Disk Format Finish");        //格式化完成
}else LCD_ShowString(30,150,200,16,16,"Flash Disk Format Error ");        //格式化失败
delay_ms(1000);
}        
LCD_Fill(30,150,240,150+16,WHITE);        //清除显示        
while(exf_getfree("0",&total,&free))        //得到SD卡的总容量和剩余容量
{
LCD_ShowString(30,150,200,16,16,"SD Card Fatfs Error!");
delay_ms(200);
LCD_Fill(30,150,240,150+16,WHITE);        //清除显示        
delay_ms(200);
LED0=!LED0;//DS0闪烁
}        
POINT_COLOR=BLUE;//设置字体为蓝色        
LCD_ShowString(30,150,200,16,16,"FATFS OK!");         
LCD_ShowString(30,170,200,16,16,"SD Total Size: MB");         
LCD_ShowString(30,190,200,16,16,"SD Free Size: MB");
LCD_ShowNum(30+8*14,170,total>>10,5,16);        //显示SD卡总容量 MB
LCD_ShowNum(30+8*14,190,free>>10,5,16);        //显示SD卡剩余容量 MB        
printf("SD card Fatfs OK!\r\n");         
printf("SD card Total Size: %d MB\r\n", total>>10);         
printf("SD card Free Size: %d MB\r\n", free>>10);

while(exf_getfree("1",&total,&free))        //得到flash的总容量和剩余容量
{
LCD_ShowString(30,150,200,16,16,"SPI Flash Fatfs Error!");
delay_ms(200);
LCD_Fill(30,150,240,150+16,WHITE);        //清除显示        
delay_ms(200);
LED0=!LED0;//DS0闪烁
}        
POINT_COLOR=BLUE;//设置字体为蓝色        
printf("SPI Flash Fatfs OK!\r\n");         
printf("Flash Total Size: %d MB\r\n", total>>10);         
printf("Flash Free Size: %d MB\r\n", free>>10);
[/mw_shl_code]

查了半天才发现是参数问题,原子的代码默认exf_getfree("0",&total,&free)是不带冒号的,执行exf_getfree会调用chk_mounted函数,chk_mounted开头会判断vol,如果不带冒号,就会赋值vol = 0,所以spi flash读容量得到的是SD卡的容量。

        /* Get logical drive number from the path name */
        vol = p[0] - '0';                                        /* Is there a drive number? */
        if (vol <= 9 && p[1] == ':') {                /* Found a drive number, get and strip it */
                p += 2; *path = p;                                /* Return pointer to the path name */
        } else {                                                        /* No drive number is given */
#if _FS_RPATH
                vol = CurrVol;                                        /* Use current drive */
#else
                vol = 0;                                                /* Use drive 0 */
#endif
        }

        /* Check if the file system object is valid or not */
        *rfs = 0;
        if (vol >= _VOLUMES)                                 /* Is the drive number valid? */
                return FR_INVALID_DRIVE;
        fs = FatFs[vol];                                        /* Get corresponding file system object */
        if (!fs) return FR_NOT_ENABLED;                /* Is the file system object available? */


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

3

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1242
金钱
1242
注册时间
2014-9-9
在线时间
180 小时
发表于 2019-9-13 18:21:44 | 显示全部楼层
我用原子哥《ALIENTEK MINISTM32 实验29 FATFS文件系统实验》的程序,想调用exf_getfree读出该程序中外部flash的总容量和剩余容量,
只修改     while(exf_getfree("0",&total,&free))        //得到SD卡的总容量和剩余容量
为           while(exf_getfree("1",&total,&free))
是无法实现的,必须要加冒号才能正确读出
另外我未找到楼主所说的chk_mounted函数,可能是因为FATFS的版本不同的原因吧(我的版本是R0.11)。
回复 支持 反对

使用道具 举报

63

主题

305

帖子

1

精华

高级会员

Rank: 4

积分
853
金钱
853
注册时间
2012-8-3
在线时间
79 小时
 楼主| 发表于 2019-9-19 10:28:42 | 显示全部楼层
yzhbz 发表于 2019-9-13 18:21
我用原子哥《ALIENTEK MINISTM32 实验29 FATFS文件系统实验》的程序,想调用exf_getfree读出该程序中外部fl ...

你跟踪一下exf_getfree函数就知道了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 02:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表