From 631f5524897db6c16d8f05b30ffdff09d201681c Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Thu, 24 Aug 2017 16:28:37 +0800 Subject: [PATCH] sdmmc: don't use high speed mode with SD over SPI Disabling due to limitation of SPI driver (max 26MHz for full-duplex mode over GPIO matrix) --- components/sdmmc/sdmmc_cmd.c | 5 +++-- components/sdmmc/test/test_sd.c | 1 - docs/api-reference/storage/sdmmc.rst | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/components/sdmmc/sdmmc_cmd.c b/components/sdmmc/sdmmc_cmd.c index 2e8b0f85c..3b962d432 100644 --- a/components/sdmmc/sdmmc_cmd.c +++ b/components/sdmmc/sdmmc_cmd.c @@ -233,7 +233,7 @@ esp_err_t sdmmc_card_init(const sdmmc_host_t* config, sdmmc_card_t* card) /* Wait for the card to be ready for data transfers */ uint32_t status = 0; - while (!host_is_spi(card) && !(status & MMC_R1_READY_FOR_DATA)) { + while (!is_spi && !(status & MMC_R1_READY_FOR_DATA)) { // TODO: add some timeout here uint32_t count = 0; err = sdmmc_send_cmd_send_status(card, &status); @@ -249,7 +249,8 @@ esp_err_t sdmmc_card_init(const sdmmc_host_t* config, sdmmc_card_t* card) * clock rate which both host and the card support, and switch to it. */ bool freq_switched = false; - if (config->max_freq_khz >= SDMMC_FREQ_HIGHSPEED) { + if (config->max_freq_khz >= SDMMC_FREQ_HIGHSPEED && + !is_spi /* SPI doesn't support >26MHz in some cases */) { /* This will determine if the card supports SWITCH_FUNC command, * and high speed mode. If the cards supports both, this will enable * high speed mode at the card side. diff --git a/components/sdmmc/test/test_sd.c b/components/sdmmc/test/test_sd.c index b43175295..379a2d8ce 100644 --- a/components/sdmmc/test/test_sd.c +++ b/components/sdmmc/test/test_sd.c @@ -164,7 +164,6 @@ TEST_CASE("can write and read back blocks", "[sd][test_env=UT_T1_SDMODE]") TEST_CASE("can write and read back blocks(using SPI)", "[sdspi][test_env=UT_T1_SPIMODE]") { sdmmc_host_t config = SDSPI_HOST_DEFAULT(); - config.max_freq_khz = SDMMC_FREQ_HIGHSPEED; 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)); diff --git a/docs/api-reference/storage/sdmmc.rst b/docs/api-reference/storage/sdmmc.rst index ba26b9e16..3cd31a8d2 100644 --- a/docs/api-reference/storage/sdmmc.rst +++ b/docs/api-reference/storage/sdmmc.rst @@ -106,6 +106,11 @@ SD SPI driver is represented using an ``sdmmc_host_t`` structure initialized usi SD SPI driver APIs are very similar to SDMMC host APIs. As with the SDMMC host driver, only ``sdspi_host_init``, ``sdspi_host_init_slot``, and ``sdspi_host_deinit`` functions are normally used by the applications. Other functions are called by the protocol level driver via function pointers in ``sdmmc_host_t`` structure. +.. note: + + SD over SPI does not support speeds above SDMMC_FREQ_DEFAULT due to a limitation of SPI driver. + + .. doxygenfunction:: sdspi_host_init .. doxygendefine:: SDSPI_HOST_DEFAULT