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,MISOySCKen elloop, 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.
- Configura
- 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 delif (SD.begin(cs)) { ... }.