Maximale SPI-Geschwindigkeit des TFT-Displays

Ich habe ein 1,8" TFT-Farbdisplay von Banggood. Es ist sehr schön mit den lebendigen Farben.

Die Bildschirmaktualisierung ist jedoch langsam. Ich bin durch die SPI-Geschwindigkeit von 1 MHz begrenzt. Daraus ergibt sich eine Aktualisierungsrate von:

160 Pixel x 128 Pixel x 16 Bit/Pixel ÷ 1 MHz = 0,33 s pro Frame

Tatsächlich ist es sogar noch niedriger, da der Teensy LC nach jedem Byte für etwa 1 Zyklus stoppt und zwischen den SPI-Transaktionen ein Overhead entsteht. Es sind also eher 0,5 s pro Frame oder 2 fps, was sehr auffällig ist. Es ist eher eine Wischanimation von links nach rechts (siehe Bild unten).

1,8" TFT-Display mit Breadboard

Also meine Frage ist:

  • Ist die Geschwindigkeit durch den Display-Controller-Chip begrenzt, wahrscheinlich ein ST7735 ?
  • Oder ist die Geschwindigkeit durch meine Steckbrettverkabelung begrenzt?
  • Gibt es ein schnelleres Display, bei dem ich den SPI-Bus mit 4 oder 8 MHz verwenden könnte?

Aktualisieren

Hier ist ein Bild von der Unterseite des Boards.

Geben Sie hier die Bildbeschreibung ein

Nicht viel zu sehen:

  • Der SD-Kartenslot und die drei Widerstände R1 bis R3 werden nicht verwendet.
  • Der Widerstand R4 in der Nähe des LED-Pins (ganz rechts im Bild) ist mit dem LED-Pin verbunden und hat 7,5 Ω (7R5).
  • Der Teil mit drei Beinen in der oberen Ecke lautet „V2PK“. Ich denke, es ist ein Spannungsregler, der für den 5-V-Betrieb verwendet werden würde. Ich betreibe es mit 3,3V. Es gibt auch einen Kondensator und einen offenen Jumper in der Nähe.

Der interessante Teil ist wahrscheinlich zwischen der Platine und dem Display versteckt.

Eine Frage hier muss auf tatsächlichen soliden Informationen basieren - Sie müssen den tatsächlichen Controller-Chip spezifizieren und sein Datenblatt überprüfen. Ihre Verkabelung sollte gut bis weit über 1 MHz liegen. Vielleicht möchten Sie auch den SPI über eine DMA-Engine im Kinetis-Chip von Teensy speisen. Und Sie müssen auch berücksichtigen, woher die Daten kommen - wenn Sie sie über USB übertragen, könnte dies theoretisch schnell sein, typische Implementierungen, die Sie wahrscheinlich verwendet haben, könnten jedoch ziemlich langsam sein. Aber am Ende, nein, SPI wird nicht als Hochgeschwindigkeits-Display-Schnittstelle betrachtet.
Ich benutze den DMA, um den SPI zu füttern. Und ich habe es auf den Umfang überprüft. Der Teensy kann mit 2 MHz problemlos einen korrekten SPI erzeugen, aber das Display funktioniert nicht mehr. Leider kenne ich die genaue Spezifikation des Anzeigetreiber-Chips nicht, da Banggood sie nicht spezifiziert hat und der Chip auf der Platine nicht sichtbar ist. Ich habe meine Implementierung jedoch auf das Datenblatt des ST7735 gestützt und es scheint zu stimmen.
@Codo könntest du bitte das Bild von der Unterseite der Anzeigetafel posten? Ich muss sehen, ob Vorwiderstände vorhanden sind ... Alternativ: Können Sie bestätigen, dass die Platine genau das ist, was Sie gepostet haben? Als zweite Frage: hast du es ohne DMA versucht (aber mit einem 4MHz Spi?)?
Ich habe ein Bild und eine Beschreibung der Unterseite hinzugefügt. Ich kann keine Vorwiderstände für MOSI und SCK sehen.
@Codo Sie könnten versuchen, das Display mit 5 V zu versorgen: Der Regler regelt die Leistung auf 3,3 V (die Logiksignale müssen auf 3,3 V gehalten werden). Oder Sie können J1 kurzschließen.
Nach weiterer Analyse scheint es eher ein Softwareproblem als ein Hardwareproblem zu sein. Aber die eigentliche Ursache habe ich noch nicht gefunden. Die Bilder werden auf einem Mac generiert und per USB an den Teensy und dann per SPI an das Display gesendet. Obwohl das Bild in 2K-Stücke aufgeteilt ist, die Übertragung auf etwa 80 % der SPI-Geschwindigkeit gedrosselt ist, eine robuste Speicherverwaltung vorhanden ist, die Daten bei unzureichender Leistung verwirft, eine effiziente Verarbeitung in Interrupt-Handlern und über DMA, scheint ein unvorhersehbarer Schluckauf aufzutreten für Geschwindigkeiten über 1 MHz. Der Teensy 8K RAM ist für diese Art von Setup eher klein ...
Bitte posten Sie die Lösung als Selbstantwort auf Ihre Frage, anstatt die Frage zu ändern. Sie können Ihre eigenen Fragen definitiv beantworten, wenn Sie Lösungen finden, insbesondere wenn sie nicht vollständig durch andere Antworten abgedeckt werden.

