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:
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..
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?
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"
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.