1 Zusammenfassung
Dieses Tutorial beschreibt die Ansteuerung des ILI9341-SPI-Displays mit einem Mikrocontroller der MSP430-Serie von Texas Instruments. Als Mikrocontroller wird der MSP430G2553 verwendet. Dieser ist auf den Launchpad EXP430G2 Revision 1.5 aufgebaut. Das Tutorial richtet sich eher an Anwender der MSP430-Serie. Jedoch sollte die Bibliothek “ili9341.c“ Mikrocontroller unabhängig sein.
1.1 Hardware
Die Abbildung 1 stellt den Testaufbau dar (links das EXP430G2-Launchpad und rechts das ILI9341-SPI-Display. Da der Aufbau sehr simpel ist, werden fliegende Drehte für die Verbindungen genutzt.
1.2 Software
Für die Software würde die IAR-Entwicklungsumgebung genutzt (iar-ili9341-beispielcode). Der Quellcode ist 2,78 kB Groß und kann noch mit der Kickstart-Version von IAR (maximal 8 kB) abgespielt werden. Die Software zum ILI9341-SPI-Display ist wie folgt unterteilt:
Tab. 1: Unterteilung der Software des ILI9341-SPI-Kontrollers
Bibliothek | Funktion |
main.c | Hauptprogramm des Projekts, beinhaltet ein Anwendungsbeispiel welches alle Grafik-Funktionen den Anwender anzeigen soll |
ili9341.c | Alle Funktionen und Defines für den ILI9341-Kontroller |
ascii.h | Header-Datei mit 128 Ansi-Zeichen |
2 Hardware
Die hier eingesetzten Mittel werden in Tabelle 2 zusammengefasst.
Tab. 2: Eingesetzte Hard- und Software
Mittel | Typ | Notiz |
MSP-EXP430G2 Rev. 1.5 | Hardware | Launchpad von Texas Instruments |
TFT-Display | Hardware | Mit ILI9341-SPI -Kontroller |
IAR MSP430 | Software | Entwicklungumgebung für die MSP430-Serie |
Es wird das Launchpad von Texas Instruments MSP-EXP430G2 Revision 1.5 (http://www.ti.com/tool/msp-exp430g2) genutzt. Darauf wird der Mikrocontroller MSP430G2553 eingesetzt. Der ganze Aufbau ist in Abbildung 2 zu sehen.
Als Software wird die kostenlose IAR-Kicksartversion genutzt (http://www.ti.com/tool/iar-kickstart). Die kostenlose Lizens kann für Quellcode bis 8 kB eingesetzt werden. Eine andere kostenlose alternative ist das Programm: Code Composer Studio von Texas Instruments.
Das Blockschaltbild der Hardware ist in Abbildung 3 dargestellt.
Das EXP430G2-Launchpad ist links und das ILI9341-SPI-Display rechts im Bild zu sehen. Beide Platinen werden mittels fliegende Drehte verbunden. Das Launchpad versorgt das ILI9341-SPI-Display mit 3,3 V und GND. Vom MSP430G2553 wir der SPI–Kanal UCB0 genutzt, zusätzlich werden auch 3 digitale Leitungen benötigt. Die Tabelle 3 fasst die Pinbelegung des TFT-Displays und deren Beschreibung zusammen.
Tab. 3:Pinbeschreibung des ILI9341-SPI-Displays
Pin
MSP430G2553 |
Beschreibung | Pin
TFT-Display |
1 VCC | Versorgungsspannung vom Launchpad (3,3 V) | 1 VCC |
2 GND | Masse vom Launchpad | 2 GND |
3 !CS | Chip Select-Leitung, „Inactive High“ | 3 !CS |
4 !RST | Reset-Leitung, „Inactive High“ | 4 !RST |
5 DC | Daten- oder Kommando-Leitung | 5 DC |
6 SDI | SPI-MOSI | 6 SDI |
7 SCK | SPI-Clock | 7 SCK |
8 LED VCC | Spannung für LEDs (3,3 V) | 8 LED VCC |
9 MISO | Nicht angeschlossen | 9 SDO |
Zu beachten ist, dass das Display mit den 3,3 V aus dem Launchpad versorgt werden sollte. Das Display nutzt die SPI-Schnittstelle und wird nur angesprochen werden (kein Auslesen implementiert). Zusätzlich zu SPI wird die Chip-Select-Leitung genutzt, um den Start eines Frames zu signalisieren. Außerdem kann mit der DC-Leitung, zwischen Daten und Command (Kommando) unterschieden werden. Bei „High“ werden Daten und bei „Low“ Befehle gesendet. Abschließend dient der !RST für den Reset des ILI9341.
3 Software
Für das IAR-Projekt sind 4 Dateien zu finden. Diese sind:
- “main.c“ welche das Hauptprogramm beinhaltet,
- “ili9341.h“ / “ili9341.c“ welche zusammen die ILI9341-Lib erzeugen und für die Kommunikation und Interpretation des ILI9341 zuständig sind und
- “ascii.h“ welche die ASCII-Zeichen gespeichert hat.
3.1 “main.c“
Im Hauptprogramm (main) ist ein Beispiel, der die Möglichkeiten des ILI9341 anzeigen soll, implementiert.
In der Abbildung sind links die Main- und rechts die Demo-Funktion dargestellt. Um das Programm bei der Main-Funktion (Abb. 4 – i) zu starten, muss zuerst der Watchdog-Timer unterbrochen werden (Punkt 1). Daraufhin wird die Frequenz des Mikrocontroller eingestellt (Punkt 2). Des Weiteren werden die SPI- und daraufhin das Display initialisiert. Abschließend folgt die Endlosschleife, bei der der Mikrocontroller das Demo-Programm abspielt.
Die Demo-Funktion (Abb. 4 – ii) soll dem Anwender die Möglichkeiten der ILI9341-SPI-Bibliothek vorzeigen. Dem Nutzer sollen verschiedene Farben, Punkte, Rechtecke, Kreise und Texte gezeigt werden. Um die Bibliothek simpel zu gestalten werden auf 3D-Effekte verzichtet.
3.2 “ili9341.c“
Die Bibliothek kümmert sich um die Ansteuerung des ILI9341-SPI-Kontrollers. Diese ist in Header- und Source-Datei aufgeteilt. Die Header beinhaltet: Registernamen, Prototypen und Pin-Bezeichnungen. In der Source-Datei dagegen sind alle Funktionen der Bibliothek zu finden.
Bevor die Funktionen für den ILI9341 präsentiert werden, sollte für das Display noch folgendes beachten werden:
- Die Initialisierungsroutine ist fix und sollte nicht geändert werden.
- Man kann dem Kontroller entweder nur Befehle oder Befehle mit nachfolgenden Daten senden.
- Wenn Daten gesendet werden, dann müssen diese „quittiert“ werden. Dies macht der Anwender mit dem Befehl 0x2C (oder als #define ILI9341_RAMWR in der Header hinterlegt). Wann diese „quittiert“ werden müssen, kann auch im Datenblatt nachgeschaut werden. Bei jedem möglichen Befehl folgt ein Flussdiagramm welcher erläutert, wie der Befehl angewandt wird.
Tab. 4: Pseudocode zum Senden von Befehlen mit Datensatz
// Sende Befehl (daher spreche Register an)
|
- Die maximale SPI-Frequenz ist laut Datenblatt 10 MHz
Alle Funktionen der ILI9341-SPI-Bibliothek sind in Tabelle 5 sind zusammengefasst.
Tab. 5: Funktionen und deren Beschreibung für die“ili93415.c“[1]
Funktion | Beschreibung |
ILI9341_SPI_init()* | Initialisiert die SPI-Schnittstelle des Mikrocontrollers. |
ILI9341_SPI_transmit ()* | Senden und Empfangen von Nachrichten über die SPI Schnittstellen. |
ILI9341_SendComand () | Sende dem ILI9341 einen Befehl. |
ILI9341_SendData8 () | Sende dem ILI9341 einen 8-Bit-Datensatz. |
ILI9341_SendData16 () | Sende dem ILI9341 einen 16-Bit-Datensatz. |
ILI9341_SendPackage () | Sende dem ILI9341 eine Array aus 16-Bit-Daten. |
ILI9341_Init () | Initialisiere das ILI9341-SPI-Display. Beachte vorher sollte die SPI-Schnittstelle initialisieren werden. |
ILI9341_Orientation () | Stellt die Ausrichtung vom Display ein. Dabei kann zwischen 4 Motiven gewählt werden. Zwei-mal als Portrait und zwei-mal als Landscape. |
ILI9341_DisplayINV () | Inventiert die Farben des Displays. |
ILI9341_DisplayONorOFF () | Schaltet das Display an oder aus. |
ILI9341_SetX () | Setze den Cursor der X-Koordinate. Kann dabei mehrere stellen setzen. Jedoch wird dies hier noch nicht „quittiert“. |
ILI9341_SetY () | Setze den Cursor der Y-Koordinate. Kann dabei mehrere stellen setzen. Jedoch wird dies hier noch nicht „quittiert“. |
ILI9341_SetXY () | Setze den Cursor der X- und Y-Koordinate. Daraufhin „quittiere“ die Eingabe. Das setzen heißt nicht das ein Pixel auch gezeichnet wird. Zum Zeichnen nutze Funktion ILI9341_SetPixel(). |
ILI9341_SetPixel () | Zeichnet ein einzelnes Pixel auf das Display. |
ILI9341_DrawPixel () | Zeichnet ein einzelnes Pixel auf das Display. |
ILI9341_DrawPixelXY () | Zeichnet mehrere Pixel auf das Display, indem das Pixel auch eine Breite bekommt. |
ILI9341_DrawChar () | Zeichnet ein ASCII-Zeichen auf das Display. |
ILI9341_DrawString () | Zeichnet ein ASCII-String (mehrere Zeichen) auf das Display. |
ILI9341_DrawVLine () | Zeichnet eine vertikale Linie auf das Display. |
ILI9341_DrawHLine () | Zeichnet eine horizontale Linie auf das Display. |
ILI9341_DrawLine () | Zeichnet eine Linie auf das Display. |
ILI9341_DrawRectangle () | Zeichnet ein Rechteck auf das Display. |
ILI9341_DrawCircle () | Zeichnet ein Kreis auf das Display. |
ILI9341_FillScreen () | Befüllt das ganze Display mit der erwünschten Farbe. |
ILI9341_FillRectangle () | Zeichnet auf das Display ein Rechteck und befüllt es mit Farbe. |
ILI9341_FillCircle () | Zeichnet auf das Display ein Kreis und befüllt es mit Farbe. |
ILI9341_GraphDemo () | Führt ein Beispielprogramm für den Anwender aus. Gezeigt werden alle Möglichkeiten der Bibliothek. |
* Diese Funktion muss angepasst werden falls ein anderer Mikrocontroller genutzt wird.
3.3 Anpassungen für alternativen Mikrocontroller
Wenn ein Anwender einen anderen Mikrocontroller als den MSP430G2553 nutzen möchte, dann muss dieser folgende Änderungen vornehmen:
- Die Defines ILI9341_CS, ILI9341_MOSI, ILI9341_SCK, ILI9341_DC und ILI9341_RST bearbeiten (in der ”ili9341.h” zu finden)
- Funktion ILI9341_SPI_init() bearbeiten (vgl. auch Tabelle 5)
- Funktion ILI9341_SPI_ transmit () bearbeiten (vgl. auch Tabelle 5)
Defines
Für die ILI9341_CS-, ILI9341_DC-, und ILI9341_RST-Pins sollten normale GPIOs als Ausgänge genutzt werden. Da zusätzlich die ILI9341_CS- und ILI9341_RST-Pins „Inactive High“ sind, sollten diese auch mit „High“ initialisiert werden. Der ILI9341_DC wird später im Programm genutzt. Dieser wird benötigt um zwischen Befehl und Datensatz zu unterscheiden.
ILI9341_SPI_init()
Hier findet die Initialisierung der SPI-Schnittstelle statt. Der Ablauf sollte den nachfolgenden Pseudocode folgen:
Tab. 6: Pseudocode der SPI-Initialisierung
// SPI für Incative Low, MSB first, 8-Bit, MCU ist Master einstellen
|
ILI9341_SPI_transmit()
Aufgabe der Funktion ist es Nachrichten zu dem ILI9341-SPI-Kontroller zu senden. Prinzipiell könnte man auch Nachrichten vom Display empfangen, dies wurde jedoch hier nicht implementiert.
Die Transmit-Funktion sollte wie in Tabelle 7 beschrieben aufgebaut sein.
Tab. 7: Pseudocode der Transmit-Funktion
// Sende Daten über TX-Puffer
|
4 Tests
Die ILI9341-SPI-Bibliothek wurde verschiedenen Software-Tests unterzogen. Die nachfolgende Tabelle fasst die Ergebnisse der Tests zusammen:
Tab. 8: Software-Tests des ILI9341-SPI-Displays
Parameter | Wert | Notiz |
SPI-Frequenz | 8 MHz | Einwandfrei – Laut Datenblatt maximal 10 MHz möglich. |
Orientation | 0°, 90°, 180° und 270° | Alle 4 funktionieren einwandfrei. |
Draw Pixel
Draw Kreis Draw Rechteck Draw Text |
– | Einwandfrei – Beim Text ist noch ein Bug. Dieser wird sichtbar wenn man zu große Textgröße wählt. |
5 Weiterführende Literatur
6 Literatur
[1] | https://github.com/gmtii/ili9341-arduino/blob/master/TFTv2.h, 2016 |
[2] | Datenblatt ILI9341, Ilitek, 2016 |
Kontakt-Formular
Sie haben Fragen zu dem Tutorial?
Dann schreiben Sie mir einfach eine Nachricht über folgendes Formular oder senden Sie mir eine E-Mail.