Przeglądaj źródła

Merge branch 'fixbug/sdmmc_spi_highspeed_v3.3' into 'release/v3.3'

sdmmc: fix the probe issue that forbid sdspi working in highspeed mode(backport v3.3)

See merge request espressif/esp-idf!9838
Michael (XIAO Xufeng) 5 lat temu
rodzic
commit
4afc8facde
2 zmienionych plików z 18 dodań i 11 usunięć
  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

@@ -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));