瀏覽代碼

Merge branch 'bugfix/sdmmc_spi_highspeed' into 'master'

sdmmc: fix the probe issue that forbid sdspi working in highspeed mode

See merge request espressif/esp-idf!9418
Ivan Grokhotkov 5 年之前
父節點
當前提交
562edb3a5e
共有 2 個文件被更改,包括 18 次插入11 次删除
  1. 16 11
      components/sdmmc/sdmmc_sd.c
  2. 2 0
      components/sdmmc/test/test_sd.c

+ 16 - 11
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) {

+ 2 - 0
components/sdmmc/test/test_sd.c

@@ -389,6 +389,8 @@ TEST_CASE("SDMMC read/write test (SD slot 1, in SPI mode)", "[sdspi][test_env=UT
 
     sdmmc_host_t config = SDSPI_HOST_DEFAULT();
     config.slot = handle;
+    // 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);