Forum: Mikrocontroller und Digitale Elektronik ESP32: esp-idf & ILI9341 LCD Display


von Sven Scholz (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit der Anbindung eines LCD's mit ILI9341 
Controller an den ESP32.
Das Display habe ich bei amazon gekauft: 
https://www.amazon.de/Ili9341-240X320-Display-Touchscreen-Ladicha/dp/B07BYTT1WZ

Ich verwenden einen aktuellen Branch des offiziellen esp-idf (v3.2 
beta2).
Den LCD-Treiber habe ich vom esp-iot Framework hergenommen, der im 
Grunde nur die Adafruit GFX-Bibliothek wrapped und portiert.
Quelle: 
https://github.com/espressif/esp-iot-solution/tree/master/components/spi_devices/lcd

Damit kann ich nun auch alles auf dem LCD darstellen (Textzeichen, 
Strings, Bitmaps, etc.) allerdings dies nur sehr sehr langsam.
Möchte ich zum Beispiel einen String auf dem Display ausgeben, kann ich 
zusehen, wie der Text Zeichen für Zeichen aufgebaut wird.

Das Display ist über das HW SPI Interface mit dem ESP32 verbunden und 
sollte mit 40 Mhz arbeiten.

Hier noch kurz ein Auszug aus meinem aktuellen Quellcode, wie ich den 
LCD-Treiber initialisiere:
1
static CEspLcd* lcd_obj = NULL;
2
3
void initialise_lcd(void)
4
{
5
    /*Initialize LCD*/
6
    lcd_conf_t lcd_pins = {
7
        .lcd_model    = LCD_MOD_ILI9341,
8
        .pin_num_miso = GPIO_NUM_12,   // leave unconnected
9
        .pin_num_mosi = GPIO_NUM_13,   
10
        .pin_num_clk  = GPIO_NUM_14,   
11
        .pin_num_cs   = GPIO_NUM_15,   
12
        .pin_num_dc   = GPIO_NUM_26,   
13
        .pin_num_rst  = GPIO_NUM_25,   
14
        .pin_num_bckl = GPIO_NUM_17,  // leave unconnected
15
        .clk_freq     = 40 * 1000 * 1000,
16
        .rst_active_level = 0,
17
        .bckl_active_level = 0,
18
        .spi_host = HSPI_HOST,
19
        .init_spi_bus = true,
20
    };
21
22
    if (lcd_obj == NULL) {
23
        lcd_obj = new CEspLcd(&lcd_pins);
24
    }
25
}

Benutzt wir das EspLcd-Objekt dann später folgendermaßen:
1
lcd_obj->setRotation(2);
2
lcd_obj->fillScreen(COLOR_ESP_BKGD);
3
lcd_obj->setTextSize(1);
4
lcd_obj->setTextColor(COLOR_GREEN, COLOR_ESP_BKGD);
5
lcd_obj->setFont(&FreeSans9pt7b);
6
lcd_obj->drawString("HELLO WORLD.", 3, 40);

Das schreibt mir dann HELLO WORLD (grüne Schrift auf schwarzem 
Hintergrund) auf das Display.
Klappt also richtig gut - nur leider viel viel zu langsam.

Woran kann das liegen?
Kann das evtl. jemand nachvollziehen bzw. den einfachen Aufbau mit einem 
LCD nachstellen?
Ich denke dass irgendetwas mit der Portierung der Adafruit-Library nicht 
stimmt. Oder schon beim spi_master-Driver innerhalb der esp-idf.

Herzlichen Dank schonmal für eure Unterstützung.

Schönen Abend,
Sven

von Gerhard G. (xmega)


Lesenswert?

Hallo,

ich verwende das selbe Display (SPI 20-40 Mhz) mit einem ESP32 (Lolin32) 
und einer Lib die auf Anhieb funktioniert. TFT_eSPI von Bodmer.
Ich persönlich wähle für den SPI-Takt 20 Mhz, das ist enorm schnell und 
stabil. In Bruchteil einer Sekunde ist ein ganzes Display gefüllt.
Du kommendierst die User_Setup.h aus, und alles funktioniert bestens.
Mehr ist nicht zu machen!

Gruß G.G.

: Bearbeitet durch User
von NichtLib Nutzer (Gast)


Lesenswert?

Wenn man Geschwindigkeit will dann sind Libs halt scheisse.

Wenn ich sehe wie da für jedes Pixel eine SPI-Tranaction
angeworfen wird dann dauert das halt seine Zeit. Da macht
sich von den Schreibern auch keiner grosse Gedanken zur
Geschwindigkeit bzw Optimierung. Hauptsache die Hardware
verkauft sich und das Zeugs funktioniert einigermassen.

Wenn's wirklich gut werden soll muss man halt selber Hand
anlegen.

Hier ein paar Gedanken dazu.

Beitrag "ILI9341 langsam Verbesserungsvorschläge?"

von John Doe (Gast)


Lesenswert?

Sven Scholz schrieb:
> Das schreibt mir dann HELLO WORLD (grüne Schrift auf schwarzem
> Hintergrund) auf das Display.
> Klappt also richtig gut - nur leider viel viel zu langsam.
>
> Woran kann das liegen?
> Kann das evtl. jemand nachvollziehen bzw. den einfachen Aufbau mit einem
> LCD nachstellen?
> Ich denke dass irgendetwas mit der Portierung der Adafruit-Library nicht
> stimmt. Oder schon beim spi_master-Driver innerhalb der esp-idf.

Wie NichtLib Nutzer schon schreibt, liegt das an der grützigen Library, 
die Du benutzt. Die braucht ein VIELFACHES der Zeit, die nötig ist.

Da Du ja eh das IDF nutzt, wieso programmierst Du dann den SPI-Transfer 
nicht selber?
Schwierig ist das nicht und ausserdem noch brauchbar dokumentiert. Für 
die Ausgabe von Text kannst Du auch noch DMA nutzen.
Doku wie üblich bei Espressif:
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/spi_master.html

von Sven Scholz (Gast)


Lesenswert?

Hallo

@NichtLib Nutzer: Die Bibliothek "TFT_eSPI" von Bodmer bekomme ich so 
ohne Weiteres nicht kompiliert, da hier Sachen von der Arduino Umgebung 
benutzt werden, die ich unter dem ESP-IDF nicht habe.

@John Doe: Ja, scheint mir auch so dass ich das selbst schreiben muss. 
Allerdings ist es schon seltsam, dass man nix findet für das ESP-IDF...

von NichtLib Nutzer (Gast)


Lesenswert?

Sven Scholz schrieb:
> @NichtLib Nutzer: Die Bibliothek "TFT_eSPI" von Bodmer bekomme ich so
> ohne Weiteres nicht kompiliert

Sorry, weder habe ich dir empfohlen noch nahegelegt irgendeine
Lib zu verwenden oder auch nur zu compilieren.

Auch solltest du nicht annehmen dass meine NichtLib Library
anstelle dessen zu verwenden wäre.

Also tu was du willst aber jammere nicht an mich hin dass dies
und das nicht funktionieren würde.

von Stefan F. (Gast)


Lesenswert?

Sven Scholz schrieb:
> Allerdings ist es schon seltsam, dass man nix findet für das ESP-IDF...

Mich wundert es nicht, denn das IDF ist noch ziemlich neu.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.