硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1142|回复: 14
收起左侧

[FatFs] sd卡初始化失敗

[复制链接]

6

主题

22

回帖

40

积分

新手上路

积分
40
发表于 2023-6-27 17:13:34 | 显示全部楼层 |阅读模式
本帖最后由 iriss 于 2023-6-27 17:37 编辑

不好意,我想請問sd卡初始化問題
我是利用stm32cube 產生sd相關程式

測試時, 在這函數中橘色區塊發生return, 查一下retrun = SDMMC_ERROR_CMD_CRC_FAIL

有檢查電壓約3.0v, 符合使用範圍2.7~3.6v

感謝



static uint32_t SD_PowerON(SD_HandleTypeDef *hsd)
{
  __IO uint32_t count = 0U;
  uint32_t response = 0U, validvoltage = 0U;
  uint32_t errorstate;

  /* CMD0: GO_IDLE_STATE */
  errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
  if(errorstate != HAL_SD_ERROR_NONE)
  {
    return errorstate;
  }

  /* CMD8: SEND_IF_COND: Command available only on V2.0 cards */
  errorstate = SDMMC_CmdOperCond(hsd->Instance);
  if(errorstate != HAL_SD_ERROR_NONE)
  {
    hsd->SdCard.CardVersion = CARD_V1_X;
    /* CMD0: GO_IDLE_STATE */
    errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
    if(errorstate != HAL_SD_ERROR_NONE)
    {
        return errorstate;
    }

  }
  else
  {
    hsd->SdCard.CardVersion = CARD_V2_X;
  }

  if( hsd->SdCard.CardVersion == CARD_V2_X)
  {
    /* SEND CMD55 APP_CMD with RCA as 0 */
    errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
    if(errorstate != HAL_SD_ERROR_NONE)
    {
        return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
    }
  }
  /* SD CARD */
  /* Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */
  while((count < SDMMC_MAX_VOLT_TRIAL) && (validvoltage == 0U))
  {
    /* SEND CMD55 APP_CMD with RCA as 0 */
    errorstate = SDMMC_CmdAppCommand(hsd->Instance, 0);
    if(errorstate != HAL_SD_ERROR_NONE)
    {
        return errorstate;
    }

    /* Send CMD41 */
    errorstate = SDMMC_CmdAppOperCommand(hsd->Instance, SDMMC_VOLTAGE_WINDOW_SD | SDMMC_HIGH_CAPACITY | SD_SWITCH_1_8V_CAPACITY);
    if(errorstate != HAL_SD_ERROR_NONE)
    {
        return HAL_SD_ERROR_UNSUPPORTED_FEATURE;
    }

    /* Get command response */
    response = SDIO_GetResponse(hsd->Instance, SDIO_RESP1);

    /* Get operating voltage*/
    validvoltage = (((response >> 31U) == 1U) ? 1U : 0U);

    count++;
  }



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2023-6-28 07:38:19 | 显示全部楼层
1、楼主的硬件已经确认没问题了吧,SDIO所涉及到引脚,以及上拉电阻。
2、然后是SDIO的时钟问题。
STM32F4的最高SDIO时钟是50MHz,一般我们都是使用48MHz
https://www.armbbs.cn/forum.php?mod=viewthread&tid=104238

3、最后就是使用的SD卡,可以考虑换几个卡测试看看
回复

使用道具 举报

6

主题

22

回帖

40

积分

新手上路

积分
40
 楼主| 发表于 2023-6-28 10:01:38 | 显示全部楼层
本帖最后由 iriss 于 2023-6-28 12:27 编辑
eric2013 发表于 2023-6-28 07:38
1、楼主的硬件已经确认没问题了吧,SDIO所涉及到引脚,以及上拉电阻。
2、然后是SDIO的时钟问题。
STM32F ...

我是stm32f4板子拉出sdio的8pin(sd模式)到sd卡模塊
請問要如何上拉電阻?

還有個我看書的疑問
stm32f4 系列 最高支持sd版本2.0

那超過2.0 應該還是可以使用, 只是速度就被先限制在25mb/s, 是這樣嗎??
感謝


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2023-6-28 16:45:42 | 显示全部楼层
下载 (3).png
回复

使用道具 举报

6

主题

22

回帖

40

积分

新手上路

积分
40
 楼主| 发表于 2023-6-28 17:23:05 | 显示全部楼层
藍色是cmd
黃色是clk
訊號算是不夠好??
P_20230628_170931.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2023-6-28 17:52:07 | 显示全部楼层
iriss 发表于 2023-6-28 17:23
藍色是cmd
黃色是clk
訊號算是不夠好??

你这个测量的是400KHz? 这个是初始化阶段速度,波形效果可以。

进入正常速度后,幅值多少
回复

使用道具 举报

6

主题

22

回帖

40

积分

新手上路

积分
40
 楼主| 发表于 2023-6-28 18:16:20 | 显示全部楼层
本帖最后由 iriss 于 2023-6-29 09:10 编辑
eric2013 发表于 2023-6-28 17:52
你这个测量的是400KHz? 这个是初始化阶段速度,波形效果可以。

进入正常速度后,幅值多少

初始化應該沒成功
還是一樣跟一開始提問的error

後來我換一張128G卡 version應該是3.0(原來是用1G)
在經過cmd8 這裡走
hsd->SdCard.CardVersion = CARD_V1_X;
這張卡片應該走 hsd->SdCard.CardVersion = CARD_V2_X;

  /* CMD8: SEND_IF_COND: Command available only on V2.0 cards */
  errorstate = SDMMC_CmdOperCond(hsd->Instance);
  if(errorstate != HAL_SD_ERROR_NONE)
  {
    hsd->SdCard.CardVersion = CARD_V1_X;
    db_printf(DB_ALWAYS, "CARD_V1_X\n");
    /* CMD0: GO_IDLE_STATE */
    errorstate = SDMMC_CmdGoIdleState(hsd->Instance);
    if(errorstate != HAL_SD_ERROR_NONE)
    {
        return errorstate;
    }
  }
  else
  {
    hsd->SdCard.CardVersion = CARD_V2_X;
  }
是無法辨認卡片?主要要檢查哪裡??

程式方面主要是移植stm32cube中相關sd卡及fatfs到我的實驗程式上
要收集實驗數據

感謝



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2023-6-29 09:12:58 | 显示全部楼层
iriss 发表于 2023-6-28 18:16
初始化應該沒成功
還是一樣跟一開始提問的error

再找几个其它容量卡测试下,测试前,使用这个小软件格式化试试

SD卡联盟发布的SD/SDHC/SDXC格式化小软件V5.0.1
https://www.armbbs.cn/forum.php?mod=viewthread&tid=96181
回复

使用道具 举报

6

主题

22

回帖

40

积分

新手上路

积分
40
 楼主| 发表于 2023-6-30 18:35:19 | 显示全部楼层
請問HAL_SD_InitCard涵式中SDMMC_CmdBlockLength 函式一直過不了 error= SDMMC_ERROR_CMD_RSP_TIMEOUT

我上網查發現
git看到stm32f4xx_hal_sd.c的HAL_SD_InitCard函式沒有用到SDMMC_CmdBlockLength函式
反倒是HAL_SD_ReadBlocks(), HAL_SD_ReadBlocks_IT(), HAL_SD_WriteBlocks(),   HAL_SD_WriteBlocks_IT() 才用到 SDMMC_CmdBlockLength

我從stm32cubet產生的stm32f4xx_hal_sd.c 中的
HAL_SD_ReadBlocks(), HAL_SD_ReadBlocks_IT(), HAL_SD_WriteBlocks(),   HAL_SD_WriteBlocks_IT() 反而沒用到

想請問是否版本上差異, 還是另有原因??
還想請問 有時卡片初始化有時後會失敗 有時候成功,  需要注意查看哪些區域??
感謝


附上
HAL_StatusTypeDef HAL_SD_InitCard(SD_HandleTypeDef *hsd)
{
  uint32_t errorstate;
  HAL_StatusTypeDef status;
  SD_InitTypeDef Init;
  
  /* Default SDIO peripheral configuration for SD card initialization */
  Init.ClockEdge           = SDIO_CLOCK_EDGE_RISING;
  Init.ClockBypass         = SDIO_CLOCK_BYPASS_DISABLE;
  Init.ClockPowerSave      = SDIO_CLOCK_POWER_SAVE_DISABLE;
  Init.BusWide             = SDIO_BUS_WIDE_1B;
  Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  Init.ClockDiv            = SDIO_INIT_CLK_DIV;

  /* Initialize SDIO peripheral interface with default configuration */
  status = SDIO_Init(hsd->Instance, Init);
  if(status != HAL_OK)
  {

      return HAL_ERROR;
  }

  /* Disable SDIO Clock */
  __HAL_SD_DISABLE(hsd);

  /* Set Power State to ON */
  (void)SDIO_PowerState_ON(hsd->Instance);

  /* Enable SDIO Clock */
  __HAL_SD_ENABLE(hsd);

  /* Required power up waiting time before starting the SD initialization  sequence */
  HAL_Delay(2);

  /* Identify card operating voltage */
  errorstate = SD_PowerON(hsd);
  if(errorstate != HAL_SD_ERROR_NONE)
  {
    hsd->State = HAL_SD_STATE_READY;
    hsd->ErrorCode |= errorstate;
    return HAL_ERROR;
  }

  /* Card initialization */
  errorstate = SD_InitCard(hsd);
  if(errorstate != HAL_SD_ERROR_NONE)
  {
    db_printf(DB_ALWAYS, "SD_InitCard fail\n");
    hsd->State = HAL_SD_STATE_READY;
    hsd->ErrorCode |= errorstate;
    return HAL_ERROR;
  }

  /* Set Block Size for Card */
  errorstate = SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE);
  if(errorstate != HAL_SD_ERROR_NONE)
  {
    /* Clear all the static flags */
    __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
    hsd->ErrorCode |= errorstate;
    hsd->State = HAL_SD_STATE_READY;
    db_printf(DB_ALWAYS, "SDMMC_CmdBlockLength fail:%d\n",errorstate);
    return HAL_ERROR;
  }

  return HAL_OK;
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2023-7-2 09:51:28 | 显示全部楼层
iriss 发表于 2023-6-30 18:35
請問HAL_SD_InitCard涵式中SDMMC_CmdBlockLength 函式一直過不了 error= SDMMC_ERROR_CMD_RSP_TIMEOUT

...

Giit上的是最新版
可以将你的STM32CubeMX对应的HAL库软件包也升级到最新版。

回复

使用道具 举报

6

主题

22

回帖

40

积分

新手上路

积分
40
 楼主| 发表于 2023-7-3 09:32:03 | 显示全部楼层
本帖最后由 iriss 于 2023-7-3 12:01 编辑
eric2013 发表于 2023-7-2 09:51
Giit上的是最新版
可以将你的STM32CubeMX对应的HAL库软件包也升级到最新版。

剛剛去查看  我的stm32cube是6.8.1最新版
git (V1.7.1)上的好像不是官方的


我查到是應該是跟引入 "(void)SDIO_Init(hsd->Instance, hsd->Init); "的階段有關


(void)SDIO_Init(hsd->Instance, hsd->Init); 需要在SDMMC_CmdBlockLength()後才引入
因為"由于SDIO外设已切换到4线模式,而SD卡/SDnand此时仍然处于1线模式,因此配置会出错"

我調整後就能過了
請問的SD卡/SDnand此时仍然处于1线模式是啥意思??

還想請問sd卡要格式化過後才能通過stm初始化??
這樣不是怪怪?


感謝






回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2023-7-3 14:54:56 | 显示全部楼层
iriss 发表于 2023-7-3 09:32
剛剛去查看  我的stm32cube是6.8.1最新版
git (V1.7.1)上的好像不是官方的

你看错了,6.8.1是STM32CubeMX的版本,而1.7.1是你看的HAL库版本。你要看的就是你的CubeMX安装的这个系列芯片的HAL库版本。
回复

使用道具 举报

6

主题

22

回帖

40

积分

新手上路

积分
40
 楼主| 发表于 2023-7-3 17:19:37 | 显示全部楼层
本帖最后由 iriss 于 2023-7-4 14:49 编辑

了解

請問
f_mount 出現 fr_disk_err 錯誤
網路查詢
是說跟ClockDiv有關嗎?
但是這樣換不同張卡
這樣ClockDiv要跟著改

且要卡的ClockDiv如何查詢? 感謝


回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-7-11 13:27:31 | 显示全部楼层

您可以先尝试一下将数据宽度设置为1-bit,我的板子是1-bit 全部OK;修改为4-bit 出现错误。
回复

使用道具 举报

6

主题

22

回帖

40

积分

新手上路

积分
40
 楼主| 发表于 2023-7-12 10:23:52 | 显示全部楼层
感謝回覆, 最後是數據線沒接的問題
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 23:23 , Processed in 0.290875 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表