FATFS 0.13 f_mount(&fs,““,1)挂载失败的原因

2023-11-04

这两天学着用了一下FATS文件系统,虽然工作中没用到,但是对个人的经验积累还是有用的。看了一下,代码并不多,但是精简啊,指针跳来跳去的一不小心就晕了。
所以也遇到了不少问题啊。

 

这里就讲一下我遇到的第一步就懵逼的问题。

 

那就是

FRESULT f_mount (
        FATFS* fs,                        /* Pointer to the filesystem object (NULL:unmount)*/
        const TCHAR* path,        /* Logical drive number to be mounted/unmounted */
        BYTE opt                        /* Mode option 0o not mount (delayed mount), 1:Mount immediately */
)

使用的是SDIO带闪迪1G的TF卡,根据说明和0.9版本使用例程我这样写f_mount(&fs , "" , 1);
返回值0没有问题,高兴的想读个文件试试。
res =f_open(&fsrc,"0:/test.txt",FA_OPEN_EXISTING | FA_READ); // 打开文件
结果返回13。

 

上面就是我杠上的原因,挂载成功了你却告诉我没有文件系统。
然后跟踪f_open函数里面调用了find_volume 判断逻辑驱动号,如果需要的话就挂载。
继续跟踪find_volume里面调用了vol = get_ldnumber获取逻辑驱动号  返回的是0
然后回到find_volume
fs->pdrv = LD2PD(vol),修改了pdrv.
然后下一句是
 
stat = disk_initialize(fs->pdrv);好吧,这里终于到了接口文件diskio.c里面.
 
跟踪进去一看,
[mw_shl_code=c,true]DSTATUS disk_initialize (
        BYTE pdrv                                /* Physical drive nmuber to identify the drive */
)
{
        DSTATUS stat;
        int result;

        switch (pdrv) {
        case DEV_RAM :
//                result = RAM_disk_initialize();
                // translate the reslut code here
                return stat;
        case DEV_MMC :
//                result = MMC_disk_initialize();
                // translate the reslut code here
                return stat;
        case DEV_USB :
//                result = USB_disk_initialize();
                // translate the reslut code here
                return stat;
        }
        return STA_NOINIT;
}
[/mw_shl_code]
根据传入参数0,到了case DEV_RAM: 问题来了,我是TF卡啊,这里应该是case DEV_MMC:啊。
那这就好理解了,传入参数有问题,应该是1.
这个传入参数是从这里出来的vol = get_ldnumber那就进这个函数仔细看吧。
 
int get_ldnumber (            /* Returns logical drive number(-1:invalid drive) */
         const TCHAR** path        /*Pointer to pointer to the path name */
)
 
输入参数是path地址,我的地址是    "0:/test.txt"   ,
程序里判断句

i = *tp++,也就是地址冒号前的'0'。
经过下面的一段


i  -='0';  // i = 0;
所以返回的vol就成了0!!!好嘛!原来是这里啊。
那我就改成res = f_open(&fsrc,"1:/test.txt",FA_OPEN_EXISTING |FA_READ);
擦,结果错误返回的是11,FR_INVALID_DRIVE 逻辑驱动号错误???
好,继续查,找到在f_mount里面
 
         /*Get logical drive number */
         vol= get_ldnumber(&rp);
         if(vol < 0) return FR_INVALID_DRIVE;
 
意思我的 get_ldnumber返回的不是1?

 

开启调试模式返回的竟然是0XFFFFFFF即   -1。

又到get_ldnumber里面看到

