搜索
bottom↓
回复: 5

求助,STM32 SPI方式FATFS读SD卡chk_mounted失败

[复制链接]

出0入0汤圆

发表于 2013-7-14 17:18:14 | 显示全部楼层 |阅读模式
我是菜鸟,哪位高手请指点:
从论坛下载的程序,初始化SD卡可以成功,能识别出SDHC卡,SD卡是kingsoft 4GB, 但跑到
        /* Get drive number */
        res = chk_mounted(&path, fatfs, 0);
        if (res == FR_OK)
        {
               .
               .
               .
               .
         }

进入mounted函数后,
       第一次fmt = check_fs(fs, bsect = 0)结果为1,好象是对的
      第二次fmt = check_fs(fs, bsect);        在检查分区时就不对了,得到的fmt结果为2. 仿真看这时的参数bsect=8192;(8192正常么?)
        /* Search FAT partition on the drive. Supports only generic partitionings, FDISK and SFD. */
        fmt = check_fs(fs, bsect = 0);                此处返回的fmt=1, 好象是对的。
        if (LD2PT(vol) && !fmt) fmt = 1;        /* Force non-SFD if the volume is forced partition */
        if (fmt == 1) {                                                /* Not an FAT-VBR, the physical drive can be partitioned */
                /* Check the partition listed in the partition table */
                pi = LD2PT(vol);
                if (pi) pi--;
                tbl = &fs->win[MBR_Table + pi * SZ_PTE];/* Partition table */
                if (tbl[4]) {                                                /* Is the partition existing? */
                        bsect = LD_DWORD(&tbl[8]);        /* Partition offset in LBA */
                        fmt = check_fs(fs, bsect);        在检查分区时就不对了,得到的fmt结果为2./* Check the partition */
                }
        }
        if (fmt == 3) return FR_DISK_ERR;
        if (fmt) return FR_NO_FILESYSTEM;                /* No FAT volume is found */

