Не удалось установить 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
Может ли кто-нибудь подсказать, в чем может быть проблема или что еще я могу попробовать для устранения этой проблемы? Любая помощь будет принята с благодарностью.
@Mike Buss, 👍0
Обсуждение2 ответа
Лучший ответ:
В вашем коде есть как минимум две проблемы.
Во-первых, мне кажется, у вас опечатка в частоте. Частота по умолчанию — 4 МГц, но ваш параметр в begin
— 80 МГц, и я сомневаюсь, что это сработает.
Вы инициализируете объект spi
в стеке функции, а затем передаете его экземпляру SD. Объект spi
из стека будет удален, когда функция завершится, и объект SD выйдет из строя. Это должно быть выделение в куче как SPIClass* spi = new SPIClass(VSPI);
или глобальная переменная SPIClass spi(VSPI);
.
А поскольку вы используете контакты VSPI по умолчанию, вы можете использовать просто spi.begin()
без номеров контактов.
Проблема оказалась в неисправной 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
- Как увеличить скорость записи на SD-карту в Ардуино
- Какие контакты можно использовать для выбора микросхемы (CS, CC) на Arduino Nano Every?
- Сделать CS (chip select) для работаты в SPI (для и SD карты и OLED)
- Цифровой потенциометр SPI не работает на ESP32
- Использование экрана SD-карты на Arduino Due
- Камера esp32 и датчик PIR
- Видеокамера ESP32 и пробуждение от глубокого сна
- Загрузить сайт с SD-карты
Похоже, что 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