打印
[STM32F3]

SPI 读写SD卡 fat 文件系统 f_getfree("/",&freem,&pfs)

[复制链接]
4808|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主



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








沙发
qxs773@163.com|  楼主 | 2016-3-30 00:00 | 只看该作者
我也试过 在检测 之间 用 f_write  先写入一个文件,结果还是不行,
f_write(&File, "sysboot1234567890", 17, &bw);  /* Write it to the dst file */
f_close(&File); /*关闭文件*/


这种样子像是  FSINFO  信息 没有 读取到,所以只能 逐个扫描空闲扇区  。

使用特权

评论回复
板凳
qxs773@163.com|  楼主 | 2016-3-30 00:03 | 只看该作者
求高人指教

使用特权

评论回复
地板
qxs773@163.com|  楼主 | 2016-4-4 10:41 | 只看该作者
本帖最后由 qxs773@163.com 于 2016-4-4 10:49 编辑

没有人呀,自己慢慢摸索找到原因啦。
原来是  win7新格式化FAT32 后 FSINFO  信息 没有写入SD卡相应的扇区,
新写个文件后才能 更新 FSINFO  信息
FSINFO信息扇区
FAT32在保留区中增加了一个FSINFO扇区,用以记录文件系统中空闲簇的数量以及下一可用簇的簇号等信息,以供操作系统作为参考。
FSINFO信息扇区结构
大多数的FSINFO信息扇区一般位于文件系统的1号扇区,结构非常简单。
字节偏移(十六进制) 字节数 含义
00~03          4               扩展引导标志“52526141”
04~1E3        480          未使用
1E4~1E7      4            FSINFO签名“72724161”
1E8~1EB      4             空闲簇数
1EC~1EF      4             下一可用簇号
1F0~1FD      14             未使用
1EE~1EF      2               “55 AA”标志





QQ截图20160404100837.png (33.36 KB )

FSINFO 信息 在DBR的 0x30 0x31

FSINFO 信息 在DBR的 0x30 0x31

QQ截图20160404103747.png (87.44 KB )

引导区DBR SD的第一扇区

引导区DBR SD的第一扇区

QQ截图20160404104111.png (39.85 KB )

正常的FSINFO 信息 ,红色空闲簇,黄色下一个可用簇号

正常的FSINFO 信息 ,红色空闲簇,黄色下一个可用簇号

新格式化后的 FSINFO 空闲簇 是无效的.png (38.7 KB )

新格式化后的 FSINFO  空闲簇 是无效的.png

使用特权

评论回复
5
godlovedeath| | 2022-6-13 10:10 | 只看该作者
请问一下,是怎么解决的呀,看到了后面的解释,但是不知道怎么解决呀,要在getfree前调用什么函数吗

使用特权

评论回复
6
typeof| | 2022-7-8 15:17 | 只看该作者
可以dma读取吗   

使用特权

评论回复
7
updownq| | 2022-7-9 15:40 | 只看该作者
现在开发sd卡的东西真多。   

使用特权

评论回复
8
pentruman| | 2022-7-9 18:03 | 只看该作者
FATFS操作系统吗   

使用特权

评论回复
9
claretttt| | 2022-7-9 19:47 | 只看该作者
可以驱动usb吗  

使用特权

评论回复
10
vivilyly| | 2022-7-9 21:00 | 只看该作者
可以读取FAT32?  

使用特权

评论回复
11
wilhelmina2| | 2022-7-9 21:47 | 只看该作者
硬件spi的速度可以到多少呢   

使用特权

评论回复
12
juventus9554| | 2022-7-10 12:59 | 只看该作者
可以dma读取吗   

使用特权

评论回复
13
q413443137| | 2022-12-26 17:17 | 只看该作者
这个是怎么工具?可以这样看,  我现在也遇到这样的问题,我调用f_getfree 函数,得不到准确的,容量信息。

使用特权

评论回复
14
jonas222| | 2023-1-5 13:51 | 只看该作者
可能没有格式化?              

使用特权

评论回复
15
uptown| | 2023-1-5 14:01 | 只看该作者
扫描硬件有什么问题吗?              

使用特权

评论回复
16
mmbs| | 2023-1-5 15:48 | 只看该作者
这个可能是SD卡有问题的。              

使用特权

评论回复
17
Jacquetry| | 2023-1-5 16:52 | 只看该作者
win7新格式化FAT32 后 FSINFO  信息 没有写入SD卡相应的扇区

使用特权

评论回复
18
houjiakai| | 2023-1-6 13:26 | 只看该作者
是不是没有挂载成功呢?              

使用特权

评论回复
19
wwppd| | 2023-1-6 16:17 | 只看该作者
你看看配置是FATFS是否存在问题?

使用特权

评论回复
20
youtome| | 2023-1-12 19:35 | 只看该作者
这个move windows是哪个功能函数?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

48

帖子

4

粉丝