ILI9341 mit RGB-Interface rotieren

Gast #6196543
Lesenswert?

Hallo zusammen,

ich soll die Firmware für ein Projekt mit einem STM32 und einem 320x240 
Display schreiben. Das Display hat einen ILI9341-Controller, der per 
RGB-Interface seine Pixeldaten bekommt.

Das funktioniert auch einwandfrei, wenn ich das Display hochkant (also 
240x320) konfiguriere. Aber im Projekt soll es Querformat (also 320x240) 
haben.

Jetzt kann ich zwar über MADCTL die Anzeige um 90° drehen, aber ich 
bekomm es nicht hin, dass der ILI9431 mehr als 240 Pixel pro Zeile 
annimmt. Ich sehe mit dem Oszi, dass ich 320 Pixel pro HSYNC sende, aber 
egal, was ich anstelle, der ILI9431 zeigt nur 240 davon an. Die 
restlichen 80 Pixel sind leer (weiß).

Wenn ich die Bildaten per SPI ins RAM des ILI9341 schreibe, kann ich das 
ganze Bild korrekt ausfüllen, nur per RGB-Interface geht es nicht. Es 
scheint fast, als würde der ILI9341 im RGB-Interface pro HSYNC nur 240 
Pixel akzeptieren und die restlichen einfach ignorieren.

Hat jemand Rat?

Danke und bleibt gesund

Mod: Titel korrigiert.
Moderator Persönliche Seite #6196568
Lesenswert?

Ich habe mal den Titel korrigiert, Du hattest 3 und 4 in ILI9341 
vertauscht.

Zum Thema: Soviel ich weiß, geht das mit dem Rotate so nicht. Du musst 
das tatsächlich in Software machen. Das Problem: Du kannst die 
Schreibrichtung nicht ändern, die bleibt immer gleich.

Genau Deine Problembeschreibung hatte ich zufällig vor ein paar Tagen 
hier in einem älteren Forumsthread gelesen.

Ich glaube, es war dieser hier:

Beitrag "STM32F407 Black und No-Arduino"

Hier konnte "grundschueler" im Landscape-Format auch nur 240x240 
beschreiben. Kann aber auch sein, dass sein Problem gelöst wurde. So 
richtig klar geht das aus dem Thread nicht hervor.

Allerdings wurden ihm ein paar wichtige Tipps gegeben, was zu beachten 
ist.
Gast #6196587
Lesenswert?

Bei mir hat damals das hier funktionert:
1
// define width and height (depends on rotation)
2
#if ( ILI9341_ROTATE == 0) || ( ILI9341_ROTATE == 180)
3
    #define ILI9341_WIDTH 240
4
    #define ILI9341_HEIGHT 320
5
#endif
6
#if ( ILI9341_ROTATE == 90) || ( ILI9341_ROTATE == 270)
7
    #define ILI9341_WIDTH 320
8
    #define ILI9341_HEIGHT 240
9
#endif
10

11
...
12

13
    // change orientation
14
    // and set color order
15
    ili9341_command( MEMORY_ACCESS_CONTROL);
16
    #if ILI9341_ROTATE == 0
17
        ili9341_data( MEMORY_ACCESS_CONTROL_BGR | MEMORY_ACCESS_CONTROL_MX);
18
    #endif
19
    #if ILI9341_ROTATE == 90
20
        ili9341_data( MEMORY_ACCESS_CONTROL_BGR | MEMORY_ACCESS_CONTROL_MV);
21
    #endif
22
    #if ILI9341_ROTATE == 180
23
        ili9341_data( MEMORY_ACCESS_CONTROL_BGR | MEMORY_ACCESS_CONTROL_MY);
24
    #endif
25
    #if ILI9341_ROTATE == 270
26
        ili9341_data( MEMORY_ACCESS_CONTROL_BGR | MEMORY_ACCESS_CONTROL_MY | MEMORY_ACCESS_CONTROL_MX | MEMORY_ACCESS_CONTROL_MV);
27
    #endif
Gast #6196588
Lesenswert?

Frank M. schrieb:
> Hier konnte "grundschueler" im Landscape-Format auch nur 240x240
> beschreiben.

Prinzipell geht das schon (mit SPI), aber der TO spricht ja vom
RGB Interface wo es nicht funktionieren soll.

Ich vermute jedoch dass seine SPI- und RGB- Implementierung nicht
ganz die gleiche ist.
Gast #6198669
Lesenswert?

Frank M. schrieb:
> Ich habe mal den Titel korrigiert, Du hattest 3 und 4 in ILI9341
> vertauscht.

Oh, danke!

>
> Zum Thema: Soviel ich weiß, geht das mit dem Rotate so nicht. Du musst
> das tatsächlich in Software machen.

Hab ich jetzt auch gemacht, war einfacher als ich zuerst befürchtet 
hatte.

Ich habe noch das hier gefunden:
https://forum.littlevgl.com/t/littlevgl-stm32f429-ili9341-rotate-landscape-solved/1606

Hab's aber noch nicht näher angeschaut.
#7762828
Lesenswert?

Hallo, wenn das Thema auch schon älter ist, im Web taucht ständig die Frage auf, ob man den Display mit dem ILI9341 von Portrait (240x320) auf Landscape (320x240) umstellen kann. Es bezieht sich allerdings auf das RGB Interface, welches mit Pixelclock, HSync, VSync und DE (data enable) arbeitet. Die Antwort ist nein. Bei der Seite, durch obigen Link, wird eine Auflösung von 320x320 gefahren. Gut dann sind genügend Zeilen in der Ausgabe vorhanden und der Display ignoriert vermutlich die weiteren Pixel in der Zeile. Nur ist das halt unnötiger Speicher im Framebuffer.

Habe das alles ausprobiert um für mein eigens Projekt den besten Weg zu finden. SPI ist viel zu langsam und beim 8080 16 Bit BUS Interface muss auf den Tearing Effekt geachtet werden. Die Lösung über einen Video Controller zu gehen ist meines Erachtens die beste. Gerade mit den STM32xxx Controller sollte das kein Problem sein. Dann kann man doch das Bild um 90 Grad drehen per Software oder Video DMA.

Gruß Sascha

Moderator Persönliche Seite #7762886
Lesenswert?

Sascha P. schrieb:

Hallo, wenn das Thema auch schon älter ist, im Web taucht ständig die Frage auf, ob man den Display mit dem ILI9341 von Portrait (240x320) auf Landscape (320x240) umstellen kann.

Beim ILI9341 mit FSMC-Bus geht das, siehe https://www.mikrocontroller.net/articles/STECCY#Display bzw. https://www.mikrocontroller.net/wikifiles/8/88/Steccy-ili9341.png

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren