diff --git a/components/sdmmc/sdmmc_common.c b/components/sdmmc/sdmmc_common.c index c28d447581..6ad6f00a34 100644 --- a/components/sdmmc/sdmmc_common.c +++ b/components/sdmmc/sdmmc_common.c @@ -28,17 +28,27 @@ esp_err_t sdmmc_init_ocr(sdmmc_card_t* card) */ uint32_t host_ocr = get_host_ocr(card->host.io_voltage); - if ((card->ocr & SD_OCR_SDHC_CAP) != 0) { - host_ocr |= SD_OCR_SDHC_CAP; + + /* In SPI mode, the only non-zero bit of ACMD41 is HCS (bit 30) + * In SD mode, bits 23:8 contain the supported voltage mask + */ + uint32_t acmd41_arg = 0; + if (!host_is_spi(card)) { + acmd41_arg = host_ocr; } + + if ((card->ocr & SD_OCR_SDHC_CAP) != 0) { + acmd41_arg |= SD_OCR_SDHC_CAP; + } + /* Send SEND_OP_COND (ACMD41) command to the card until it becomes ready. */ - err = sdmmc_send_cmd_send_op_cond(card, host_ocr, &card->ocr); + err = sdmmc_send_cmd_send_op_cond(card, acmd41_arg, &card->ocr); /* If time-out, re-try send_op_cond as MMC */ if (err == ESP_ERR_TIMEOUT && !host_is_spi(card)) { ESP_LOGD(TAG, "send_op_cond timeout, trying MMC"); card->is_mmc = 1; - err = sdmmc_send_cmd_send_op_cond(card, host_ocr, &card->ocr); + err = sdmmc_send_cmd_send_op_cond(card, acmd41_arg, &card->ocr); } if (err != ESP_OK) { diff --git a/components/sdmmc/sdmmc_common.h b/components/sdmmc/sdmmc_common.h index e07ebd9109..34d584e6b4 100644 --- a/components/sdmmc/sdmmc_common.h +++ b/components/sdmmc/sdmmc_common.h @@ -41,7 +41,7 @@ /* Maximum retry/error count for SEND_OP_COND (CMD1). * These are somewhat arbitrary, values originate from OpenBSD driver. */ -#define SDMMC_SEND_OP_COND_MAX_RETRIES 100 +#define SDMMC_SEND_OP_COND_MAX_RETRIES 300 #define SDMMC_SEND_OP_COND_MAX_ERRORS 3 /* Functions to send individual commands */