Effiziente Anzeige einfacher Texte/Grafiken auf einem Farb-LCD von ARM

Wie sollte man beim Entwerfen eines ARM-basierten Geräts, das einfache Grafiken auf einem Farb-LCD anzeigen soll, am besten vorgehen, um schnelle Updates zu ermöglichen, vorzugsweise ohne an einen bestimmten ARM- oder LCD-Anbieter gebunden zu sein? Mein aktuelles Projekt verwendet ein Schwarz-Weiß-Display, das blitzschnell von einem SPI-Port auf einem PIC angesteuert werden kann (Neuzeichnen eines komplexen Displays in 1/60 Sekunde). Es scheint, dass übliche Farb-LCD-Displays einen SPI-Anschluss haben, aber selbst das Füllen eines 160 x 120-LCD mit einer Volltonfarbe würde 30 ms dauern, und ein 320 x 240 würde im besten Fall 120 ms dauern (10-MHz-Verschiebungstakt).

Wenn man die Controller-Pins sparen könnte, könnte der Parallelmodus besser sein, aber ich kenne keine familienunabhängige Möglichkeit, die parallele Schnittstelle anzuschließen, ohne drei separate Speicheranweisungen für jedes Pixel zu benötigen (eine zum Einstellen der Daten, eine, um den Taktausgang hoch zu setzen, und eine, um ihn niedrig zu takten). Einige ARM-Chips haben Speicherbus-Schnittstellen, aber diese möchten oft Dinge wie das Multiplexen von Adressen und Daten tun oder viele Pins für die Ausgabe irrelevanter Adressbits festlegen (das LCD würde nur ein Adressbit benötigen).

Betrachtet man den ILI9320 von ILITEK oder den HD66789 von Renesas, wäre ein Ansatz, der interessant erscheinen würde, die Verwendung eines CPLD zur Konvertierung von SPI in parallele Daten und die Einbeziehung eines Modus, der ein Pixel pro Bit ausgeben würde. Wenn man sich das Renesas-Datenblatt ansieht, ist es möglicherweise möglich, Pixel-pro-Bit-Schreibvorgänge mit minimaler Hardware (kein CPLD erforderlich) zu erhalten, indem alle Datenbits des parallelen Anschlusses den seriellen Daten-Pin verfolgen und den seriellen Modus für alles außer Pixel verwenden schreibt, und Verwenden der Vergleichs-/Maskierungsfunktionen, so dass entweder Pixel, die nur aus Nullen bestehen, transparent sind und Pixel, die nur aus Einsen bestehen, ausgewählte Bits im GRAM setzen würden, oder Pixel, die nur aus Einsen bestehen, transparent sind und Pixel aus ausschließlich Nullen ausgewählte Bits löschen würden. Der Abschnitt "Features" des IKITEK-Datenblatts schlägt vor, dass es eine ähnliche Funktionalität hat, aber die Registerkarten nicht

Unter der Annahme, dass der Code hauptsächlich einfarbigen Text und Grafiken anzeigt, scheint der ideale Ansatz darin zu bestehen, ein CPLD zu verwenden, um den SPI-Port des ARM mit dem parallelen Port des Displays zu verbinden und zu ermöglichen, dass das CPLD mit Vorder- / Hintergrundfarben geladen wird. Dies wäre besonders schön, wenn man eine Möglichkeit hätte, "transparente" Pixel zu schreiben. Bei einer Schriftart als zweifarbige Bitmap könnte man die Schriftartdaten einfach direkt in den SPI-Port laden; dies würde ermöglichen, dass Schriftdaten alle zwei ARM-Takte mit einer Rate von einem Pixel angezeigt werden. Andererseits würde ein CPLD, das ausreicht, um eine solche Anzeigesteuerungsaufgabe zu bewältigen, etwa 2 US-Dollar kosten.

Was ist der beste Weg, um einen ARM mit einem Farb-LCD zu verbinden, wenn das Ziel darin besteht, hauptsächlich einfarbigen Text oder einfache (z. B. 16-farbige oder 64-farbige) Grafiken anzuzeigen?