if ((i -= '0') < FF_VOLUMES) {        /* If drive id is found, get the valueand strip it */

 

这里FF_VOLUMES 在ffconfig.h里面定义的是1

 

#define FF_VOLUMES                1
/* Number of volumes (logical drives) to beused. (1-10) */

 

导致我的i -= '0',   i =1;  不满足< FF_VOLUMES导致返回了vol的初始化值 -1.

 

那好啊,我修改一下FF_VOLUMES =2

 

擦,结果返回了错误12,逻辑驱动没有工作区域,那我刚才挂载的呢!等等,我刚才挂载的是地址是默认地址""  ,而默认地址是0:啊。来来来,赶快修改成
f_mount(&fs,"1:",1);


 

编译,下载!见证奇迹的时刻到了,成功读到了文件。

 

回头总结一下问题,主要是逻辑驱动号没弄好,因为diskio.c的默认分了三种类型的存储类型RAM/MMC/USB
而默认的是RAM所以,如果在不修改它的框架情况下,就要逻辑驱动号对应。

 

TF卡对应MMC所以要地址要是   1:         ,ffconfig里默认了只有一个逻辑驱动号0所以需要修改设置

 

FF_VOLUMES = 2
程序这样写
f_mount(&fs,"1:",1);
f_open(&fsrc,"1:/test.txt",FA_OPEN_EXISTING| FA_READ);

 

FAT 0.13 f_mount(&fs,"",1)挂载失败的原因-OpenEdv-开源电子网

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FATFS 0.13 f_mount(&fs,““,1)挂载失败的原因 的相关文章

  • 芯片的SD/MMC控制器以及SD卡介绍

    1 MMC SD卡 eMMC介绍 1 1 三者关联 1 最早出现的是MMC卡 卡片式结构 按照MMC协议设计 相较于NandFlash芯片来说 MMC卡有2个优势 第一是卡片化 便于拆装 第二是统一了协议接口 兼容性好 2 后来出现SD卡
  • SPI协议读写SD卡介绍

    前言 在前面的文章中 我们主要介绍了如何利用SDIO协议对SD卡进行读写操作的流程及注意事项 虽然SDIO协议读写SD卡的效率很高 但是 操作却比较麻烦 另外 还需要使用的芯片具有SDIO外设 这对于不具备SDIO外设的芯片而言 绝对是一个
  • 基于SD卡的FatFs文件系统(FatFs移植到STM32)

    平台 STM32ZET6 核心板 ST LINK V2 SD卡 USB串口线 一 移植 工程介绍 主要文件在USER组中 bsp sdio sdcard c bsp sdio sdcard h和main c 另外FatFs是用来后面移植文件
  • FATFS文件系统详解

    FATFS文件系统详解 文章目录 FATFS文件系统详解 1 简介 2 基础概念 3 FAT文件系统组成介绍 4 FAT文件系统分析 4 1 采用FAT格式格式化SD nand sd卡 4 2 引导扇区分析 4 3 分区偏移及大小计算 4
  • FATFS 0.13 f_mount(&fs,““,1)挂载失败的原因

    这两天学着用了一下FATS文件系统 虽然工作中没用到 但是对个人的经验积累还是有用的 看了一下 代码并不多 但是精简啊 指针跳来跳去的一不小心就晕了 所以也遇到了不少问题啊 这里就讲一下我遇到的第一步就懵逼的问题 那就是 FRESULT f
  • STM32的简单的SD卡读写

    导读 SD卡一般支持两种读写模式 SPI和SDIO模式 SD卡的引脚排序如下图所示 SPI模式下有几个重要的操作命令 分别是 SD卡R1回应的格式如下SPI模式下的典型初始化过程如下 1 初始化硬件配置 SPI配置 IO配置等 SD卡一般支
  • S3C2440读写sd卡的一些总结

    整理硬盘的时候发现这个文档 以前写2440操作sd卡程序的时候总结的 1 我的2440 sdi对sd卡发送ACMD41时总是反馈crc fail 但是可以得到正确的response sd卡可以正常使用 2 sd卡可以没有mbr 在物理的 0
  • SD卡SPI模式 读写block

    声明 第一次写教程 如若有错误 请指出更正 看了很多网上的教程 还是觉得很多教程中 写多个块的时候有些问题 因此经过3天的奋斗 写出自己的教程 本教程中 没有挂载文件系统 单纯读写Block 会破坏分区和数据 下节再 装上文件系统Fatfs
  • STM32+FATFS文件系统连续在同一个txt文件里写入内容

    移植好fatfs文件系统之后 我们经常要在一个txt文件下写入数据 但是这些数据可能需要多次写入 那怎么办呢 通过这几天的学习 有以下函数可以帮助我们进行多次写入数据 1 打开文件 f open filescr2 0 201711022 t
  • SD卡/TF卡简记

    文章目录 MicroSD卡与SD卡关系与区别 对比NM卡 XQD卡 CFexpress卡 SD规格标识 FAQ 拍摄1080p或2k视频需要什么速度的sd卡 拍摄4k视频需要什么速度的sd卡 拍摄8k视频需要什么速度的sd卡 MicroSD
  • STM32 SPI方式读写SD卡

    前段时间在51上模拟SPI实现了对SD卡的读取 效果还算不错 最近将其移植到STM32上 不过使用硬件SPI和使用软件SPI还是有差别的 代码如下 void User SPIInit void GPIO InitTypeDef GPIO I
  • fatfs移植和使用(在SPI_FLASH上建立文件系统)

    文件系统对于嵌入式系统的重要性是不言而喻的 有了文件系统管理数据和外设变得方便许多 同时简化了应用的开发 今天我们来以在SPI FLASH上建立文件系统为例 看看FATFS文件系统怎么移植和使用 需要准备的材料有 1 FATFS文件系统源码
  • MMC、SD、TF、SDIO、SDMMC简介

    MMC 概念 MMC的全称是 MultiMediaCard 所以也通常被叫做 多媒体卡 是一种小巧大容量的快闪存储卡 特别应用于移动电话和数字影像及其他移动终端中 外形及接口定义 如上图所示 MMC存贮卡只有7pin 可以支持MMC和SPI
  • 发布一个在读写sd卡时,此时sd卡拔出造成死机的处理方法

    发布一个在读写sd卡时 此时sd卡拔出造成死机的处理方法 同时也在此记录一下 以备后用及有需要人们参考 stm32f4xx hal sd c 红色的代码是增加上去的 函数名称 static HAL SD ErrorTypedef SD Cm
  • SD卡、TF卡读写速率测试

    请注意 可以在未经过博主同意下转载 但必须注明出处 谢谢 1 运行HDBENCH软件 点击确定 2 弹出如下图所示界面 配置选项并测试 选择待测TF卡 Removable可移动存储设备 图示所插入的TF卡是 I 盘 请根据实际情况选择 选择
  • SD卡 FATFS CSV 文件中的 逗号和换行

    RFC 4180 Common Format and MIME Type for Comma Separated Values CSV Files 要点有 1 CSV的换行符号要使用CRLF 即 回车符 换行符 的形式 2 文字可以使用双引
  • FATFS实现数据追加功能(原文不覆盖)

    在对FATFS的应用中我们经常需要把采集的数据存入的文件中 用作保存 也许我们的系统是一个长期的运行过程 但是我们的数据可能不是持续采集的 所以我们这样写代码 注册一个工作区域 f mount 0 fs 打开创建一个新文件 res f op
  • SD卡初始化以及命令详解

    SD卡是嵌入式设备中很常用的一种存储设备 体积小 容量大 通讯简单 电路简单所以受到很多设备厂商的欢迎 主要用来记录设备运行过程中的各种信息 以及程序的各种配置信息 很是方便 有这样几点是需要知道的 SD 卡是基于 flash 的存储卡 S
  • 关于如何修复烧写镜像文件失败的SD卡

    前言 使用某些软件 比如 win32 Disk Imager 向SD卡烧写镜像文件时 很有可能出现烧写失败的情况 通常如果烧写失败 系统会弹出请求格式化SD卡的提示框 此时不要点格式化 点了可能会造成不可挽救的结果 也可能不会 而是进行以下
  • 【正点原子探索者STM32F407开发板例程连载+教学】第30章 SPI通信实验

    第三十章 SPI 实验 mw shl code c true 1 硬件平台 正点原子探索者STM32F407开发板 2 软件平台 MDK5 1 3 固件库版本 V1 4 0 mw shl code 本章我们将向大家介绍STM32F4的SPI

随机推荐

  • es脚本 实现字段之间进行比对

    script script source ctx source extra test lang painless query term user kimchy java BoolQueryBuilder boolQueryBuilder Q
  • 详解比较古怪的字符串拆分函数:strtok函数

    对于字符串中的标点符号 字符呀 如何能够当作分隔符来对原字符串进行分割呢 分割出来的为一段一段的字符 因此 在这里面就用到了 本文 比较古怪的字符串拆分函数 strtok函数 假设 对于这个字符串 woaini wangyijun com
  • 3.4 三级指针

    char p NULL 注 1 可以通过三级指针间接的改变二级指针的指向 2 p表示 三级指针指向的二级指针中保存的内存地址 3 三级指针做函数参数时 主调函数需要传2级指针的地址 4 n级指针可以间接修改n 1级指针的指向 下面的例子通过
  • @Component注解的作用

    Spring自带的 Component注解及扩展 Component 定义Spring管理Bean 也就是将标注 Component注解的类交由spring管理 AspectJ风格的切面可以通过 Compenent注解标识其为Spring管
  • VMware10上新建虚拟机步骤图解 + 安装Centos 7(64位) 系统

    原文 https blog csdn net hometing218 article details 79486172
  • RTKlib单点定位-部分思考

    塔奇克敲代码 博主的博客 RTKLIB源码解析 单点定位 将单点定位部分整理成函数小卡片 为我理解RTKlib提供了很大的帮助 他在单点定位部分列出了一些疑惑 在此我记录下我对部分疑惑的理解 文章目录 1 pntpos函数 2 satpos
  • vcs+verdi,以及Makefile注意点

    Makefile 命令行之前是以Tab开头的不然会报错 gvim里面强制输入tab 使用Ctr v i 直接使用tab键可能输入不成功 注释用 下面是makefile内容 L8 可选debug debug pp debug pp 使能ucl
  • 树莓派通信协议——MQTT的安装及使用

    MQTT是一种基于TCP IP协议栈构建的异步通信协议 是一种轻量级的发布 订阅信息传输协议 基于topic订阅关系的发布和推送 在实践中可空间上 将消息发送者和接受者分离 可以再不可靠的网络环境中进行扩展 适用于设备硬件存储空间有限或网络
  • 【满分】【华为OD机试真题2023 JAVA&JS】木板

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 木板 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 小明有n块木板 第i 1 i n 块木板的长度为ai 小明买了一块长度为m的木料 这块木料可以切割成任意块
  • R手册(NLP)--wordcloud2

    文章目录 wordlcoud2函数 letterCloud函数 shiny支持 wordcloud2 R interface to wordcloud for data visualization Wordcloud2主要包括两个函数 wo
  • ‘XXX’ is already defined @typescript-eslint/no-redeclare 警告 问题解决

    上文React Typescript项目环境中搭建并使用redux环境 结束是 其实不算完全写完吧 还会留下一个警告 这个报错 好像是说 这两个值已经定义过了 可能很多人 会觉得小问题 但你会发现 无论你名字怎么改都会一直 带着你新的名字继
  • Jenkins+sonarqube+sonar-scanner扫描java文件乱码怎么解决?

    在jenkins上扫描java项目 提示乱码 有没有知道怎么解决啊 WARN Invalid character encountered in file root jenkins workspace sonar scanner rrdl t
  • Element中table组件根据属性合并行数据

    在实际开发中 要求使用elementUI的table组件对表格数据上下行相邻相同的数据进行合并 在elem官网上查看到是有对应的组件和合并方法
  • apache doris和StarRocks的区别

    Apache Doris是一个分布式的列式存储系统 它的设计目标是提供大规模数据处理的可靠性和高性能 Doris采用了集群方式 通过将数据分布在多个机器上进行处理来提高性能 并提供了SQL查询接口方便用户使用 StarRocks是一个分布式
  • 【Windows10下MySQL(8.0)免费版安装与卸载图文教程】

    WIN10安装MYSQL8 0图文教程 Windows10下MySQL 8 0版本 免费版安装与卸载 一 下载 二 解压 三 创建配置文件以及存放数据的文件夹 四 配置系统环境变量 五 以管理员打开命令窗口 Win键 X键 六 安装 七 连
  • idea access数据库连接_几款好用的数据库,选择适合自己的那盘菜

    先来说一下什么是数据库 通俗讲 它就像物品仓库一样 可以存储电子数据 但是不同的是 它是以一定数据结构进行存储的 用户也可以对其中的数据通过一定的语言方式进行新增 查询 更新 删除等操作 大家接触的比较多的是Excel数据表格 实际它只能称
  • Elasticsearch-head插件安装教程

    目录标题 前言 一 安装node 二 安装Elasticsearch head插件 1 上传压缩包到 opt es路径下去 2 解压安装包 3 192 168 43 10机器修改Gruntfile js 4 192 168 43 10机器修
  • spdk探秘-----块设备开发指导

    这里的块设备是一种存储设备 它支持在固定大小的块中读写数据 这些块通常是512或4096字节 这些设备可能是软件中的逻辑结构 或者对应于像NVMe ssd这样的物理设备 通用库的公共头文件是bdev h 它是与任何类型的块设备交互所需的全部
  • 面经四(多线程的状态)

    援引于线程有哪些状态 每个状态是什么意思 又是如何切换的 线程状态 生命周期 1 新建状态 new 创建线程对象 但是没有交给CPU 也就是没有调用start 方法 只有一个Thread对象 还没有一个真正的线程 每个线程只存在一次新建状态
  • FATFS 0.13 f_mount(&fs,““,1)挂载失败的原因

    这两天学着用了一下FATS文件系统 虽然工作中没用到 但是对个人的经验积累还是有用的 看了一下 代码并不多 但是精简啊 指针跳来跳去的一不小心就晕了 所以也遇到了不少问题啊 这里就讲一下我遇到的第一步就懵逼的问题 那就是 FRESULT f