Este hilo es una conversación con perplexity, tratando de resolver problemas con los pines asignados a la SD en la tarjeta integrada ESP32 TFT Touch SD que se anunciaba como LVGL en aliexpress. Lo barato sale caro.

https://www.perplexity.ai/search/tengo-que-configurar-los-pines-a5zHPZDxRqay05ZmW.CfRA#0


Te dejo un ejemplo de “barrido automático” probando las 24 combinaciones en el loop, mostrando el resultado por Serial:

cpp#include <SPI.h>
#include <SD.h>

// Listas de pines posibles
int csPins[]   = {5, 4, 15};
int mosiPins[] = {23, 13};
int misoPins[] = {19, 12};
int sckPins[]  = {18, 14};

const int numCS   = sizeof(csPins)   / sizeof(csPins[0]);
const int numMOSI = sizeof(mosiPins) / sizeof(mosiPins[0]);
const int numMISO = sizeof(misoPins) / sizeof(misoPins[0]);
const int numSCK  = sizeof(sckPins)  / sizeof(sckPins[0]);

// Índices para recorrer combinaciones
int iCS = 0, iMOSI = 0, iMISO = 0, iSCK = 0;

// Para no repetir pruebas iguales
unsigned long lastTestTime = 0;
const unsigned long testInterval = 2000; // 2s entre pruebas, ajusta a gusto

void setup() {
  Serial.begin(115200);
  while (!Serial) { ; }

  Serial.println();
  Serial.println("Inicio de barrido de combinaciones SD");
}

void loop() {
  // Espera entre pruebas para poder leer en el monitor serie
  if (millis() - lastTestTime < testInterval) {
    return;
  }
  lastTestTime = millis();

  // Si ya hemos probado todas, paramos
  if (iCS >= numCS) {
    Serial.println("Barrido completado. No hay más combinaciones.");
    while (true) {
      delay(1000);
    }
  }

  int cs   = csPins[iCS];
  int mosi = mosiPins[iMOSI];
  int miso = misoPins[iMISO];
  int sck  = sckPins[iSCK];

  Serial.println("---------------------------------------");
  Serial.print("Probando combinacion: ");
  Serial.print("CS=");   Serial.print(cs);
  Serial.print(" MOSI="); Serial.print(mosi);
  Serial.print(" MISO="); Serial.print(miso);
  Serial.print(" SCK=");  Serial.println(sck);

  // Configurar bus SPI con esta combinacion
  SPI.end(); // por si acaso estaba inicializado
  SPI.begin(sck, miso, mosi, cs);

  pinMode(cs, OUTPUT);
  digitalWrite(cs, HIGH);

  if (SD.begin(cs)) {
    Serial.println(">> SD inicializada correctamente.");
    // Si quieres, puedes hacer alguna prueba extra:
    uint8_t cardType = SD.cardType();
    Serial.print("Tipo de tarjeta: ");
    if (cardType == CARD_NONE) {
      Serial.println("No detectada");
    } else if (cardType == CARD_MMC) {
      Serial.println("MMC");
    } else if (cardType == CARD_SD) {
      Serial.println("SDSC");
    } else if (cardType == CARD_SDHC) {
      Serial.println("SDHC/SDXC");
    } else {
      Serial.println("Desconocido");
    }

    // Aquí podrías quedarte en esta combinación si es la buena:
    Serial.println("Deteniendo barrido en esta combinacion.");
    while (true) {
      delay(1000);
    }

  } else {
    Serial.println(">> Fallo al inicializar la SD.");
  }

  // Avanzar a la siguiente combinacion
  iSCK++;
  if (iSCK >= numSCK) {
    iSCK = 0;
    iMISO++;
    if (iMISO >= numMISO) {
      iMISO = 0;
      iMOSI++;
      if (iMOSI >= numMOSI) {
        iMOSI = 0;
        iCS++;
      }
    }
  }
}

Funcionamiento:

  • Recorre todas las combinaciones de CS, MOSI, MISO y SCK en el loop, una cada 2 segundos.
  • Para cada combinación:
    • Configura SPI.begin(sck, miso, mosi, cs);
    • Llama a SD.begin(cs);
    • Muestra por Serial si la inicialización ha sido correcta o no.
  • Cuando encuentra una combinación que funciona, se queda bloqueado en esa, para que puedas ver claramente cuál es. Si prefieres que siga probando todas aunque alguna funcione, quita el while (true) que hay dentro del if (SD.begin(cs)) { ... }.