Ciao a tutti,
sto tentando senza successo di collegare una scheda SD tramite interfaccia SPI a una ESP32-S3, e ho bisogno di un parere esterno perché ho esaurito le idee.
Hardware utilizzato:
- ESP32-S3 (modulo su schedino di sviluppo, no TFT o periferiche attive)
- Schede SD da 2 GB (FAT) e 16 GB (FAT32), entrambe formattate correttamente con SD Card Formatter
- Alimentazione stabile a 3,34 V misurata costantemente
- Resistenze di pull-up da 4,7kΩ su CS, MOSI, MISO e SCK
- SPI via pin personalizzati:
- CS → GPIO 13
- MOSI → GPIO 20
- MISO → GPIO 19
- SCK → inizialmente GPIO 14, ora testato anche su GPIO 18
Librerie testate:
- SD.h (Arduino ufficiale)
- SdFat (di Bill Greiman)
- Espressif SD SPI host driver (
sdspi_hostda ESP-IDF) - Inizializzazione manuale via
SPI.begin(...)e successivaSD.begin(CS, SPI)
Risultati dei test:
- Comunicazione SPI sembra attiva: ricevo 0xFF come risposta (dopo aver sistemato una saldatura rotta)
- I pin si comportano correttamente (MISO 1, MOSI 1, SCK 0, CS 1 a riposo)
- Nonostante ciò, la inizializzazione SD fallisce costantemente
- Testato con diverse schede SD, tutte note funzionanti
- Niente altre periferiche SPI connesse
- Provato con diverse velocità SPI (anche 1 MHz) Codice di debug usato: `
#include <SPI.h>
#include <SD.h>
#define CS_SD 13
#define MOSI_SD 20
#define MISO_SD 19
#define SCK_SD 18 // Provato anche con 14
SPIClass SPI_SD(VSPI);
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("========== DEBUG SPI SD ==========");
Serial.printf("CS: %d\nMOSI: %d\nMISO: %d\nSCK: %d\n", CS_SD, MOSI_SD, MISO_SD, SCK_SD);
Serial.println(">> Inizializzo SPI con pin personalizzati...");
SPI_SD.begin(SCK_SD, MISO_SD, MOSI_SD, CS_SD);
Serial.println(">> Verifica stato pin:");
Serial.printf("MOSI: %d\n", digitalRead(MOSI_SD));
Serial.printf("MISO: %d\n", digitalRead(MISO_SD));
Serial.printf("SCK: %d\n", digitalRead(SCK_SD));
Serial.printf("CS: %d\n", digitalRead(CS_SD));
Serial.println(">> Test SPI: invio comando fittizio su SPI_SD");
for (int i = 0; i < 10; i++) {
uint8_t response = SPI_SD.transfer(0xFF);
Serial.printf("Risposta SPI: 0x%02X\n", response);
}
Serial.println(">> Provo a inizializzare la SD con SD.begin()...");
if (!SD.begin(CS_SD, SPI_SD)) {
Serial.println("!!! Errore inizializzazione SD (controlla collegamenti e card)");
} else {
Serial.println("Scheda SD inizializzata con successo!");
}
}
void loop() {
delay(5000);
}