Bearbeiten

Ich habe viele LCD-Display-Projekte mit vielen Arten von LCDs durchgeführt, einschließlich Zeichenmodus-LCDs, benutzerdefinierter 3: 1-Multiplex-Segment-basierter Verwendung meiner eigenen Antriebsmethode, Schwarzweiß-Grafik-LCDs mit integrierten Controllern und Schwarz-und -weiße LCDs, für die ich meinen eigenen CPLD-basierten Controller entwickelt habe, um eine Schnittstelle mit dem Allzweck-DMA eines Mikrocontrollers herzustellen (der sogar vierstufige Graustufen bereitstellt). Ich bin stolz darauf, Displays flink zu machen. Einer der Grafikcontroller war ein bisschen wie ein Hund, der etwa 1/10 Sekunde für eine vollständige Bildschirmaktualisierung benötigte, selbst wenn konstante Daten geschrieben wurden, aber die meisten meiner Displays können sogar ein ziemlich komplexes Bild in weniger als 1/50 Sekunde rendern.

Viele der Projekte, die ich mache, sind batteriebetrieben, daher ist die Stromaufnahme ein Problem. Der DMA-basierte Display-Controller, den ich gemacht habe, hat gut funktioniert, aber er war für ein netzbetriebenes Projekt. Ich glaube, die einzige Möglichkeit, eine vernünftige Stromaufnahme aus einem Grafik-LCD zu erzielen, besteht darin, einen Controller zu verwenden, der den Anzeigepuffer und die Spaltentreiber kombiniert. Das Senden einer großen Anzeige zwischen den Chips in jedem Frame würde selbst bei einer Anzeige mit einem einzigen Bit pro Pixel viel Energie verschwenden. Auf einem Farbdisplay mit sechzehn Bit pro Pixel wäre es weitaus schlimmer.

Ich habe nur angefangen, mir Farb-LCD-Datenblätter anzusehen; Viele Displays scheinen einen ähnlichen Controller wie den ILITEK ILI9320 zu verwenden, obwohl alle Datenblätter, die ich für Controller gefunden habe, die auf diesem allgemeinen Design basieren, als "vorläufig" gekennzeichnet wurden. Einige wie die von ILITEK behaupten, Maskierungs- und Transparenzfunktionen zu haben, listen aber keine Register dafür auf; Ich weiß nicht, ob die echten Chips solche Funktionen haben, aber die "vorläufigen" Datenblätter haben sie nicht aufgenommen, oder ob sie die Funktionen weggelassen, aber vergessen haben, sie zu erwähnen. Wenn in der Praxis alle diese Chips Transparenzmerkmale haben, erscheint es vernünftig, für sie zu entwerfen; wenn nicht, nicht.