Antworten (3)

TSCYCR , Serieller Taktzyklus (Lesen) beträgt 150 ns. Das sind 6,6 MHz. Aber erwarten Sie keine Wunder von einem SPI-Display. (Es könnte bei 10 MHz gut funktionieren)
Die Software sollte optimiert werden, um die geringste Anzahl von Pixeln pro Aktualisierung zu aktualisieren.

Es gibt noch ein paar Dinge, die Sie tun können:
- Reduzieren Sie die Farbtiefe.
- Verwenden Sie ein längeres Wort. (zB: 16 statt 8 Bit)
- Stellen Sie sicher, dass die SPI-Routine, falls sie blockiert, so kurz wie möglich ist. Warten Sie nicht, bis der Spi fertig ist, warten Sie, bis der Spi für ein neues Wort bereit ist.

Wenn Sie eine schnelle Anzeige wünschen, besorgen Sie sich eine parallele mit Bildpuffer, auf der Sie Operationen ausführen können.

Danke für den Hinweis auf den TSCYCR. Also sollte der Chip - sofern es sich um einen ST7735 handelt - zu höheren Geschwindigkeiten fähig sein. Wenn ich jetzt nur wüsste, welcher Teil nicht über 1 MHz hinaus funktioniert. Und was die Tipps betrifft: Die Optimierung für minimale Aktualisierungen ist sicherlich eine Option. Eventuell auch Reduzierung der Farbtiefen. Das Blockieren ist sicherlich kein Problem, da ich DMA verwende. Längere Wörter würden die Geschwindigkeit nur um etwa 6 % verbessern.
Tatsächlich ist TSCYCW (anstelle von TSCYCR) relevant, da ich Daten auf das Display schreibe. TSCYCW beträgt 66 ns, was 15 MHz entspricht. Noch seltsamer ...
Sie sollten sich nicht TSCYCR ansehen, sondern TSCYCW, das 66 ns beträgt. Das bedeutet 15 MHz. Mit 8 MHz können Sie auf diesem Display "leicht" bis zu 20 fps erreichen.
@next-hack ja, das stimmt. Abgesehen davon, dass das spontane Ändern der SPI-Frequenz etwas unpraktisch sein könnte. Deshalb bin ich mit dem Langsamsten gefahren.
Ja, aber normalerweise möchten Sie nicht aus dem Anzeigespeicher lesen, sondern ihn nur als reines Schreibgerät verwenden. Und dieses Modell erlaubt auch kein Zurücklesen von Anzeigedaten.
Es stellte sich heraus, dass es sich um ein Softwareproblem handelte. Aber Ihre Antwort bestätigte, dass ich das Limit der Anzeige noch nicht erreicht hatte. Also habe ich weiter daran gearbeitet und die Lösung gefunden.

Ich habe das beste Ergebnis (über 30 fps) mit der TFT_eSPI-Bibliothek https://github.com/Bodmer/TFT_eSPI erzielt , wo der Inhalt in ein Sprite gepuffert wird. Die in der Config-Datei eingestellte Baudrate funktionierte einwandfrei (auf meinem Board). Dieser Code lief auf einem ESP32, der mit dem Display verbunden war.

#define SPI_FREQUENCY 40000000

Es funktioniert jetzt richtig. Auf einem Teensy LC läuft er mit 16 MHz, auf einem Teensy 3.2 mit 18 MHz. Beides sind die maximalen SPI-Taktraten für diese Boards.

Es stellte sich heraus, dass es sich um ein Softwareproblem handelte. Das Hauptproblem war, dass ich DMA nicht richtig deaktiviert hatte. Es würde dann bei der nächsten SPI-Übertragung zu früh eingreifen, dh es würde mit dem ersten Byte der Übertragung beginnen, obwohl es mit dem zweiten Byte beginnen sollte. Dies brachte ein paar Dinge durcheinander und ließ das Gerät auf das letzte zu übertragende Byte warten.

Ich verstehe immer noch nicht wirklich, warum es bei niedrigeren Frequenzen funktionierte, aber bei höheren scheiterte.