我作用 STM32F103 SPI 对SD卡进行读写,上FAT文件系统 ,现在的问题是 我如果 把一张空的SD卡(刚格式化)插机板了上,执行 f_getfree("/",&freem,&pfs) 时,返回 DISKIOERR, 单步调试 程序就 在 下面程序 红色部分循环,这段程序 是进行对整个SD卡进行逐个扇区扫描,。我的是8G的卡 clst 值很非常大, 。 单步执行发现不了问题,一自动执行就 在中间的 一个 res = move_window(fs, sect++); 中错误 退出啦。
但是如果我把这张卡在电脑上 写进去一个文件 , 再插到板上就 不会有这个问题啦。 不理解 。。。不理解。。 。。求解?????
FRESULT f_getfree (
const TCHAR* path, /* Path name of the logical drive number */
DWORD* nclst, /* Pointer to a variable to return number of free clusters */
FATFS** fatfs /* Pointer to return pointer to corresponding file system object */
)
{
FRESULT res;
FATFS *fs;
DWORD nfree, clst, sect, stat;
UINT i;
BYTE fat, *p;
/* Get logical drive number */
res = find_volume(fatfs, &path, 0);
fs = *fatfs;
if (res == FR_OK) {
/* If free_clust is valid, return it without full cluster scan */
if (fs->free_clust <= fs->n_fatent - 2) {
*nclst = fs->free_clust;
} else {
/* Get number of free clusters */
fat = fs->fs_type;
nfree = 0;
if (fat == FS_FAT12) { /* Sector unalighed entries: Search FAT via regular routine. */
clst = 2;
do {
stat = get_fat(fs, clst);
if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; }
if (stat == 1) { res = FR_INT_ERR; break; }
if (stat == 0) nfree++;
} while (++clst < fs->n_fatent);
} else { /* Sector alighed entries: Accelerate the FAT search. */
clst = fs->n_fatent; sect = fs->fatbase;
i = 0; p = 0;
do {
if (!i) {
res = move_window(fs, sect++);
if (res != FR_OK) break;
p = fs->win;
i = SS(fs);
}
if (fat == FS_FAT16) {
if (LD_WORD(p) == 0) nfree++;
p += 2; i -= 2;
} else {
if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) nfree++;
p += 4; i -= 4;
}
} while (--clst);
}
fs->free_clust = nfree; /* free_clust is valid */
fs->fsi_flag |= 1; /* FSInfo is to be updated */
*nclst = nfree; /* Return the free clusters */
}
}
LEAVE_FF(fs, res);
}
|