Hallo,
Ich nutze einen "relativ" neuen STM32U575RGTX, an diesem habe ich ein
2.8" ILI9341 TFT Screen angeschlossen. (War wohl keine Schlaue Idee, man
findet kaum Tutorials zur CPU)
(Ich nutze einen ILI9341 Treiber, den ich auch mit einem STM32F4 nutze
nur mit einem größeren Display. Daher weiß ich, das der Treiber
funktioniert)
Mein Problem ist nun, der ILI9341 Treiber füllt das Display mit den
Farben ROT, GRÜN, BLAU nur dann korrekt, wenn ich die DMA funktion
weglasse, was natürlich tierisch langsam im Bildaufbau ist:
ili9341_gfx.c:
Gibt das Display falsche Farben aus, also bei
ROT=Magenta,Grün=Grün,Blau= Schwarz.
Nun scheint ja der Fehler in der GPDMA1 konfiguration zu liegen, leider
finde ich die GPDMA1 etwas kompliziert, so dass ich es aktuell nicht
geschafft habe, die GPDMA1 so zu konfigurieren, dass Sie so läuft wie
die "Ursprüngliche" die ich aus den STM32F4 kenne..
Kann mir hier jemand weiterhelfen?
vielen Dank,
Daniel
Die Funktion ili9341_transmit_color() erhält ein Array color[], deren
Elemente 16 Bit groß sind. Diese castest Du in einen 8-Bit Pointer -
soweit scheint das in Ordnung zu sein. Aber was ist mit der Variablen
"size"? Ist das die Anzahl der Elemente oder die Anzahl in Bytes?
Was ist mit dem Array color[]? Bleibt das während des kompletten
DMA-Transfers unangetastet? Wenn ja, wie garantierst Du das?
Moin,
Korrekt, das Display ist im 16-Bit Modus konfiguriert, der SPI läuft auf
8-Bit, MSB.
Wenn ich HAL_SPI_Transmit nutze, dann werden die richtigen Farben
angezeigt, aber sobald ich HAL_SPI_Transmit_DMA nutze, scheint irgendwas
anders zu sein, vermutlich geswappte Bits oder ähnliches.
Ich kenne mich leider in der neuen GPDMA1 Konfiguration des STM32U575
nicht so gut aus..
Ich weiß nur, das der Code ohne DMA funktioniert, mit DMA sind die Color
falsch, scheinbar wird hier nochmal was "gedreht"
Hier mal die ganzen Funktionen:
main.c:
Daniel S. schrieb:> Ich kenne mich leider in der neuen GPDMA1 Konfiguration des STM32U575> nicht so gut aus..
Diesen Zustand kann man ändern, indem man das Datenblatt studiert.
Viele Treiber sind da schlecht implementiert, auch bei lvgl Beispielen
ist das meist so das SPI auf 8 Bit eingestellt wird und damit müssen die
colors geswapped abgelegt werden.
Es ist geschickter mit 16 Bit SPI zu arbeiten, das ist schneller als
zwei 8 Bit Transfers und man spart den Schritt mit dem Byte tauschen.
Der DMA steht hier auf Half Word, das sind schon 16 Bit. Es werden also
16 Bit an den 8 Bit SPI geschickt, damit gehen 8 Bit verloren.
Beim 16 Bit SPI passt es mit den 16 Bit colors, nur viele Kommandos
bestehen aus einer ungeraden Anzahl an Bytes. Dafür muss entweder SPI
auf 8 Bit umgestellt werden oder eine 0 als Füllbyte angehängt werden.
Ersteres habe ich schon so gemacht, letzteres sollte nach ILI Datenblatt
funktionieren, habe ich aber noch nicht ausprobiert.