ILI9341-SPI-Display


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.

aufbau-ili9341-spi-display-und-Launchpad

Abb. 1:Launchpad zusammen mit ILI9341-Display

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.

aufbau-ili9341-spi-display-und-Launchpad

Abb. 2:Launchpad zusammen mit ILI9341-Display

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.

blockschaltbild-ili9341-und-launchpad

Abb. 3: Blockschaltbild ILI9341 und EXP430G2

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:

  1. “main.c“ welche das Hauptprogramm beinhaltet,
  2. “ili9341.h“ / “ili9341.c“ welche zusammen die ILI9341-Lib erzeugen und für die Kommunikation und Interpretation des ILI9341 zuständig sind und
  3. “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.

flussdiagramm-main-ili9341-projekt

Abb. 4: Flussdiagramm der “main.c“ – (i) Main-Funktion, (ii) Demo-Funktion für das Display

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)

// Sende Datensatz (je nach Befehl können es mehrere Daten sein)

// Schreibe die Information im Speicher („quittieren“ mit Befehl 0x2C)

  • 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:

  1. Die Defines ILI9341_CS, ILI9341_MOSI, ILI9341_SCK, ILI9341_DC und ILI9341_RST bearbeiten (in der ”ili9341.h” zu finden)
  2. Funktion ILI9341_SPI_init() bearbeiten (vgl. auch Tabelle 5)
  3. 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

// SPI Modi 0,0 (Clock = Inactive Low, CPHA = Low)

// SPI Frequenz maximal 10MHz

// SPI aktivieren

// SPI Dummy senden (8Bit)

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

// Warte bis Daten übermittelt

// Gebe RX-Puffer zurück (falls empfangen erwünscht ist)


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

Links
http://asf.atmel.com/docs/latest/common.services.gfx.example1.xmega_a3bu_xplained/html/common_ili9341_qs.html
https://pic-projekte.de/blog/ili9341-bibliothek/
https://github.com/gmtii/ili9341-arduino/blob/master/TFTv2.h


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.