Probleme bei gleichzeitiger Nutzung von SD-Modul und TFT-Dsiplay

Hallo zusammen

Ich habe an einen Arduino Nano ein 2,4" TFT (ILI9341) und ein SD-Modul angeschlossen. Das auf dem Display angebrachte SD-Modul ist leider später nicht erreichbar, daher ein "externes".

Wenn ich das richtig verstanden habe, müssten beide Module doch funktionieren. Der CS-Pin sollte doch sagen wer gerade "gemeint ist".

Ich habe nun folgenden Code:

  #include <SPI.h>
  #include <SD.h>
  #define CS_PIN_SD 5
  File myFile;

  #include "Adafruit_GFX.h"
  #include "Adafruit_ILI9341.h"
  #define TFT_DC 9              
  #define TFT_CS 10             
  #define TFT_RST 8             
  #define TFT_MISO 12           
  #define TFT_MOSI 11           
  #define TFT_CLK 13          
  Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);

void setup() {
    Serial.begin(115200);

    tft.begin();  

//## TFT Test 1 ##
  tft.fillScreen(ILI9341_BLACK);
  tft.setCursor(0, random(1,300));
  tft.setTextColor(ILI9341_RED);  
  tft.setTextSize(1);
  tft.println("Hello World! (Test 1)");
//## TFT Test 1 ##


//  //SD-Karte Checken/Initialisieren
//    Serial.println("SD-Karte..");  
//    if (!SD.begin(CS_PIN_SD)) {
//              Serial.println("   --> fehlgeschlagen! \n");
//              while (1);
//    }
//    else   
//              Serial.println("   --> erfolgreich! \n");
//
//  myFile = SD.open("test.txt", FILE_WRITE);
//
//  if (myFile) {
//    Serial.print("Writing to test.txt...");
//    myFile.print("testing 1, 2, 3. --> ");
//    myFile.println(random(1,100));
//    myFile.close();
//    Serial.println("done.");
//  } 
//  else {
//    Serial.println("error opening test.txt");
//  }


//## TFT Test 2 ##
  tft.setCursor(0, random(1,300));
  tft.setTextColor(ILI9341_RED);  
  tft.setTextSize(1);
  tft.println("Hello World! (Test 2)");
//## TFT Test 2 ##

}


void loop() {
  
//## TFT Test 3 ##
  tft.setCursor(0, random(1,300));
  tft.setTextColor(ILI9341_RED);  
  tft.setTextSize(1);
  tft.println("Hello World! (Test 3)");
//## TFT Test 3 ##

  delay(1000);
}

In diesem Fall funktionier das Display und alle 3 Beispiel-Texte werden angezeigt.

Sobald ich aber den auskommentierten Code für die SD-Karte verwende, wird zwar erfolgreich die Datei auf die SD-Karte geschrieben, danach tut das Display aber nichts mehr. Es werden keine Befehle mehr verarbeitet.

Habe ich da einen Denkfehler drin oder kann ich irgendwie die SD-Karte wieder "abmelden". Die wird ja nur kurz benötigt (später im Programm durch einen Klick auf einen Button). Da könnte die dann ja initialisiert und dann wieder "abgemeldet" werden. Ich hatte auch versucht nachdem die Karte fertig ist ein SD.end(); zu verwenden. In der Bibliothek sieht das aber danach aus, dass das nicht das Gegenteil von SD.begin(PIN); ist.

Ich hatte auch versucht zuerst den SD-Teil und danach erst das Display mit tft.begin(); zu starten, hat ebenfalls nicht funktioniert.

Schaltung habe ich angehängt.

Gibt es Erkenntnisse, warum der SD-Slot auf dem Modul nicht funktioniert?

Ansonsten ist digitalPin 13 nicht so die gute Idee.
Versuch mal Pin 13 durch Pin 14 (A0) zu ersetzen.

Warum ist Pin 13 keine gute Idee?die beiden Module arbeiten ja mit HW SPI. Und Pin 13 ist aufm Nano nunmal SLK von SPI. Und dafür nutz er ja Pin 13 auch. Oder hab ich da was übersehen?

LG Stefan

my_xy_projekt:
Gibt es Erkenntnisse, warum der SD-Slot auf dem Modul nicht funktioniert?

Den hab ich nicht ausprobiert da ich den nicht verwenden kann. Im Gehäuse für das ganze später wird man da nämlich nicht drankommen.

Einzeln funktionieren die Sachen. Nachdem die SD-Karte verwendet wurde geht halt beim TFT nix mehr.

Hallo,

ich bin eigenlich immer sehr skeptisch, wenn Hersteller (SD-Modul) und Schaltungsentwickler (LCD) meinen, das ein paar Reihenwiderstände sinnvolle Pegelwandler auf 3,3V sein sollen.
Bei der Pinbelegung sehe ich eigentlich im Moment kein Problem.

Gruß aus Berlin
Michael

Die Info von Michael kann ich nur bestätigen. Ich habe mit den Displays und Widerständen als Pegelwandler bisher keinen richtigen Erfolg gehabt.

Nimm lieber einen CD4050 als Pegelwandler, das funktioniert sicher.

Am Ende war mir das mit dem Nano und dem Display zu langsam und meine Geduld noch länger um das Problem rumzubasteln hat dann dazu geführt, dass ich das ganze auf einen ESP32 umgezogen habe. Dort gibt es ja 2 SPI-Schnittstellen und somit keine Probleme mehr zwischen SD/TFT.

Hi

Da SPI ein BUS ist und die Slaves durch CS selektiert ... Häh?
Wenn vom TFT der CS-Pin HIGH ist, reagiert Der NICHT auf SPI-Geschwätz.
Wenn von der SD-Karte der CS auf HIGH ist, reagiert Diese NICHT auf SPI-Geschwätz.
Sofern also nicht sämtliche Slaves gleichzeitig 'zugeschaltet' waren - WAS soll Da passiert sein?
Nun denn - Du hast Das 'erschlagen', weil Du mit 'MEEEEEHR HARDWARE' - also jedem SPI-Slave einem eigenen Bus ... nobel, die SPI-Slaves werden Deinen Namen in Ehren halten :wink: ... (sollte 'Matrix' Realität werden, hast Du gute Chancen auf einen 'gut dotierten' Job)

MOSI/MISO/SCK ist 'DER BUS' - der Rest (also der EINE Slave) wird per SS (Slave-Select) ausgewählt -NUR Der hört zu und antwortet (strullert Seine Antwort-Bits raus).

Nun gut - wenn JEDER Seinen eigenen Bus bekommt, braucht man auch keine SS mehr aktivieren - da eh nur an DIESEN Slave geschwätzt wird, kann der Slave auf 'Dauer-AN' geklemmt werden.
Auch eine Idee.

Noch wüsste ich aber nicht, weshalb ich Diese übernehmen sollte ...

MfG

Edit
Geändert LOW/HIGH aufgrund #8 - danke!

postmaster-ino:
Wenn vom TFT der CS-Pin LOW ist, reagiert Der NICHT auf SPI-Geschwätz.
Wenn von der SD-Karte der CS auf LOW ist, reagiert Diese NICHT auf SPI-Geschwätz.

Ich habe es mal korrigiert. CS bei SPI ist in der Regel (gemäß Spec) LOW-aktiv.

Gruß Tommy

... ups ... werde Das 'oben' anpassen

Edit
habe aber 'die andere Seite' angepasst.
Danke Dir

Oder so rum :wink:

Gruß Tommy