| 
 
| 
 
 我作用 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);
 }
 
 
 
 
 
 
 
 
 
 | 
 |