Ich würde erwarten, dass für die meisten Projekte ein typischer Bildschirm aus willkürlich platziertem Text in einer moderaten Anzahl von einfarbigen Schriftarten beliebiger Größe besteht. Schriftarten würden höchstwahrscheinlich als Bit-pro-Pixel-Daten gespeichert werden. Wenn ich mit einem Cortex-M3 die Anzeige mit parallelen Daten schreiben wollte, würde die "innere Schleife" des Codes zum Schreiben von zwei Pixeln wahrscheinlich so enden:

  Rolle r0,r0,#2 ; Holen Sie sich ein Bit in C, das andere in N
  itcs
  strhcs r1,[r3,#DATA_OFS] ; Daten schreiben
  strhcc r2,[r3,#DATA_OFS] ; Daten schreiben
  strb r4,[r3,#CLOCK_SET_OFS] ; Stellen Sie die Uhr hoch
  strb r4,[r3,#CLOCK_CLR_OFS] ; Uhr niedrig stellen
  itmi
  strhmi r1,[r3,#DATA_OFS] ; Daten schreiben
  strhpl r2,[r3,#DATA_OFS] ; Daten schreiben
  strb r4,[r3,#CLOCK_SET_OFS] ; Stellen Sie die Uhr hoch
  strb r4,[r3,#CLOCK_CLR_OFS] ; Uhr niedrig stellen

Nicht gerade das schnellste Ding der Welt. Das Eliminieren der Schreibvorgänge in die Anweisungen zum Setzen/Löschen der Uhr würde helfen. Meine Vermutung wäre, dass es keine nette architekturunabhängige Möglichkeit gibt, beide Taktschreibvorgänge zu eliminieren, aber es kann eine ziemlich übliche Methode geben, die es ermöglicht, einen zu eliminieren (z kurz als Reaktion auf eine einzelne Speicheroperation).

Die Verwendung des SPI-Ports und das Hinzufügen von Hardware zum Takten von einem Pixel pro Bit würde den Anzeigezugriff erheblich beschleunigen. Wenn ein Display ohne Maskierung und Transparenz verwendet wird, müsste das CPLD einen Adresszähler enthalten und für jedes Pixel entweder ein Wort mit Pixeldaten oder einen Set-Adress-Befehl für die Position des folgenden Pixels takten (für das es einen Zähler benötigen würde). ). Wenn dagegen ein Display Maskierung und Transparenz hätte, müsste das CPLD nur einen Modus unterstützen, in dem nach dem Eintakten von 16 Bit jedes zusätzliche Bit ein Datenwort mit dem an das Display ausgibt LSB-Tracking des SDI-Pins (es ist möglicherweise nicht einmal erforderlich, ein CPLD zu verwenden - nur ein paar normale Logikchips). Ich würde die Transparenzfarbe auf die be-Farbe setzen, die ich schreiben möchte, aber mit umgedrehtem LSB.

Ich möchte kein schönes Design entwickeln, das auf Maskierung und Transparenz beruht, und dann feststellen, dass die einzigen Displays mit solchen Funktionen eine Vorlaufzeit von 30 Wochen haben. Auf der anderen Seite, wenn solche Displays bei vielen Anbietern weit verbreitet sein und bleiben, möchte ich mich nicht von Paranoia über die Verfügbarkeit dazu bringen lassen, ein minderwertiges Design zu verwenden.

Keine Antwort, da Ihre Anforderungen beinhalten, nicht an einen bestimmten ARM-Anbieter gebunden zu sein, aber die Mikrocontroller-Familie LPC LH754xx enthält einen integrierten LCD-Treiber.
@reemrevnivek: Es gibt eine Reihe von ARM-Chips mit kleinen LCD-Treibern; Ich kann mir nicht vorstellen, dass irgendein Chip einen Treiber hat, der für ein Grafikdisplay in brauchbarer Größe geeignet ist, der in einem Paket erscheint, das in etwas anderem als einem Chip-on-Glass-Szenario verwendbar wäre. Ein Chip mag einen Controller haben, aber ein LCD mit einem Chip-on-Glass-Controller scheint energieeffizienter und einfacher zu handhaben. Ich werde mir aber den Chip ansehen, den du erwähnt hast - könnte interessant sein.
@supercat - Ich denke an LCDs mit einer RGB-Schnittstelle: Pixeltakt-, Frame-Sync- und Line-Sync-Steuerleitungen mit einem parallelen Pixeldatenbus. Erwarten Sie, ein COG-gesteuertes Display zu verwenden?
@reemrevnivek: Das hatte ich mir auch gedacht. Sie scheinen ziemlich verbreitet zu sein, da sie in vielen tragbaren batteriebetriebenen Geräten wie Mobiltelefonen verwendet werden. Ein COG-Display mit eingebautem Controller ist viel energieeffizienter als eines, das kontinuierlich getaktete RGB-Daten benötigt.
@reemrevnivek: Ich habe meine Frage gerade mit mehr Details aktualisiert.

Antworten (1)

Das Problem bei der Verwendung eines Mikrocontrollers zum Ansteuern eines LCD besteht darin, dass ein LCD ständige Aufmerksamkeit erfordert. Dies kann mit einem über SPI gesteuerten CPLD (natürlich mit DMA) gemildert werden, aber dann stoßen Sie auf das andere Problem: Farb-LCDs erfordern vielvon Dateien. 320 x 240 in Schwarzweiß ist mit 9,6 KB marginal, aber machen Sie daraus 24-Bit-Farbe und plötzlich müssen Sie 230 KB an Daten in 1/60 Sekunde liefern. (Vergessen Sie jedoch nicht, dass Sie eine 4-Bit-16-Farben-Steuerung erhalten können, indem Sie einfach die niedrigen 20 Bits an eine Einstellung binden). Ein 24-Bit-Frame-Puffer passt bei den meisten Mikrocontrollern nicht mehr in den Onboard-RAM, und Sie haben wahrscheinlich keine Zeit, von einem externen RAM-Chip zu lesen, die Daten auszutakten und noch andere Verarbeitungen durchzuführen. Der Versuch, dies mit einem CPLD (oder einem FPGA) und einem RAM-Chip zu tun, bringt Sie weit über den Preis von 2 US-Dollar hinaus, der Sie dazu gebracht hat, sich in Ihrer Frage zu sträuben.

Die traditionelle Lösung, um einen Mikrocontroller mit einem Farb-LCD zu verbinden, ist ein Display-Controller wie ein SSD1963. Hier ist ein sehr einfaches Blockdiagramm:

MCU zu RAM-Puffer und -Registern und von dort zur LCD-Schnittstelle

Paralleler Eingang zu einem großen RAM-Rahmenpuffer (Übersetzung: Mehr als 2 US-Dollar), der mit einer registerkonfigurierbaren parallelen LCD-Schnittstelle verbunden ist. Der parallele Eingang ist normalerweise mit einer Speicherbusschnittstelle kompatibel.

Der Farb-LCD-Markt ist im Internet nicht immer leicht zu finden, da er normalerweise nur die Domäne von OEMs ist, während der Rest Displays von Unternehmen kauft, die den Controller mit dem Display integrieren. Die beste Ressource, die ich gefunden habe, war Crystal Fontz, insbesondere diese Seite zur Auswahl von Grafik-LCDs . Scrollen Sie nach unten für die Controller, die die folgenden Optionen enthalten (Hinweis: Nicht alle sind Farbcontroller):

  • Epson S1D13521B01 E-Ink-Broschüre (1 Modul)
  • Epson S1D13700 (11 Module)
  • Epson SED1520 kompatibel (8 Module)
  • Himax HX8345 kompatibel (1 Modul)
  • ILITek ILI9325 kompatibel (3 Module)
  • KS0107/KS0108 kompatibel (26 Module)
  • Novatek NT7534 (14 Module)
  • Orise Technology OTM2201A (1 Modul)
  • Orise Technology SPFD5420A (1 Modul)
  • RAiO RA8835 (1 Modul)
  • Sanyo LC7981 (13 Module)
  • Sino Wealth SH1101A (2 Module)
  • Sitronix ST7920 (29 Module)
  • Solomon SSD1303 (1 Modul)
  • Solomon SSD1305 (9 Module)
  • Solomon SSD1325 (2 Module)
  • Solomon SSD1332 (1 Modul)
  • Solomon SSD2119 (2 Module)
  • ST STV8105 (1 Modul)
  • Toshiba T6963 (23 Module)
@reemrevnivek: Ich hatte an Farb-LCDs mit eingebauten Controllern gedacht. Sie scheinen ziemlich häufig zu sein, aber die, die ich gesehen habe, scheinen im Allgemeinen zu erwarten, dass die CPU viele Bits pro Pixel eintaktet, obwohl ein übliches Anzeigeszenario die Anzeige von einfarbigem Text ist. Ich habe einmal einen DMA-basierten 4-Stufen-Graustufen-LCD-Controller mit einem CPLD implementiert, und es funktionierte sehr gut, aber das war ein netzbetriebenes Gerät.
@supercat - Sehr wenige LCD-Controller erwarten, dass eine CPU für jeden Frame viele Bits pro Pixel eintaktet. Sie erwarten im Allgemeinen, dass dedizierte Grafikhardware dies tut. Sobald Sie zu ziemlich großen (dh > 128 * 128) RGB-Displays kommen, ist die zum Erzeugen des Bildes für den Bildschirm erforderliche Rechenleistung groß genug, dass eine dedizierte GPU (auch wenn sie in die MCU integriert ist) ausreichend ist eigentlich immer präsent.
@Fake Name: Wenn das Ziel darin bestand, Full-Motion-Videos anzuzeigen, wäre spezielle Hardware erforderlich. Aber mein Ziel ist es, schnell einfachen Text und einfache Grafiken anzuzeigen. Die Controller, die ich mir angesehen habe, haben eine maximale SPI-Datenrate von 10 MBit/s; diese Grenze würde unabhängig davon gelten, ob die Daten von einer CPU oder einem dedizierten Controller geliefert werden. Die Verwendung eines parallelen Eingabemodus würde die Dinge beschleunigen, aber wenn Zeichenformen mit 1 Bit pro Pixel gespeichert werden (wie dies typisch wäre), wäre die Verwendung von Code zum Entpacken langsamer als die ARM-Ausgabe von SPI und eine CPLD-Konvertierung in parallel Daten.
@supercat - Aber was Sie beschreiben, ein spezialisiertes CPLD, das Konvertierungen von ASCII in Raster durchführt, ist im Grunde (benutzerdefinierte) spezialisierte Grafikhardware . Ich sage im Grunde, erfinde das Rad nicht neu, und es ist wahrscheinlich einfacher und kostengünstiger, einfach eine MCU mit eingebauter Videoschnittstelle zu kaufen und dann selbst eine zu entwerfen.
Wie auch immer, wenn Sie wirklich selbst rollen möchten, würde ich sagen, verwenden Sie ein paar Dual-Port-SRAM-ICs und verwenden Sie einen Port für die Ausgabe an das LCD und den anderen für die MCU. Dadurch kann die MCU den Speicherinhalt mit beliebiger Geschwindigkeit ändern, und das LCD kann mit seiner Bildwiederholfrequenz betrieben werden.
Alle hochauflösenden LCDs, die ich gesehen habe, kümmern sich nicht wirklich um die Adressierung, sie haben normalerweise nur einen Frame-Start (vsync), einen Zeilenstart (hsync) und einen Takteingang (und die Pixeldatenleitungen, aber das ist eine Selbstverständlichkeit ). Grundsätzlich verwenden Sie ein paar Zähler und einige UND-Gatter, so dass jeder Pixeltakt die Adresse für die SRAM-Daten erhöht und die UND-Gatter die h- und v-Sync-Signale zur richtigen Zeit ausgeben. Das Ganze läuft dann mit der Taktrate, die erforderlich ist, um Ihnen die gewünschte Bildwiederholfrequenz zu bieten.
@Fake Name - Ja, das ist die Art von LCD, mit der ich auch vertraut bin. Die COG-Anzeigen, auf die sich Supercat bezieht, sind für mich Neuland.
@Fake Name: Es wäre keine Konvertierung von ASCII in Raster. Es wäre im Grunde eine Bit-pro-Pixel-zu-Multibit-pro-Pixel-Konvertierung. Ich glaube du missverstehst was ich meine. Ich suche nicht nach Displays, die nur Treiber haben , sondern solche, die Treiber und Controller enthalten , sodass sie nur dann mit Daten versorgt werden müssen, wenn sich Dinge auf dem Bildschirm ändern.
@Fake Name: Ich würde mir ein Display wie crystalfontz.com/products/document/2361/… ansehen , dessen Controller-Datenblatt unter crystalfontz.com/controllers/SSD2119.pdf zu finden ist (beachten Sie, dass viele Displays einige Controller-Pins weglassen , und dass viele Controller diesem ähneln, aber etwas anders sind).
@reemrevnivek: Links zu der Art der Anzeige, die ich betrachte, finden Sie im obigen Kommentar.