Wie steuert man ein TFT Display (ILI9341) mit ESP32C3 an?

Hallo,

ich komme bei meinem Projekt nicht weiter, ein 240x320px TFT Display (ILI9341) mit einem ESP32C3 Dev Module (eines "T-Keyboards") anzusprechen. Ich nutze die Arduino IDE 2.1.0 und bekomme den ESP zum Laufen, was ich daran sehe, dass ich Ausgaben von meinem Programm über den seriellen Monitor bekomme.

Der ESP des T-Keyboards ist auf eine Platine gelötet, auf der auch ein kleines 40x160px TFT Display verlötet ist, welches ein 8 pin expansion interface hat (da steht 7pin, aber es ist ein 8pin Stecker, der 8. PIN der expansion Buchse liegt neben GND und ist mit LED gelabelt).

Aus der Doku fürs Originaldisplay erkenne ich die Verschaltung mit dem ESP:

PIN
TFT_MISO |-1
TFT_MOSI | 10
TFT_SCLK | 20
TFT_CS | -1
TFT_DC | 2
TFT_RST | -1
TFT_BL | 8

Ich verstehe das so, dass

  • TFT_MOSI an ESP PIN 10
  • TFT_SCLK an ESP PIN 20
  • TFT_DC an ESP PIN 2
  • TFT_BL an ESP PIN 8

liegt und die anderen TFT PINS nicht vom ESP gesteuert werden, weil "-1".

Kann ich mit den wenigen PINs überhaupt das 240x320px TFT Display (ILI9341) betreiben?

Ich versuche es mit der Adafruit ILI9341 Arduino Library und dem Samplecode graphicstest.ino, in dem es heißt

// For the Adafruit shield, these are the default.
#define TFT_DC 9
#define TFT_CS 10

// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// If using the breakout, change pins as desired
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO);

Das verstehe ich leider nicht. Ich habe etwas rumprobiert, aber das meiste was ich geschafft habe, ist, dass das Display bei den einzelnen Schritten an und aus geht (alle/keine Pixel leuchten), aber es wird nichts dargestellt.

Was ich versucht habe:

// For the Adafruit shield, these are the default.
//#define TFT_DC 9
//#define TFT_CS 10
// die PIN config für das Adafruit shield habe ich auskommentiert und dafür
// die PIN config vom T-Keyboard übernommen:
#define TFT_MISO  -1
#define TFT_MOSI  10//21
#define TFT_SCLK  20//22
#define TFT_CS    -1//18  // Chip select control pin
#define TFT_DC    2  // Data Command control pin
#define TFT_RST   -1//27
#define TFT_BL    8//4

// so passiert gar nix:
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST, TFT_MISO);

// so blinkt es zumindest:
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_MOSI, TFT_SCLK, TFT_DC, TFT_BL);

// so blinkt es auch nur:
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_DC, TFT_MOSI, TFT_SCLK, TFT_BL);

// fürht zu "Compilation error: cannot allocate an object of abstract type 'Adafruit_SPITFT'":
// Adafruit_SPITFT tft = Adafruit_ILI9341(TFT_MOSI, TFT_SCLK, TFT_DC, TFT_BL);

// so leuchtet es nur durchgängig:
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_BL);

// so passiert wieder gar nix:
//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK);

Kann mir evtl. jemand weiterhelfen zu verstehen, was da genau passiert, wenn man die Instanz vom Display erstellt? Ich habe auch versucht etwas aus der class zu verstehen (da kam der Versuch mit dem compilation error her):

class Adafruit_ILI9341 : public Adafruit_SPITFT {
public:
  Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK,
                   int8_t _RST = -1, int8_t _MISO = -1);
  Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1);
#if !defined(ESP8266)
  Adafruit_ILI9341(SPIClass *spiClass, int8_t dc, int8_t cs = -1,
                   int8_t rst = -1);
