野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22828|回复: 6

火哥FatFs实验中对SD卡初始化的问题

[复制链接]
发表于 2013-11-20 21:40:46 | 显示全部楼层 |阅读模式
在FatFs实验中,我没有找到队SD卡进行初始化的语句啊,请问火哥,哪一条语句是对SD卡进行初始化的啊?PDF中讲的disk_initialize( 0 );在实验代码中也没有啊
回复

使用道具 举报

发表于 2013-11-20 23:41:50 | 显示全部楼层
旧版的fatfs系统在f_mount函数调用了disk_init,新版的在f_open函数调用了
回复 支持 反对

使用道具 举报

发表于 2013-11-21 00:14:53 | 显示全部楼层
有竞争才有进步嘛
回复 支持 反对

使用道具 举报

发表于 2013-11-21 03:31:25 | 显示全部楼层
不知该说些什么。。。。。。就是谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-21 08:32:06 | 显示全部楼层
随风 发表于 2013-11-20 23:41
旧版的fatfs系统在f_mount函数调用了disk_init,新版的在f_open函数调用了

我在f_mount里和f_open中都找了,都没有disk_init啊?
FRESULT f_mount (
        BYTE vol,                /* Logical drive number to be mounted/unmounted */
        FATFS *fs                /* Pointer to new file system object (NULL for unmount)*/
)
{
        FATFS *rfs;


        if (vol >= _VOLUMES)                /* Check if the drive number is valid */
                return FR_INVALID_DRIVE;
        rfs = FatFs[vol];                        /* Get current fs object */

        if (rfs) {
#if _FS_SHARE
                clear_lock(rfs);
#endif
#if _FS_REENTRANT                                /* Discard sync object of the current volume */
                if (!ff_del_syncobj(rfs->sobj)) return FR_INT_ERR;
#endif
                rfs->fs_type = 0;                /* Clear old fs object */
        }

        if (fs) {
                fs->fs_type = 0;                /* Clear new fs object */
#if _FS_REENTRANT                                /* Create sync object for the new volume */
                if (!ff_cre_syncobj(vol, &fs->sobj)) return FR_INT_ERR;
#endif
        }
        FatFs[vol] = fs;                        /* Register new fs object */

        return FR_OK;
}



FRESULT f_open (
        FIL *fp,                        /* Pointer to the blank file object */
        const TCHAR *path,        /* Pointer to the file name */
        BYTE mode                        /* Access mode and file open mode flags */
)
{
        FRESULT res;
        DIR dj;
        BYTE *dir;
        DEF_NAMEBUF;


        fp->fs = 0;                        /* Clear file object */

#if !_FS_READONLY
        mode &= FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW;
        res = chk_mounted(&path, &dj.fs, (BYTE)(mode & ~FA_READ));
#else
        mode &= FA_READ;
        res = chk_mounted(&path, &dj.fs, 0);
#endif
        INIT_BUF(dj);
        if (res == FR_OK)
                res = follow_path(&dj, path);        /* Follow the file path */
        dir = dj.dir;

#if !_FS_READONLY        /* R/W configuration */
        if (res == FR_OK) {
                if (!dir)        /* Current dir itself */
                        res = FR_INVALID_NAME;
#if _FS_SHARE
                else
                        res = chk_lock(&dj, (mode & ~FA_READ) ? 1 : 0);
#endif
        }
        /* Create or Open a file */
        if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) {
                DWORD dw, cl;

                if (res != FR_OK) {                                        /* No file, create new */
                        if (res == FR_NO_FILE)                        /* There is no file to open, create a new entry */
#if _FS_SHARE
                                res = enq_lock() ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES;
#else
                                res = dir_register(&dj);
#endif
                        mode |= FA_CREATE_ALWAYS;                /* File is created */
                        dir = dj.dir;                                        /* New entry */
                }
                else {                                                                /* Any object is already existing */
                        if (dir[DIR_Attr] & (AM_RDO | AM_DIR)) {        /* Cannot overwrite it (R/O or DIR) */
                                res = FR_DENIED;
                        } else {
                                if (mode & FA_CREATE_NEW)        /* Cannot create as new file */
                                        res = FR_EXIST;
                        }
                }
                if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) {        /* Truncate it if overwrite mode */
                        dw = get_fattime();                                        /* Created time */
                        ST_DWORD(dir+DIR_CrtTime, dw);
                        dir[DIR_Attr] = 0;                                        /* Reset attribute */
                        ST_DWORD(dir+DIR_FileSize, 0);                /* size = 0 */
                        cl = LD_CLUST(dir);                                        /* Get start cluster */
                        ST_CLUST(dir, 0);                                        /* cluster = 0 */
                        dj.fs->wflag = 1;
                        if (cl) {                                                        /* Remove the cluster chain if exist */
                                dw = dj.fs->winsect;
                                res = remove_chain(dj.fs, cl);
                                if (res == FR_OK) {
                                        dj.fs->last_clust = cl - 1;        /* Reuse the cluster hole */
                                        res = move_window(dj.fs, dw);
                                }
                        }
                }
        }
        else {        /* Open an existing file */
                if (res == FR_OK) {                                                /* Follow succeeded */
                        if (dir[DIR_Attr] & AM_DIR) {                /* It is a directory */
                                res = FR_NO_FILE;
                        } else {
                                if ((mode & FA_WRITE) && (dir[DIR_Attr] & AM_RDO)) /* R/O violation */
                                        res = FR_DENIED;
                        }
                }
        }
        if (res == FR_OK) {
                if (mode & FA_CREATE_ALWAYS)                        /* Set file change flag if created or overwritten */
                        mode |= FA__WRITTEN;
                fp->dir_sect = dj.fs->winsect;                        /* Pointer to the directory entry */
                fp->dir_ptr = dir;
#if _FS_SHARE
                fp->lockid = inc_lock(&dj, (mode & ~FA_READ) ? 1 : 0);
                if (!fp->lockid) res = FR_INT_ERR;
#endif
        }

#else                                /* R/O configuration */
        if (res == FR_OK) {                                        /* Follow succeeded */
                if (!dir) {                                                /* Current dir itself */
                        res = FR_INVALID_NAME;
                } else {
                        if (dir[DIR_Attr] & AM_DIR)        /* It is a directory */
                                res = FR_NO_FILE;
                }
        }
#endif
        FREE_BUF();

        if (res == FR_OK) {
                fp->flag = mode;                                        /* File access mode */
                fp->sclust = LD_CLUST(dir);                        /* File start cluster */
                fp->fsize = LD_DWORD(dir+DIR_FileSize);        /* File size */
                fp->fptr = 0;                                                /* File pointer */
                fp->dsect = 0;
#if _USE_FASTSEEK
                fp->cltbl = 0;                                                /* Normal seek mode */
#endif
                fp->fs = dj.fs; fp->id = dj.fs->id;        /* Validate file object */
        }

        LEAVE_FF(dj.fs, res);
}
回复 支持 反对

使用道具 举报

发表于 2013-11-21 13:32:10 | 显示全部楼层
f_open 调用了chk_mounted ,chk_mounted调用了disk_init
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-21 19:20:28 | 显示全部楼层
随风 发表于 2013-11-21 13:32
f_open 调用了chk_mounted ,chk_mounted调用了disk_init

明白了,谢谢你啊
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-23 01:34 , Processed in 0.032781 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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