【问题标题】:STM32 SD mounting returns FR_NOT_READY with SDIOSTM32 SD 安装返回 FR_NOT_READY 和 SDIO
【发布时间】:2022-08-18 22:29:05
【问题描述】:

概述

我正在使用STM32F407ZGT6,我目前正在尝试使用FATFS library 将 SD 卡 (MicroSD 32GB HCI and 256GB XCI picture) 安装到板上。由于项目要求,我不想使用 STMCubeMX HAL,所以我将使用裸机。为了处理低级 I/O,我使用colosimo\'s 代码 (diskio_stm32f4xx.c)。

我知道的

编辑:我发现电路板实际上没有合适的上拉电阻。因此,我正在使用 SD 适配器测试Clive Turvey 建议的(47K 欧姆)和what was supposed to be on my board(10K 欧姆)(我已经测试了带有和不带有蓝色元素的电路):

引脚 PC8 到 PC12 和 PD2 设置为上拉模式并作为 SDIO 用于备用功能。在我之前对这个问题的编辑中,我实际上在程序tested for the presence of an SD 的地方被抓住了,因为我的卡检测器不起作用。

问题

编辑:使用我的新设置,f_mount 现在返回FR_NOT_READY /* (3) The physical drive cannot work */,因为\"cmd 1 failed\"。每次在send_cmd 上发送命令,都不会产生响应,保持SDIO->RESP = 0x0 并在超过100ms 时中断:

SDIO->CMD = cmd;
start = msTicks;    //<<-----------SDIO->STA CTIMEOUT already set!!!

while (1) {

    if (elapsed(start) > 100){
        break;      //<<-----------always breaks here
    }

    s = SDIO->STA;
    if (resp_type == RESP_NONE)
        return s & SDIO_STA_CMDSENT ? 1 : 0;
    else {
        /* check if timeout */
        if (s & SDIO_STA_DTIMEOUT) {
            err(\"%s timeout idx=%d arg=%08x\\n\", __func__, idx, (uint)arg); /*!!*/
            return 0;
        }

        /* check if crc err */
        if (s & SDIO_STA_DCRCFAIL) {
            if (idx == 1 || idx == 12 || idx == 41)
                break;
            err(\"%s crcfail idx=%d arg=%08x\\n\", __func__, idx, (uint)arg); /*!!*/
            return 0;
        }

        if (s & SDIO_STA_CMDREND)
            break;  //<<-----------never reaches here
    }
}

buf[0] = SDIO->RESP1;
if (resp_type == RESP_LONG) {
    buf[1] = SDIO->RESP2;
    buf[2] = SDIO->RESP3;
    buf[3] = SDIO->RESP4;
}

return 1;

奇怪的是,除了SDIO-&gt;STA CTIMEOUT 之外,没有设置任何标志,这发生在SDIO-&gt;CMD = cmd 之后。作为参考,这些是在diskio_initialize 上发送的 cmd 命令:

Cart type test cmd_param SDIO-&gt;CMD
sdc v2 8 1096 (0b100 01 001000)
ACMD test 55 1143 (0b100 01 110111)
MMC 1 1089 (0b100 01 000001)

我还测试了我的时钟,我得到了大约 400kHz:

两张卡都会发生同样的事情。在这一点上,我不确定这是硬件问题还是软件问题。

还有其他想法吗?

    标签: c embedded stm32 sd-card spi


    【解决方案1】:

    不是一个绝对的答案,而是一些问题/建议......

    它有助于分离关注点:

    1. 原始 diskio 包是否与磁盘设备通信?
    2. 开发系统上的大多数 FS 软件(可能会创建初始 FS 映像)都需要一个分区表(例如 MBR 或 GPT)。你需要一个吗?
    3. FS 库是否与磁盘库正确通信?
    4. 您使用的是什么 FATFS(例如FAT16FAT32)?
    5. 你有什么样的调试能力(例如gdb或其他STM32特定的调试器)?

      所以,我会写一个在 STM32 上运行磁盘的诊断程序没有至于上面有没有FS。也就是说,将一些数据写入 [raw] 磁盘。你能正确地读回来吗?在您确信磁盘层可以正确访问设备之前,不要打扰 FS 层。

      然后,当您确信原始磁盘 I/O 可以正常工作时,请回答您是否需要分区表的问题。

      它是不是绝对有必要。但是,它允许磁盘[更容易]插入开发系统以创建 FS,在其上放置一些文件,然后验证 STM32 对磁盘做了什么。

      因此,使用开发系统创建 FS 映像。将 SD 卡放入目标(STM32)系统中。使用已知良好的 FS 映像,这应该可以帮助您确定 FS 层是否正在与磁盘通信。

      FS 层应该看到有效的 FS 映像。如果不是,要么它没有正确连接到磁盘 I/O 层,要么它认为 FS 映像是坏的。

      在开发系统上,您应该能够获得图像的十六进制转储。

      大概(希望)您可以让磁盘 I/O 层以十六进制将原始数据转储到 UART/屏幕。

      同样,应该可以让 FS 层做同样的事情。数据应该在流程的所有层都匹配。

    【讨论】:

    • 嘿,克雷格!感谢您的回复。有很多东西要解压。我将进行一些测试并尝试您的建议。当我有一些进展时,我会回复你。
    猜你喜欢
    • 2019-07-31
    • 2019-06-03
    • 2017-05-05
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2022-12-01
    • 2018-12-31
    • 2022-01-24
    相关资源
    最近更新 更多