关于FATFS文件系统实验

2019-07-21 07:20发布

我用的miniSTM32开发板,程序完全是下载的例程,使用的SD大卡,下载后屏幕一直提示“Fatfs Error!”,也就是这个函数exf_getfree("0",&total,&free)得不到SD卡的总容量和剩余容量,不挂载文件系统时,是可以读到SD卡容量,这应该是SD卡的问题还是文件系统的问题?程序完全是下载的例程没更改过,刚开始研究文件系统不太懂,还请大佬赐教
while(exf_getfree("0",&total,&free))        //得到SD卡的总容量和剩余容量{
        LCD_ShowString(60,150,200,16,16,"Fatfs Error!");
        delay_ms(200);
        LCD_Fill(60,150,240,150+16,WHITE);//清除显示                          
        delay_ms(200);
        LED0=!LED0;//DS0闪烁
}       


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
asimo
2019-07-21 18:52
peng1554 发表于 2018-11-29 17:37
“不挂载文件系统时,是可以读到SD卡容量”是指?

意思就是在FATFS文件系统实验中得到SD卡总容量的函数是下面这个,返回值是错误的
//drv:磁盘编号("0:"/"1:")
//total:总容量         (单位KB)
//free:剩余容量         (单位KB)
//返回值:0,正常.其他,错误代码
u8 exf_getfree(u8 *drv,u32 *total,u32 *free)
{
        FATFS *fs1;
        u8 res;
    u32 fre_clust=0, fre_sect=0, tot_sect=0;
    //得到磁盘信息及空闲簇数量
    res =(u32)f_getfree((const TCHAR*)drv, (DWORD*)&fre_clust, &fs1);
    if(res==0)
        {                                                                                          
            tot_sect=(fs1->n_fatent-2)*fs1->csize;        //得到总扇区数
            fre_sect=fre_clust*fs1->csize;                        //得到空闲扇区数          
#if _MAX_SS!=512                                                                  //扇区大小不是512字节,则转换为512字节
                tot_sect*=fs1->ssize/512;
                fre_sect*=fs1->ssize/512;
#endif          
                *total=tot_sect>>1;        //单位为KB
                *free=fre_sect>>1;        //单位为KB
        }
        return res;
}

而在SD卡实验中得到SD卡容量的函数是下面这个,返回值是正确的,
//返回值:0: 取容量出错
//其他:SD卡的容量(扇区数/512字节)
u32 SD_GetSectorCount(void)
{
    u8 csd[16];
    u32 Capacity;  
    u8 n;
                u16 csize;                                              
        //取CSD信息,如果期间出错,返回0
    if(SD_GetCSD(csd)!=0) return 0;            
    //如果为SDHC卡,按照下面方式计算
    if((csd[0]&0xC0)==0x40)         //V2.00的卡
    {       
                csize = csd[9] + ((u16)csd[8] << 8) + 1;
                Capacity = (u32)csize << 10;//得到扇区数                           
    }else//V1.XX的卡
    {       
                n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2;
                csize = (csd[8] >> 6) + ((u16)csd[7] << 2) + ((u16)(csd[6] & 3) << 10) + 1;
                Capacity= (u32)csize << (n - 9);//得到扇区数   
    }
    return Capacity;
}

一周热门 更多>