5 RT-hread 无法挂载SDIO

发布于 2020-07-07 18:01:53

现在使用RT THREAD挂载SDIO和FATFS,配置如下
1.png
2.png
3.png
4.png
5.png
6.png
7.png
8.png
但是始终没有出现如下图所示的SD0 挂载信息,请高手指点问题在哪里,谢谢。
9.png

查看更多

关注者
0
被浏览
338
Aladdin-Wang
Aladdin-Wang 认证专家 2020-07-11

流程看起来没什么问题,用的是别人家的开发板,还是自己的板子,如果是开发板看下手册上sd的使用说明,我记得野火家的开发板要把WIFI的电源关掉才能用,如果自己做的板子,检查一下电路

7 个回答
lizhen9880
lizhen9880 认证专家 2020-07-08

问题分析

通过 SDIO 来驱动 SD Card 其实是不用我们做很多操作的,在 block_dev.c(点击链接查看) 的rt_mmcsd_blk_probe中已经做了注册,默认名称是 "sd0" ,而rt_mmcsd_blk_probe是被init_sd调用的,init_sd被调用的条件是驱动探测到了SD卡(详见点击mmcsd_detect.c)如下:

    err = sdio_io_send_op_cond(host, 0, &ocr);
    if (!err)
    {
        if (init_sdio(host, ocr))
            mmcsd_power_off(host);
        mmcsd_host_unlock(host);
        continue;
    }

    /*
     * detect SD card
     */
    err = mmcsd_send_app_op_cond(host, 0, &ocr);
    if (!err) 
    {
        if (init_sd(host, ocr))
            mmcsd_power_off(host);
        mmcsd_host_unlock(host);
        rt_mb_send(&mmcsd_hotpluge_mb, (rt_uint32_t)host);
        continue;
    }

如果探测到了,那么就执行sd初始化操作。

解决方向

未找到 "sd0" 很可能是硬件故障,底层硬件配置有问题或sd卡没插,可向这几个方向查找。还可在上述几个关键节点设置断点进行debug,看一下到底是何原因导致了系统未走到注册那一步。

另外,附上 sdcard_port.c 供参考,可放置在 ./board/ports

/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-12-13     balanceTWK   add sdcard port file
 */

#include <rtthread.h>

#ifdef BSP_USING_SDCARD

#include <dfs_elm.h>
#include <dfs_fs.h>
#include <dfs_posix.h>

#define DBG_TAG "app.card"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>

void sd_mount(void *parameter)
{
    while (1)
    {
        rt_thread_mdelay(500);
        if(rt_device_find("sd0") != RT_NULL)
        {
            if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK)
            {
                LOG_I("sd card mount to '/'");
                break;
            }
            else
            {
                LOG_W("sd card mount to '/' failed!");
            }
        }
    }
}

int stm32_sdcard_mount(void)
{
    rt_thread_t tid;

    tid = rt_thread_create("sd_mount", sd_mount, RT_NULL,
                           1024, RT_THREAD_PRIORITY_MAX - 2, 20);
    if (tid != RT_NULL)
    {
        rt_thread_startup(tid);
    }
    else
    {
        LOG_E("create sd_mount thread err!");
    }
    return RT_EOK;
}
INIT_APP_EXPORT(stm32_sdcard_mount);

#endif /* BSP_USING_SDCARD */

whj467467222
whj467467222 2020-07-07

楼主你的终端已经显示 sd card mount to "/"
说明sd卡已经成功的挂在了文件系统,且挂载路径根目录

hanlin
hanlin 2020-07-08

那你自己设备启动时候的打印是啥呢。发出来看看呗

guanghui_8
guanghui_8 2020-07-08
#define SD_DEVICE_NAME    "sd0"
X-Jing007
X-Jing007 2020-07-08
  1. 排除下SDTF卡硬件是否异常
  2. 检查SDTF卡引脚是否有正确设置
  3. 检查board.c中SystemClock_Config()有没有设置SDMMC1外设时钟
tiantangii
tiantangii 2020-09-11

遇到一样的问题,在drv_sdio.c里定义SDIO_USING_1_BIT后可以工作起来。
但还没有测试速度和稳定性,个人认为后面还是需要把4BIT模式调试好才行。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友