#endif // end !ESP8266
  Adafruit_ILI9341(tftBusWidth busWidth, int8_t d0, int8_t wr, int8_t dc,
                   int8_t cs = -1, int8_t rst = -1, int8_t rd = -1);

aber hier verstehe ich leider die ganze Syntax überhaupt nicht. Bedeutet das, dass nur CS, DC, MOSI, SCLK zwingend erforderlich sind und RST, MISO nicht (weil "-1")? Ich habe CS und RESET aktuell gar nicht verkabelt mit der Annahme, dass die (PIN = -1) gar nicht angesteuert werden. Stimmt das, oder liege ich da vlt schon völlig falsch?

In der Library des T-Displays habe ich neben der class noch gefunden:

#define SPI_FREQUENCY  40000000
#define DC_C digitalWrite(TFT_DC, LOW)
#define DC_D digitalWrite(TFT_DC, HIGH)
#if (TFT_CS==-1)
#define CS_L ;//digitalWrite(TFT_CS, LOW)
#define CS_H ;//digitalWrite(TFT_CS, HIGH)
#else
#define CS_L digitalWrite(TFT_CS, LOW)
#define CS_H digitalWrite(TFT_CS, HIGH)
#endif
#if (TFT_RST==-1)
#define RST_L ;//digitalWrite(TFT_RST, LOW)
#define RST_H ;//digitalWrite(TFT_RST, HIGH)
#else
#define RST_L digitalWrite(TFT_RST, LOW)
#define RST_H digitalWrite(TFT_RST, HIGH)
#endif

und mich gefragt, ob ich das auch übernehmen muss…

Ich wäre sehr dankbar, wenn mir jemand einen nützlichen Tipp geben könnte :slight_smile:

Ja.
Das ist SPI-Mode. Die kleinste Variante Clock, Data, Gnd.
Eigentlich wäre die nächste Stufe noch ChipSelekt, was aber bei Dir nicht genutzt wird. Damit ist der Bus nur für das Display geeignet.

BL dürfte Backlight sein - damit ist wohl alles möglich :wink:

Geht denn das Example BLE_keyboard?

Ja das Example BLE_keyboard funktioniert und auch mein eigenes Projekt läuft halbwegs stabil auf dem kleinen Display.

Es ist ja schonmal gut zu wissen, dass es irgendwie klappen sollte mit mind. Clock, Data, GND und BL (=LED?) :slight_smile:

Was bedeutet, dass der Bus nur für das Display geeignet ist? Kann ich nur das kleine original Display nutzen, solange ich das ILI9341 Display nicht über den CS PIN ansteuere? Wie könnte ich das machen? Anschließen, irgendwie ausfinden an welchem ESP PIN ich angeschlossen habe, um den Wert dann bei der aktuellen -1 von TFT_CS einsetzen?

Also, nicht irgendwie, aber ich vermute eher, das CS vom Display nicht aktiv genutzt wird.
Das bedeutet im Umkehrschluß, das ein möglicher CS-Pin AM DISPLAY fest verdrahtet ist, so dass auf alle Informationen auf dem Bus gehört wird.

Du kannst natürlich weitere SPI-Geräte nutzen, aber der Display wird dann Unsinn anzeigen.

Hm, wenn eh nur das eine Display vorgesehen ist, würde es ja Sinn machen, sich den PIN für ein unnötiges ChipSelect zu sparen, wenn das möglich ist. Allerdings sieht man hier alles, was verdrahtet ist:


und ich erkenne an der ESP-Platine, dass der nicht "ins Leere" geht, sondern an irgendeinem ESP PIN anliegen müsste (an welchem kann ich leider nicht erkennen).
Kann ich denn irgendwie nur das ILI9341 Display nutzen und auf das andere verzichten?

Welsche zeige Link der C3 hat andere Pinbelegung.
Dein Display hat Standard Pinbelegung für SPI Displays vom LCD_Wiki als erstes alle Pins belegen außer MISO wird nicht benötigt.
Leider habe keinen ESP32C3 sonst wurde dir das zeigen.

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