梦可尤曦 2023-12-04 18:06 采纳率: 50%
浏览 9

单片机用的fatfs系统,可以检测到TF卡也可以读取和写入数据,但是我用f_readdir函数时总是失败,

单片机用的fatfs系统,可以检测到TF卡也可以读取和写入数据,但是我用f_readdir函数时总是失败,

img

TF卡中有数据

img

这个是读取目录下的文件,官方示例

img

这个是我调用的函数,第一个是初始化SPI协议,引脚,挂载,啥的
第二个是读取文件里的内容(被我注释掉了),
第三个是读取目录下的文件,也就是上个图里的函数
第四个是解除挂载

当我注释掉第二个后,单片机一直重启,并且目录下什么也没有检测到

img

后来我逐行标注,最后显示

img

到这一行时,单片机重启。

但是我把第二个读取的解除注释后,单片机正常运行,并且检测目录下文件成功

img

img

我想问一下为啥出现哪里错了。

下面是几个函数代码

img

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-04 20:18
    关注

    【以下回答由 GPT 生成】

    ////////////////////////////////////////
    // 初始化SPI协议, 引脚配置
    ////////////////////////////////////////
    void spi_init() {
        // SPI协议初始化
        // ...
    
        // 引脚配置
        // ...
    }
    
    ////////////////////////////////////////
    // 挂载TF卡
    ////////////////////////////////////////
    FRESULT mount_sd_card() {
        FRESULT res;
    
        // 初始化SPI协议, 引脚配置
        spi_init();
    
        // 挂载TF卡
        res = f_mount(&SDC_FS, "", 0);
        if (res != FR_OK) {
            // 挂载失败
            return res;
        }
    
        return FR_OK;
    }
    
    ////////////////////////////////////////
    // 读取目录下的文件
    ////////////////////////////////////////
    FRESULT read_directory() {
        FRESULT res;
        DIR dir;
        FILINFO fno;
    
        // 挂载TF卡
        res = mount_sd_card();
        if (res != FR_OK) {
            // 挂载失败
            return res;
        }
    
        // 打开目录
        res = f_opendir(&dir, "/");
        if (res != FR_OK) {
            // 打开目录失败
            return res;
        }
    
        // 读取目录下的文件
        while (1) {
            res = f_readdir(&dir, &fno);
            if (res != FR_OK || fno.fname[0] == 0) {
                // 读取失败或者到达目录末尾
                break;
            }
            if (fno.fattrib & AM_DIR) {
                // 文件夹
                // ...
            } else {
                // 文件
                // ...
            }
        }
    
        // 关闭目录
        f_closedir(&dir);
    
        return FR_OK;
    }
    
    ////////////////////////////////////////
    // 解除挂载TF卡
    ////////////////////////////////////////
    void unmount_sd_card() {
        // 取消挂载TF卡
        f_mount(NULL, "", 0);
    
        // 取消SPI协议
        // ...
    }
    

    问题分析:

    根据你提供的代码,问题可能出现在挂载TF卡和读取目录文件之间。

    当注释掉第二个读取函数后,并且单片机不断重启,可能是由于挂载的TF卡没有正常初始化导致的。因为在第二个函数中,可能存在一些和初始化TF卡相关的代码。

    解决方案:

    1. 首先,检查第二个读取函数中是否进行了TF卡的初始化操作。你可以将相关代码提供给我来更好地分析问题。
    2. 如果第二个读取函数确实进行了初始化操作,确保代码中的TF卡初始化操作正确,如SPI引脚配置、时钟设置等。你可以参考TF卡的硬件规格和单片机的手册来确保正确的初始化序列。
    3. 如果你不能提供TF卡初始化代码或无法确定是否初始化正确,请尝试从库文件中获取相关文档,或者与厂商或社区支持进行联系。
    4. 最后,确保挂载和取消挂载的操作正确。你可以通过打印调试信息或使用示波器来验证操作是否生效。

    如果你可以提供更详细的代码或相关信息,我将能够更好地帮助你解决问题。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月4日

悬赏问题

  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错