Не удалось установить SD-карту с Waveshare ESP32 с использованием Arduino IDE

В настоящее время я работаю над проектом, используя ESP32 (драйверная плата Waveshare ESP32), и я пытаюсь прочитать данные с SD-карты, но постоянно получаю сообщение «Ошибка монтирования SD-карты». ошибка. Я использую коммутационную плату устройства чтения SD-карт Adafruit и Arduino IDE.

Вот как я подключил устройство чтения SD-карт к ESP32

SD card     ESP32
-------     -----
3.3V        3.3V
GND         GND
CLK         pin 18 (SCK)
DO          pin 19 (MISO)
DI          pin 23 (MOSI)
CS          pin 5 (SS)

А вот соответствующий код, который я использую для настройки и тестирования SD-карты:

#define SCK  18
#define MISO  19
#define MOSI  23
#define CS  5

int setup_sd_card() {
  
  SPIClass spi = SPIClass(VSPI);
  spi.begin(SCK, MISO, MOSI, CS);

  if (!SD.begin(CS,spi,80000000)) {
    Serial.println("ERROR: SD Card Mount Failed");
    return -1;
  }
  uint8_t cardType = SD.cardType();
  
  if(cardType == CARD_NONE){
    Serial.println("ERROR: No SD card attached");
    return -1;
  }

  // Код для распечатки данных SD-карты...

  return 1;
}

Я трижды проверил подключение, но код всегда дает сбой при if (!SD.begin(CS,spi,80000000)). Я пробовал 3 разные SD-карты разного размера, все отформатированные в FAT32 (64 ГБ, 256 ГБ, 1024 ГБ)

Может ли проблема быть связана с тем, что ESP32 не является стандартным, потому что у него есть какое-то оборудование для управления экраном электронной бумаги? Вот схема: https://www.waveshare.com/w/upload/8 /80/E-Paper_ESP32_Driver_Board_Schematic.pdf

Схема Waveshare ESP32

Может ли кто-нибудь подсказать, в чем может быть проблема или что еще я могу попробовать для устранения этой проблемы? Любая помощь будет принята с благодарностью.

, 👍0

Обсуждение

Похоже, что Waveshare esp32 использует следующие контакты SPI для экрана. P13: скорость вращения; P14: спи моси; P15: CS (не общий). Для clk, мисо и моси следует использовать одни и те же булавки. Попробуйте распечатать существующие значения clk, мисо и mosi, не переопределяя их. Только вывод cs уникален для периферийного устройства. Остальные контакты SPI представляют собой общую шину., @6v6gt

Я переместил объявление SPIClass в глобальную переменную и изменил частоту с 80 до 4, но получаю тот же результат. Спасибо за предложение., @Mike Buss

Я также распечатал существующие значения MOSI/MISO/SCK/SS после удаления их переопределения, и они следующие: МОСИ: 23 МИСО: 19 ССК: 18 СС: 5 ; Я могу попробовать использовать те же контакты SPI, что и экран, и посмотреть, сработает ли это. Я обновлю это, когда узнаю., @Mike Buss


2 ответа


Лучший ответ:

1

В вашем коде есть как минимум две проблемы.

Во-первых, мне кажется, у вас опечатка в частоте. Частота по умолчанию — 4 МГц, но ваш параметр в begin — 80 МГц, и я сомневаюсь, что это сработает.

Вы инициализируете объект spi в стеке функции, а затем передаете его экземпляру SD. Объект spi из стека будет удален, когда функция завершится, и объект SD выйдет из строя. Это должно быть выделение в куче как SPIClass* spi = new SPIClass(VSPI); или глобальная переменная SPIClass spi(VSPI);.

А поскольку вы используете контакты VSPI по умолчанию, вы можете использовать просто spi.begin() без номеров контактов.

,

0

Проблема оказалась в неисправной SD-карте.

Я пробовал другие SD-карты, но, должно быть, использовал для них неправильную проводку.

РЕДАКТИРОВАТЬ: Вот обновленный код:

#define CS        5
#define SCK       18
#define MOSI      23
#define MISO      19

SPIClass spi(VSPI);

int setup_sd_card() {
  spi.begin(SCK, MISO, MOSI, CS);

  if (!SD.begin(CS,spi,4000000)) {
    Serial.println("ERROR: SD Card Mount Failed");
    delay(1000);
    return -1;
  }
  Serial.println("Finished initializing SD card. Getting card type...");

  uint8_t cardType = SD.cardType();
  
  if(cardType == CARD_NONE){
    Serial.println("ERROR: No SD card attached");
    delay(1000);
    return -1;
  }

  Serial.print("SD Card Type: ");
  if (cardType == CARD_MMC){
    Serial.println("MMC");
  } else if(cardType == CARD_SD){
    Serial.println("SDSC");
  } else if(cardType == CARD_SDHC){
    Serial.println("SDHC");
  } else {
    Serial.println("UNKNOWN");
  }
  Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));
  Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));

  Serial.println("SUCCESS! (SD CARD)");
  
  return 1;
}
,

работает ли он с кодом, как в Вопросе?, @Juraj

Я только что отредактировал свой ответ, чтобы добавить работающий код. То же самое, что и выше, с двумя предложениями, данными в комментариях., @Mike Buss

так это не "начинается" с 80 мега? а что насчет 8 мега?, @Juraj