qq_49265802 2024-05-31 23:06 采纳率: 0%
浏览 198

stm32初始化sd卡未能成功

stm32f407使用正点原子的sd例程无法进行初始化,HAL_SD_Init(&g_sdcard_handler)这个函数初始化有问题。因为函数分装及调用,经过debug调试最后找到在下面未能完成初始化。

static uint32_t SDMMC_GetCmdResp1(SDIO_TypeDef *SDIOx, uint8_t SD_CMD, uint32_t Timeout)
{
  uint32_t response_r1;
  uint32_t sta_reg;
  
  /* 8 is the number of required instructions cycles for the below loop statement.
  The Timeout is expressed in ms */
  uint32_t count = Timeout * (SystemCoreClock / 8U /1000U);
  
  do
  {
    if (count-- == 0U)
    {
      return SDMMC_ERROR_TIMEOUT;
    }
    sta_reg = SDIOx->STA;
  }while(((sta_reg & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) == 0U) ||
         ((sta_reg & SDIO_FLAG_CMDACT) != 0U ));
    
 _ if(__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT))
  {
    __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT);
    
    return SDMMC_ERROR_CMD_RSP_TIMEOUT;
  }
  else if(__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL))
  {
    __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL);
    
    return SDMMC_ERROR_CMD_CRC_FAIL;
  }

img


就是在这里直接就返回SDMMC_EEROR_CMD_RSP_TIMEOUT。
我自己尝试拔出sd卡,发现也是在这里返回这个宏。

按照我的理解应该是初始化没有问题,能读取sd卡的数据。

是我的程序移植有问题还是硬件问题还是其他什么呢?
卡了两天了(大哭!)
在csdn上的第一个问题,如有不对请多指教!

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-05-31 23:07
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的代码段和描述,出现SDMMC_ERROR_CMD_RSP_TIMEOUT错误通常意味着在尝试与SD卡通信时,没有收到预期的响应。这可能是由多种原因引起的,包括但不限于:

    1. 硬件连接问题:确保SD卡与STM32F407之间的硬件连接是正确的,包括数据线和时钟线。

    2. SD卡问题:SD卡可能存在问题,尝试使用另一张SD卡看是否能够初始化成功。

    3. 时钟配置问题:确保SDIO时钟配置正确,时钟频率可能过高或过低,导致SD卡无法正常响应。

    4. 初始化序列问题:检查初始化过程中发送的命令序列是否正确,以及是否正确地处理了SD卡的响应。

    5. 中断或DMA配置问题:如果使用中断或DMA进行数据传输,确保相关配置正确。

    6. 电源问题:确保SD卡的电源供应稳定。

    7. 代码问题:检查代码中是否有逻辑错误,或者是否有未处理的特殊情况。

    针对您提供的代码段,这里有一些建议:

    • 检查SystemCoreClock的值是否正确设置,因为超时计算依赖于这个值。
    • 确保SDIO_FLAG_CTIMEOUT标志的检测逻辑是正确的。在您的代码中,_前缺少了dowhile,这可能是一个语法错误。正确的代码应该是:
    do
    {
      if (count-- == 0U)
      {
        return SDMMC_ERROR_TIMEOUT;
      }
      sta_reg = SDIOx->STA;
    } while(((sta_reg & (SDIO_FLAG_CCRCFAIL | SDIO_FLAG_CMDREND | SDIO_FLAG_CTIMEOUT)) == 0U) ||
             ((sta_reg & SDIO_FLAG_CMDACT) != 0U));
    
    if (__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT))
    {
      __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CTIMEOUT);
      return SDMMC_ERROR_CMD_RSP_TIMEOUT;
    }
    else if (__SDIO_GET_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL))
    {
      __SDIO_CLEAR_FLAG(SDIOx, SDIO_FLAG_CCRCFAIL);
      return SDMMC_ERROR_CMD_CRC_FAIL;
    }
    
    • 检查SDIOx->STA寄存器的值,确保在命令执行期间没有其他错误标志被设置。

    • 考虑添加更多的调试信息,比如在循环中打印sta_reg的值,以便更好地理解在超时发生之前发生了什么。

    • 如果可能,尝试使用STM32CubeMX工具生成的初始化代码,或者查找STM32官方提供的示例代码,以确保初始化过程的正确性。

    最后,如果问题仍然存在,您可能需要使用逻辑分析仪来检查SDIO总线上的通信,以确定问题的具体原因。

    关于参考资料,您可以查看STM32的官方文档,特别是关于SDIO接口的部分,以及HAL库的API文档。这些文档通常可以在ST官方网站上找到。此外,社区论坛如CSDN、Stack Overflow等也是获取帮助的好地方。

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 5月31日
  • 创建了问题 5月31日