"Problema con SD via SPI su ESP32-S3 – Inizializzazione fallita nonostante connessioni corrette"

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.

:wrench: 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

:package: Librerie testate:

  • SD.h (Arduino ufficiale)
  • SdFat (di Bill Greiman)
  • Espressif SD SPI host driver (sdspi_host da ESP-IDF)
  • Inizializzazione manuale via SPI.begin(...) e successiva SD.begin(CS, SPI)

:bar_chart: 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);
}

Buongiorno e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Detto questo, in conformità al punto 13 del succitato regolamento, ti rammento che il cross-posting è proibito (anche tra lingue diverse) e ... tu hai già posto la stessa/simile domanda QUI. Non solo, in quella discussione ti stanno già rispondendo ed è veramente poco carino abbandonare una discussione e chi ti stava aiutando, per venire di qua a porre la stessa domanda … :roll_eyes:

Quindi, nel rispetto del regolamento e verso chi ha già cominciato ad aiutarti, questa tua discussione duplicata viene chiusa e ti prego di continuare dove avevi cominciato.

Grazie,

Guglielmo

P.S.: Il motivo è che i messaggi doppi fanno perdere tempo alle persone che cercano di aiutare. Qualcuno potrebbe spendere parecchio tempo per scrivere una risposta dettagliata su una discussione, senza sapere che qualcun altro ha già fatto lo stesso in un altra identica/simile discussione.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.