diff --git a/components/sdmmc/sdmmc_sd.c b/components/sdmmc/sdmmc_sd.c index 8d6323996..2634aa081 100644 --- a/components/sdmmc/sdmmc_sd.c +++ b/components/sdmmc/sdmmc_sd.c @@ -225,24 +225,29 @@ esp_err_t sdmmc_enable_hs_mode_and_check(sdmmc_card_t* card) /* HS mode has been enabled on the card. * Read CSD again, it should now indicate that the card supports * 50MHz clock. - * Since SEND_CSD is allowed only in standby mode, and the card is - * currently in data transfer more, deselect the card first, then - * get the CSD, then select the card again. + * Since SEND_CSD is allowed only in standby mode, and the card is currently in data transfer + * mode, deselect the card first, then get the CSD, then select the card again. This step is + * not required in SPI mode, since CMD7 (select_card) is not supported. */ - err = sdmmc_send_cmd_select_card(card, 0); - if (err != ESP_OK) { - ESP_LOGE(TAG, "%s: select_card (1) returned 0x%x", __func__, err); - return err; + const bool is_spi = host_is_spi(card); + if (!is_spi) { + err = sdmmc_send_cmd_select_card(card, 0); + if (err != ESP_OK) { + ESP_LOGE(TAG, "%s: select_card (1) returned 0x%x", __func__, err); + return err; + } } err = sdmmc_send_cmd_send_csd(card, &card->csd); if (err != ESP_OK) { ESP_LOGE(TAG, "%s: send_csd returned 0x%x", __func__, err); return err; } - err = sdmmc_send_cmd_select_card(card, card->rca); - if (err != ESP_OK) { - ESP_LOGE(TAG, "%s: select_card (2) returned 0x%x", __func__, err); - return err; + if (!is_spi) { + err = sdmmc_send_cmd_select_card(card, card->rca); + if (err != ESP_OK) { + ESP_LOGE(TAG, "%s: select_card (2) returned 0x%x", __func__, err); + return err; + } } if (card->csd.tr_speed != 50000000) { diff --git a/components/sdmmc/test/test_sd.c b/components/sdmmc/test/test_sd.c index ea0a144f3..c64fde377 100644 --- a/components/sdmmc/test/test_sd.c +++ b/components/sdmmc/test/test_sd.c @@ -320,6 +320,8 @@ TEST_CASE("SDMMC read/write test (SD slot 1, in SPI mode)", "[sdspi][test_env=UT sdspi_slot_config_t slot_config = SDSPI_SLOT_CONFIG_DEFAULT(); TEST_ESP_OK(sdspi_host_init()); TEST_ESP_OK(sdspi_host_init_slot(config.slot, &slot_config)); + // This test can only run under 20MHz on ESP32, because the runner connects the card to + // non-IOMUX pins of HSPI. sdmmc_card_t* card = malloc(sizeof(sdmmc_card_t)); TEST_ASSERT_NOT_NULL(card); TEST_ESP_OK(sdmmc_card_init(&config, card));