从下面看,错误是因为不能得到0xAA55结束符号,仿真看也的确是没有。全是 0.
static
BYTE check_fs (        /* 0:FAT-VBR, 1:Valid BR but not FAT, 2:Not a BR, 3:Disk error */
        FATFS *fs,        /* File system object */
        DWORD sect        /* Sector# (lba) to check if it is an FAT boot record or not */
)
{
        if (disk_read(fs->drv, fs->win, sect, 1) != RES_OK)        /* Load boot record */
                return 3;
        if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55)                /* Check record signature (always placed at offset 510 even if the sector size is >512) */
                return 2;

        if ((LD_DWORD(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146)        /* Check "FAT" string */
                return 0;
        if ((LD_DWORD(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146)
                return 0;

        return 1;
}



阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-4-22 15:54:08 | 显示全部楼层
楼主解决了没?我刚接触SD卡和FATFS系统,遇到了和您一样的问题,不知道该怎么解决了,请指教啊

出0入0汤圆

 楼主| 发表于 2016-4-22 17:31:18 | 显示全部楼层
这个都是2013年搞的了,当时是解决了,现在是不记得怎么解决的了。

出0入0汤圆

发表于 2017-3-24 15:32:34 | 显示全部楼层
我的现在也是这个问题(读U盘)
----------求指教
static
FRESULT chk_mounted (        /* FR_OK(0): successful, !=0: any error occurred */
        const TCHAR **path,        /* Pointer to pointer to the path name (drive number) */
        FATFS **rfs,                /* Pointer to pointer to the found file system object */
        BYTE wmode                        /* !=0: Check write protection for write access */
)
{
        BYTE fmt, b, pi, *tbl;
        UINT vol;
        DSTATUS stat;
        DWORD bsect, fasize, tsect, sysect, nclst, szbfat;
        WORD nrsv;
        const TCHAR *p = *path;
        FATFS *fs;


        /* Get logical drive number from the path name */
        vol = p[0] - '0';                                        /* Is there a drive number? */
        if (vol <= 9 && p[1] == ':') {                /* Found a drive number, get and strip it */
                p += 2; *path = p;                                /* Return pointer to the path name */
        } else {                                                        /* No drive number, use default drive */
#if _FS_RPATH
                vol = CurrVol;                                        /* Use current drive */
#else
                vol = 0;                                                /* Use drive 0 */
#endif
        }

        /* Check if the file system object is valid or not */
        *rfs = 0;
        if (vol >= _VOLUMES)                                 /* Is the drive number valid? */
                return FR_INVALID_DRIVE;
        fs = FatFs[vol];                                        /* Get corresponding file system object */
        if (!fs) return FR_NOT_ENABLED;                /* Is the file system object available? */

        ENTER_FF(fs);                                                /* Lock volume */

        *rfs = fs;                                                        /* Return pointer to the corresponding file system object */
        if (fs->fs_type) {                                        /* If the volume has been mounted */
                stat = disk_status(fs->drv);
                if (!(stat & STA_NOINIT)) {                /* and the physical drive is kept initialized (has not been changed), */
                        if (!_FS_READONLY && wmode && (stat & STA_PROTECT))        /* Check write protection if needed */
                                return FR_WRITE_PROTECTED;
                        return FR_OK;                                /* The file system object is valid */
                }
        }

        /* The file system object is not valid. */
        /* Following code attempts to mount the volume. (analyze BPB and initialize the fs object) */

        fs->fs_type = 0;                                        /* Clear the file system object */
        fs->drv = LD2PD(vol);                                /* Bind the logical drive and a physical drive */
        stat = disk_initialize(fs->drv);        /* Initialize the physical drive */
        if (stat & STA_NOINIT)                                /* Check if the initialization succeeded */
                return FR_NOT_READY;                        /* Failed to initialize due to no medium or hard error */       -------------------------------这里报错,不知道原因,求高手指教
        if (!_FS_READONLY && wmode && (stat & STA_PROTECT))        /* Check disk write protection if needed */
                return FR_WRITE_PROTECTED;
#if _MAX_SS != 512                                                /* Get disk sector size (variable sector size cfg only) */
        if (disk_ioctl(fs->drv, GET_SECTOR_SIZE, &fs->ssize) != RES_OK)
                return FR_DISK_ERR;
#endif
        /* Search FAT partition on the drive. Supports only generic partitions, FDISK and SFD. */
        fmt = check_fs(fs, bsect = 0);                /* Load sector 0 and check if it is an FAT-VBR (in SFD) */
        if (LD2PT(vol) && !fmt) fmt = 1;        /* Force non-SFD if the volume is forced partition */
        if (fmt == 1) {                                                /* Not an FAT-VBR, the physical drive can be partitioned */
                /* Check the partition listed in the partition table */
                pi = LD2PT(vol);
                if (pi) pi--;
                tbl = &fs->win[MBR_Table + pi * SZ_PTE];/* Partition table */
                if (tbl[4]) {                                                /* Is the partition existing? */
                        bsect = LD_DWORD(&tbl[8]);                /* Partition offset in LBA */
                        fmt = check_fs(fs, bsect);                /* Check the partition */
                }
        }
        if (fmt == 3) return FR_DISK_ERR;
        if (fmt) return FR_NO_FILESYSTEM;                /* No FAT volume is found */

        /* An FAT volume is found. Following code initializes the file system object */

        if (LD_WORD(fs->win+BPB_BytsPerSec) != SS(fs))                /* (BPB_BytsPerSec must be equal to the physical sector size) */
                return FR_NO_FILESYSTEM;

        fasize = LD_WORD(fs->win+BPB_FATSz16);                                /* Number of sectors per FAT */
        if (!fasize) fasize = LD_DWORD(fs->win+BPB_FATSz32);
        fs->fsize = fasize;

        fs->n_fats = b = fs->win[BPB_NumFATs];                                /* Number of FAT copies */
        if (b != 1 && b != 2) return FR_NO_FILESYSTEM;                /* (Must be 1 or 2) */
        fasize *= b;                                                                                /* Number of sectors for FAT area */

        fs->csize = b = fs->win[BPB_SecPerClus];                        /* Number of sectors per cluster */
        if (!b || (b & (b - 1))) return FR_NO_FILESYSTEM;        /* (Must be power of 2) */

        fs->n_rootdir = LD_WORD(fs->win+BPB_RootEntCnt);        /* Number of root directory entries */
        if (fs->n_rootdir % (SS(fs) / SZ_DIR)) return FR_NO_FILESYSTEM;        /* (BPB_RootEntCnt must be sector aligned) */

        tsect = LD_WORD(fs->win+BPB_TotSec16);                                /* Number of sectors on the volume */
        if (!tsect) tsect = LD_DWORD(fs->win+BPB_TotSec32);

        nrsv = LD_WORD(fs->win+BPB_RsvdSecCnt);                                /* Number of reserved sectors */
        if (!nrsv) return FR_NO_FILESYSTEM;                                        /* (BPB_RsvdSecCnt must not be 0) */

        /* Determine the FAT sub type */
        sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZ_DIR);        /* RSV+FAT+DIR */
        if (tsect < sysect) return FR_NO_FILESYSTEM;                /* (Invalid volume size) */
        nclst = (tsect - sysect) / fs->csize;                                /* Number of clusters */
        if (!nclst) return FR_NO_FILESYSTEM;                                /* (Invalid volume size) */
        fmt = FS_FAT12;
        if (nclst >= MIN_FAT16) fmt = FS_FAT16;
        if (nclst >= MIN_FAT32) fmt = FS_FAT32;

        /* Boundaries and Limits */
        fs->n_fatent = nclst + 2;                                                        /* Number of FAT entries */
        fs->volbase = bsect;                                                                /* Volume start sector */
        fs->fatbase = bsect + nrsv;                                                 /* FAT start sector */
        fs->database = bsect + sysect;                                                /* Data start sector */
        if (fmt == FS_FAT32) {
                if (fs->n_rootdir) return FR_NO_FILESYSTEM;                /* (BPB_RootEntCnt must be 0) */
                fs->dirbase = LD_DWORD(fs->win+BPB_RootClus);        /* Root directory start cluster */
                szbfat = fs->n_fatent * 4;                                                /* (Required FAT size) */
        } else {
                if (!fs->n_rootdir)        return FR_NO_FILESYSTEM;        /* (BPB_RootEntCnt must not be 0) */
                fs->dirbase = fs->fatbase + fasize;                                /* Root directory start sector */
                szbfat = (fmt == FS_FAT16) ?                                        /* (Required FAT size) */
                        fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1);
        }
        if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs))        /* (BPB_FATSz must not be less than required) */
                return FR_NO_FILESYSTEM;

