Нужна помощь в подключении к ESP32 модулю с дисплеем SD карты

Denis__MM

✩✩✩✩✩✩✩
21 Дек 2024
2
1
Отладочная плата 1.9 inch ESP32-S3 Display Screen ESP32-1732S019N-I. Пытаюсь подключить SD Card Shield по SPI.
Проблема в том, что корректно работает либо дисплей либо SD карта.
Ищу помогатора.
 

Zuker

★✩✩✩✩✩✩
10 Янв 2024
63
14
Недавно наткнулся на либу OLED от AlexGyver, вот что он пишет про SD:

Дисплей по SPI + SD карта
известная беда SD карт http://elm-chan.org/docs/mmc/mmc_e.html, пункт Cosideration on Multi-slave Configuration. Как решить: после завершения общения с картой памяти нужно отпустить CS карты (библа SD возможно сама это делает, либо отпустить вручную) и закинуть по SPI пару байт (пару нулей условно). Почему - карта держит линию даты.
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,412
978
58
Марий-Эл
@Denis__MM, Кажется я понял в чём дело.
У ESP 3 модуля SPI.
Один обычный SPI и плюс к этому HSPI и VSPI.
По вашей схеме включения, Вы пытаетесь развести по разным выводам два SPI устройства.
Когда вы инициализируете библиотеку первого устройства, внутренний коммутатор МК подключает необходимые выводы к SPI.
Когда инициализируете вторую библиотеку она перехватывает управление SPI. Таким образом первое устройство перестаёт работать.
Нужно попробовать назначить для второго устройства HSPI или VSPI. Если конечно такое возможно.
Можно объеденить MOSI, MISO, SCK, а CS сделать разными для каждого устройства.
Возможно так заработает.
 

wizard suleiman

✩✩✩✩✩✩✩
13 Окт 2023
44
2
@Denis__MM, возможно если возьмете плату esp32cam, вам будет проще... (но это не точно) если помог, напишите в личку, скину реквизиты, для выражения благодарности)))
 

Denis__MM

✩✩✩✩✩✩✩
21 Дек 2024
2
1
Оформи код соответствующим тэгом, см. Правила
Благодарю @Эдуард Анисимов, за совет использовать VSPI. Он помог мне решить задачу.
Вкратце опишу суть проблемы и ее решение.

Задача.
Имеется модуль1.9 inch ESP32-S3 Display Screen ESP32-1732S019N-I. Дисплей подключен шлейфом непосредственно к ESP32 и подключить другую перифирию к той же SPI шине затруднительно.
Задача состояла в подключении модуля SD карты к свободным GPIO модуля.
Попытка просто включить вторую шину с конфигурированием GPIO приводила к конфликтам дисплея и SD карты.

Решение.
Выяснил, что дисплей использует HSPI. Соответственно нужно было просто включить и использовать VSPI.
ESP32S позволяет это сделать.

C++:
#if !defined(CONFIG_IDF_TARGET_ESP32)
#define VSPI FSPI
#endif


#define PIN_MOSI 20
#define PIN_MISO 21
#define PIN_SCK 47
#define PIN_CS 48

static const int spiClk = 80000000;

SPIClass vspi = SPIClass(VSPI);

void initSD(void)

{
  vspi.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_CS);
  pinMode(vspi.pinSS(), OUTPUT);
  digitalWrite(vspi.pinSS(), HIGH);
  digitalWrite(vspi.pinSS(), LOW);
  if (!SD.begin(PIN_CS, vspi, spiClk)) {
    Serial.println(F("SD CARD FAILED, OR NOT PRESENT!")); // don't do anything more:
  }
  Serial.println(F("SD CARD INITIALIZED."));
  uint8_t cardType = SD.cardType();

  if(cardType == CARD_NONE){
      Serial.println("No SD card attached");
      return;
  }

  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");
  }
  uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  Serial.printf("SD Card Size: %lluMB\n", cardSize);
  digitalWrite(vspi.pinSS(), HIGH);
}

void readFile(fs::FS &fs, const char * path){
  Serial.printf("Reading file: %s\n", path);
  File file = fs.open(path);
  if(!file){
      Serial.println("Failed to open file for reading");
      return;
  }

  Serial.print("Read from file: ");
  while(file.available()){
      Serial.write(file.read());
  }
  file.close();
}
void sd_test_read(void)
{
  digitalWrite(vspi.pinSS(), LOW);
  readFile(SD, "/test.txt");
  digitalWrite(vspi.pinSS(), HIGH);
}

void setup(void)
{
  Serial.begin(115200);
  initSD();
  sd_test_read();
}
 
Изменено: