Hallo,
ich brauche eure Hilfe,
bekomme das Dispay mit dem Chip ST7789V nicht ans laufen.
Den u.g. Initialisierungscode kommt vom Displayliefgerant.
Ich möchte zum Anfang einfach mal nur ein paart Pixels setzen.....
Ja ich weiß, es gibt libs, aber ich möchte erst mal sehen, ob das
Display überhaut etwas macht.
Die Hintergrundbeleuchtung geht an. Sonst passiert aber nichts auf dem
Display. Hier der Code:
Mal abgesehen von deiner - hmmm, sagen wir ambitionierten -
Initialisierung fällt zunächst Folgendes auf:
Dirk F. schrieb:> lcddata (0x2c); // Memory write
RAMWR ist ein Command und sollte nicht als Data gesendet werden.
Ich bin gerade fertig mit dem Schreiben eines Treibers für einen ST7735,
der braucht als Initialisierung nur: SLPOUT, INVOFF, DISPON, NORON.
Deine
1
lcdput (0xe0 ,0xd0); // Resister, Data
2
…
Orgie ist höchstwahrscheinlich sowohl unnötig, als auch fehlerhaft.
Nach GMCTRP1 und GMCTRP2 Command kommen normalerweise ganze Säcke voller
Daten. Am Stück! Nicht Byteweise.
Wastl schrieb:> Anschließen musst du den CS natürlich auch.
Ja , hab ich.
Die Frage ist, wann muss ein _CS kommen ?
Für jedes Byte oder für eine Sequenz Command,Data1,Data2....
Dirk F. schrieb:> Die Frage ist, wann muss ein _CS kommen ?
Vor einer Sequenz, und nach der Sequenz zurücksetzen.
Das steht übrigens alles im Datenblatt des Controllers.
Harry L. schrieb:> Vor einer Sequenz, und nach der Sequenz zurücksetzen.
Als Anlage ein Teil der Anleitung vom Displaylieferanten, der aber
leider keinen Support macht.
Als Beispiel der dritte Befehl 0xb2.
Ist das dann so richtig:
_CS auf low
0xb2 als command senden
5 Byte (0x0c....0x33) als Data senden
_CS auf high
Dirk F. schrieb:> Ist das dann so richtig:> _CS auf low> 0xb2 als command senden> 5 Byte (0x0c....0x33) als Data senden> _CS auf high
Zumindest beim ST7735 muss CS nicht dynamisch gesetzt werden.
Es reicht wenn man CS zum Anfang des Jahres auf Low setzt und im
Anschluss kontinuierlich CMDs und DATA sendet. Gegen Silvester dann CS
wieder auf High.
Norbert schrieb:> Zumindest beim ST7735 muss CS nicht dynamisch gesetzt werden.> Es reicht wenn man CS zum Anfang des Jahres auf Low setzt und im> Anschluss kontinuierlich CMDs und DATA sendet. Gegen Silvester dann CS> wieder auf High.
Das kann man zwar so machen, spart aber kaum Zeit und erschwert im
Fehlerfall die Fehlersuche ganz erheblich, da CS nicht nur als
ChipSelect dient, sondern auch die Controller-interne State-Machine in
einen definierten Zustand zwingt.
Daher ist es best-Practice CS lt. Datenblatt zu verwenden.
Harry L. schrieb:> spart aber kaum Zeit
Jaaaaa, ich weiß worauf du hinaus willst. Das Problem ist aber das man
erst den kompletten SPI FIFO bzw. dessen Entleerung abwarten muss bevor
man CS hoch hebt. Das kann sich als durchaus lästig erweisen wenn man
etwas wirklich Schnelles bauen möchte.
Deshalb lohnt es sich über einen Zwischenweg nachzudenken, eine
komplette Zeichenoperation bestehend aus einem Sack voller CMDs und DATA
zusammen zu fassen und diese Sequenz in /CS und CS zu kapseln.
Das Beste aus beiden Welten sozusagen.
Hallo,
vielen Dank für die bisherigen Hinweise, die ich versucht habe
umzusetzen.
Hier ist der neue Code. Leider immer noch keine Reaktion im Display....
Bitte um weitere Hinweise.
Norbert schrieb:> Das Problem ist aber das man> erst den kompletten SPI FIFO bzw. dessen Entleerung abwarten muss bevor> man CS hoch hebt.
Hättest du das nicht schon letzte Woche schreiben können? ;-)
Hab gerade angefangen einen Textausgabe für ILI9341 auf einem STM32 zu
schreiben (gibts schon, aber ich will es selber lernen).
Dabei bin ich über 2h genau an diesem Problem festgehangen: Auf dem DSO
habe ich mir den Anfang der SPI-Kommunikation angesehen - passt
eigentlich alles.
Bis irgendwann mal zum Ende der Sequenz gescrollt habe und dort auf CS
gestoßen bin.
Norbert schrieb:> eine komplette Zeichenoperation bestehend aus einem Sack voller CMDs> und DATA zusammen zu fassen und diese Sequenz in /CS und CS zu kapseln.
Mal sehen wie ich das noch einbauen kann.
Das wird dann wohl auf unterschiedliche Senderoutinen rauslaufen...
Die Klammern gehören bei Funktionen immer direkt ohne Leerzeichen an den
Namen.
Wirst du nach Zeichanzahl bezahlt? Schon mal was von einem Array gehört?
Das löst zwar nicht dein Problem, verbessert deinen Programmierstil aber
sichtbar. Eher so.
Danke Falk.
Ja stimmt. Wollte nur erst mal "quick and dirty" sehen, ob das Display
überhaupt etwas macht, um Layoutfehler auszuschließen.
Jetzt ist es ansprechbar, dann kommt Optiomierung.
Noch was:
geht nicht:
Dirk F. schrieb:> funktioniert:for (i=0;i<62000;i++)> {> lcd_cs_lo(); // Slave select low> lcddat(0xff); // Bildschirm löschen> lcd_cs_hi(); // Slave select high> }
Ist aber Unfug! Man muss nicht für jedes Byte einen komplette CS-Zyklus
durchlaufen, schon gar nicht, wenn du bei jedem CS Wechsel 1ms wartest!
Warum machst du nicht das Offensichtliche?
Dirk F. schrieb:> Habe auch die Wartezeit von 1 ms auf 20us reduziert.
Naja, ein Workaround. Was für einen Controller hast du? Und an welcher
Schnittstelle hängt dein LCD? SPI oder UART im SPI Modus? Man kann das
Ende der Übertragung in einem Register abfragen, dann ist die Wartezeit
immer minimal.
Falk B. schrieb:> Was für einen Controller hast du?PIC32MZ. Display am SPI mit 1 MHz
Falk B. schrieb:> Ende der Übertragung in einem Register abfragen, dann ist die Wartezeit> immer minimal.
Ja kommt später noch....
Dirk F. schrieb:>> Ende der Übertragung in einem Register abfragen, dann ist die Wartezeit>> immer minimal.> Ja kommt später noch....
Wieso? Das ist elementar und einfach und man baut das gleich ein.
Dirk F. schrieb:> Komisch ist, dass die Sache mit dem !SPI2STATbits.SPITBE (Transmit> Puffer nicht Empty) nicht funktioniert..
Der Puffer/FIFO kann durchaus schon leer sein während die Hardware noch
die letzten Bits raus schiebt. Beim RP2040 nehme ich gerne das SPI busy
flag um das zu erkennen.
Norbert schrieb:> Der Puffer/FIFO kann durchaus schon leer sein während die Hardware noch> die letzten Bits raus schiebt.
Ja das ist genau so eine Falle, in die man reintappen kann.
Und wenn man dann wie beim Display kaum Diagnosemöglichkeiten hat und
LCD einfach keine Reaktion von sich gibt, kann das schnell frustrierend
werden.....