#if !_FS_READONLY
        /* Initialize cluster allocation information */
        fs->free_clust = 0xFFFFFFFF;
        fs->last_clust = 0;

        /* Get fsinfo if available */
        if (fmt == FS_FAT32) {
                 fs->fsi_flag = 0;
                fs->fsi_sector = bsect + LD_WORD(fs->win+BPB_FSInfo);
                if (disk_read(fs->drv, fs->win, fs->fsi_sector, 1) == RES_OK &&
                        LD_WORD(fs->win+BS_55AA) == 0xAA55 &&
                        LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 &&
                        LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) {
                                fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free);
                                fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count);
                }
        }
#endif
        fs->fs_type = fmt;                /* FAT sub-type */
        fs->id = ++Fsid;                /* File system mount ID */
        fs->winsect = 0;                /* Invalidate sector cache */
        fs->wflag = 0;
#if _FS_RPATH
        fs->cdir = 0;                        /* Current directory (root dir) */
#endif
#if _FS_LOCK                                /* Clear file lock semaphores */
        clear_lock(fs);
#endif

        return FR_OK;
}

出0入0汤圆

发表于 2017-3-24 15:33:57 | 显示全部楼层
gasasong 发表于 2016-4-22 15:54
楼主解决了没?我刚接触SD卡和FATFS系统,遇到了和您一样的问题,不知道该怎么解决了,请指教啊 ...

你的后面怎么解决的?

出0入4汤圆

发表于 2017-3-24 20:15:35 | 显示全部楼层
本帖最后由 pspice 于 2017-3-24 20:31 编辑

前一段也搞过fatfs,不过没遇到过这个问题。我建议注意力不要放在fatfs.c等fasfs文件系统这里,仔细检查一下SPI的软、硬件。

补充:我参考的是这个网站的代码:https://stm32f4-discovery.net/20 ... aries-at-one-place/
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 22:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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