OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3331|回复: 3

fatfs tf卡读取文件FR_NO_FILESYSTEM

[复制链接]

9

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-7
在线时间
41 小时
发表于 2016-10-26 18:01:14 | 显示全部楼层 |阅读模式
1金钱
使用R0.11a ,读取tf卡文件提示FR_NO_FILESYSTEM。
1、在find_volume()中使用check_fs().在check_fs()中判定LD_WORD(&fs->win[BS_55AA]) != 0xAA55得出fmt=2,于是就返回没有文件系统。
2、使用winhex查看格式化后的tf卡,显示第1、2扇区分别如图所示,参考了http://www.devlabs.cn/?p=226的帖子,MBR中分区表中正确的逻辑0扇区地址到底是啥,求解。此卡在电脑上能正常识别使用,卡应该是没有问题的。程序能正确识别部分卡,不行的都是提示没有文件系统,估计是程序的原因。请各位大大根据图,看看到底是哪出了问题,不胜感激

扇区1

扇区1

扇区2

扇区2
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-10-27 21:55:02 | 显示全部楼层
回复

使用道具 举报

11

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2015-11-19
在线时间
31 小时
发表于 2016-10-27 22:22:48 | 显示全部楼层
你给的网址都说了解决方案了。
回复

使用道具 举报

9

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2016-4-7
在线时间
41 小时
 楼主| 发表于 2016-10-27 23:55:00 | 显示全部楼层
没有用啊,我用的fatfs的版本里有[mw_shl_code=c,true]fmt = check_fs(fs, bsect);                                        /* Load sector 0 and check if it is an FAT boot sector as SFD */
        if (fmt == 1 || (!fmt && (LD2PT(vol)))) {        /* Not an FAT boot sector or forced partition number */
                for (i = 0; i < 4; i++) {                        /* Get partition offset */
                        pt = fs->win + MBR_Table + i * SZ_PTE;
                        br = pt[4] ? LD_DWORD(&pt[8]) : 0;
                }
                i = LD2PT(vol);                                                /* Partition number: 0:auto, 1-4:forced */
                if (i) i--;
                do {                                                                /* Find an FAT volume */
                        bsect = br;
                        fmt = bsect ? check_fs(fs, bsect) : 2;        /* Check the partition */
                } while (!LD2PT(vol) && fmt && ++i < 4);
        }[/mw_shl_code]

今天研究发现,MSD_ReadBlock()在读取DBR扇区时有时会收不到响应,导致检测不到"FAT",所以返回没有文件系统。请问啥原因,spi应该是没问题的啊
[mw_shl_code=applescript,true]uint8_t MSD_ReadBlock(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead)
{
    uint32_t i = 0,len,Times;
    uint8_t rvalue = MSD_RESPONSE_FAILURE;
    uint8_t lDUMMY = 0XFF;
    //        MSD_SpiSpeedSet(1);//高速模式
    /* MSD chip select low */
    MSD_CS_LOW();
    /* Send CMD17 (MSD_READ_SINGLE_BLOCK) to read one block */
    MSD_SendCmd(MSD_READ_SINGLE_BLOCK, ReadAddr, 0xFF);
    /* Check if the MSD acknowledged the read block command: R1 response (0x00: no errors) */
    if (!MSD_GetResponse(MSD_RESPONSE_NO_ERROR))
    {
        /* Now look for the data token to signify the start of the data */
        if (!MSD_GetResponse(MSD_START_DATA_SINGLE_BLOCK_READ))
        {
    //--------------------------  
            Times = NumByteToRead / 8;
            while(Times--)
            {
                for(i = 0;i < 8;i++)
                {
                    SPI_SpiUartWriteTxData(DUMMY);
                }
                SPI_SpiUartClearTxBuffer();
                for(i = 0;i < 8;i++)
                {
                    *pBuffer = SPI_SpiUartReadRxData();
                    pBuffer++;
                }
            }
            /* Get CRC bytes (not really needed by us, but required by MSD) */
            for(i = 0;i < 2;i++)
            {
                SPI_SpiUartWriteTxData(DUMMY);
            }
            SPI_SpiUartClearTxBuffer();
            /* Set response value to success */
            rvalue = MSD_RESPONSE_NO_ERROR;
        }
    }

    /* MSD chip select high */
    MSD_CS_HIGH();
    /* Send dummy byte: 8 Clock pulses of delay */
    MSD_WriteByte(DUMMY);
    /* Returns the reponse */
    //        MSD_SpiSpeedSet(0);
    return rvalue;
}[/mw_shl_code]
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 11:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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