Homepage Wiki Forum Buy

Port Expander PCA9555

Aus GNUBLIN

Schwierigkeitsgrad Voraussetzung Gnublin Familie
Gnublin logo easy.png Grundkenntnisse Konsole Alle

Inhaltsverzeichnis

Möchte man zusätzliche GPIO-Pins mithilfe des Gnublins ansteuern empfiehlt sich ein sogeannter Port-Expander. Hier wird die Verwendung des PCA9555 erläutert.

Quickstart

Der PCA9555 ist ein Port-Expander mit 16 GPIO-Pins, die alle bequem über I2C angesteuert werden können.

MODULE-PORTEXPANDER SCHRAEGBILD 002.jpg

Hinweis: Dieser Artikel basiert auf der GNUBLIN Distribution bzw. dem dort beinhalteten Community Kernel.

Mit dem Community Kernel muss man das Modul nur noch mithilfe des Flachbandkabels am Gnublin anschließen(Achtung das Flachbandkabel muss mit dem roten Kabel in Richtung der SD Karte zeigen), Alle Adressjumper auf 'LOW' stecken(=> I2C-Adresse = 0x20) und die 2 Jumper für I2C-Pullups stecken:


Für Anfänger

Ansteuerung mit gnbulin-pca9555

Möchte man sofort loslegen, so empfiehlt es sich das Programm gnublin-pca9555 zu verwenden. Hier ist ein Beispielaufruf um Pin 0 als Ausgang mit High-Level zu konfigurieren:

root@gnublin:~# gnublin-pca9555 -p 0 -o 1


Der nachfolgende Befehl setzt den Pin wieder auf Low-Level:

root@gnublin:~# gnublin-pca9555 -p 0 -o 0

Um den aktuellen Zustand eines OUTPUTS abzufragen, verwendet man -r als Parameter:

root@gnublin:~# gnublin-pca9555 -p 0 -r

Möchte man stattdessen einen Pin als Eingang setzten und den Wert abfragen, so kann man das wie folgt machen:

root@gnublin:~# gnublin-pca9555 -p 3 -i

Die Pins sind wie folgt nummeriert:

PCA9555 Pin Wert für gnublin-pca9555 -p xx
IO 0_0 0
IO 0_1 1
IO 0_2 2
IO 0_3 3
IO 0_4 4
IO 0_5 5
IO 0_6 6
IO 0_7 7
IO 1_0 8
IO 1_1 9
IO 1_2 10
IO 1_3 11
IO 1_4 12
IO 1_5 13
IO 1_6 14
IO 1_7 15


Weitere Optionen sind:

-a     Angabe der I2C-Adresse des Modules, Standardadresse is 0x20
-P     Ansteuern eines ganzen Ports (0,1)
-j     Ausgabe erfolgt in JSON Format
-b     minimale Ausgabe
-h     Hilfetext anzeigen

Ansteuerung mit gnublin-gpio

Zuerst muss der Treiber folgendermaßen geladen werden, falls man den Port-Expander mit dem Programm gnublin-gpio ansteuern möchte:

root@gnublin:~# modprobe pca953x cnt=<Int> addr1=<I2C-Adresse>
  1. cnt gibt die Anzahl der angesteckten Port-Expanders an (default=1)
  2. addr1 gibt die I2C-Adresse des ersten Port-Expanders an (Hex)
  3. addr2 gibt die I2C_Adresse des zweiten Port-Expanders an (Hex)
  4. addr3, addr4 , und addr5 analog zu addr1

Hat man zum Beispiel einen Port-Expander an der Adresse 0x20 hängen so tippt man folgendes ein:

root@gnublin:~# modprobe pca953x addr1=0x20

Hat man zum Beispiel zwei Port-Expander an den Adressen 0x20 und 0x24 hängen, so tippt man folgendes ein:

root@gnublin:~# modprobe pca953x cnt=2 addr1=0x20 addr2=0x24

Die Adressen des Port Expanders ergeben sich, je nachdem wie die Adressjumper gesteckt sind.

Mit i2cdetect -y 1 kann man sich die Adressen der angeschlossenen und erkannten I2C-Geräte anzeigen lassen. Wobei PCA9555 Port-Expander im Bereich von 0x20 und 0x27 liegen.

GPIO Pin als Ausgang

Den Wert eines GPIO Pin lässt sich nun folgendermaßen setzten:

root@gnublin:~# gnublin-gpio -o 1 -p 98

Dieser Befehl setzt IO0_0 als Ausgang und den Pegel auf HIGH.

Mit

root@gnublin:~# gnublin-gpio -o 0 -p 98

kann man den Pegel wieder auf LOW bringen.

GPIO Pin als Eingang

Denn Wert des aktuellen Pins kann man wie folgt auslesen:

root@gnublin:~# gnublin-gpio -i -p <pin>

Der Wert <pin> steht für den zu verwendeten GPIO Pin. Im nächsten Abschnitt sind die IO-Pins des Port-Expanders und die dazugehörigen Werte für <pin> notiert.


IO Pins des Port Expanders und Werte für Gpio-sysfs

Hier ist eine Tabelle für die IO-Pins des PCA9555 und der dazugehörigen Nummer im gpio-sysfs. Die Ansteuerung erfolgt analog zu dem Beispiel mit gpio98.

PCA9555 Pin Wert für /sys/class/gpio/export
IO 0_0 98
IO 0_1 99
IO 0_2 100
IO 0_3 101
IO 0_4 102
IO 0_5 103
IO 0_6 104
IO 0_7 105
IO 1_0 106
IO 1_1 107
IO 1_2 108
IO 1_3 109
IO 1_4 110
IO 1_5 111
IO 1_6 112
IO 1_7 113

Für Fortgeschrittene

Vorbereitungen

Zuerst löten wir die benötigten Pins des Port Expanders (SCL,SDA,A0,A1,A1,VCC,GND und die benötigten GPIO-Pins) entweder direkt an das Gnublin, oder nur an ein paar Drähte für die spätere Verwendung mit einem Breakboard.

PCA9555.jpg

Beim anschließenden Verdrahten muss darauf geachtet werden, dass man die SDA- und SCL-leitung über Pullup-widerstände (4,7kOhm) mit VCC verbindet. (siehe I2C Spezifikation)

Hier sieht man den generellen Aufbau des I2C-BUS.

I2c pca.jpg

Hier sieht man die Pinbelegung des Portexpanders:

PCA9555 pins.jpg

Die I2C Adresse kann man über die Pins A0,A1 und A2 einstellen, je nachdem welchen Pegel man an die Pins setzt verändert sich die Adresse. (siehe Datenblatt) Sind alle drei Pins an GND angeschlossen, ergibt sich die Adresse 0x20 für lesenden Zugriff und 0x21 für schreibenden Zugriff auf den Port Expander.

Zugriff über GPIO-sysfs

Zuerst muss man das Treibermodul laden:

root@gnublin:~# modprobe pca953x

Pins exportieren

Möchte man nun zum Beispiel den IO 0_0 des PCA9555 verwenden, so gibt man folgendes ein:

root@gnublin:~# echo 98 > /sys/class/gpio/export

Damit wird der IO 0_0 Pin des PCA9555 im gpio-sysfs registriert.

Pin als Ausgang konfigurieren und Pegel ändern

Anschließend konfigurieren wir mit folgendem Befehl den Pin als Ausgang:

root@gnublin:~# echo out > /sys/class/gpio/gpio98/direction

Möchten wir nun einen High-Pegel am Pin erzeugen geben wir folgendes ein:

root@gnublin:~# echo 1 > /sys/class/gpio/gpio98/value

Der folgende Befehl setzt den Pin wieder auf Low-Pegel:

root@gnublin:~# echo 0 > /sys/class/gpio/gpio98/value

Pin als Eingang konfigurieren und Wert auslesen

Möchte man den Pin als Eingang konfigurieren so gibt man folgendes ein:

root@gnublin:~# echo in > /sys/class/gpio/gpio98/direction

Auslesen kann man den Eingang dann mit:

root@gnublin:~# cat /sys/class/gpio/gpio98/value


In dieser Tabelle sieht man welche IOs zu welchen Nummern im GPIO-sysfs gehören.


Kernelmodul aktivieren

Kernelmodul aktivieren unter:

Device Drivers --> GPIO Support --> PCA953x, PCA955x, TCA64xx, and MAX7310 I/O ports

Kernel kompilieren und Module installieren (näheres hier). Alles auf SD karte kopieren.


Gnublin booten.

Test mit Demoprogramm

Im Ordner /root/ oder im GIT gibt es im examples Ordner ein Beispielprogramm in C. Das Demo kann auf dem Board direkt übersetzt werden.

root@gnublin:~# cd /root/examples/misc/pca9555
root@gnublin:~# gcc -o i2ctest i2ctest.c

Und anschließend kann man es starten:

root@gnublin:~# ./i2c-test /dev/i2c-1

Das Demoprogramm ist relativ simpel aufgebaut und bewirkt lediglich, dass alle GPIO-Pins vom Port0 als Output gesetzt werden und auf High gesetzt werden.

Test mit der Konsole

Möchte man den Port Expander jedoch über die Konsole ansteuern geht man wie folgt vor:

i2c-tools installieren

Man benötigt das Paket i2c-tools, welches man entweder per apt-get install i2c-tools (Debian mit Internetverbindung) oder wie in diesem Artikel beschrieben, installiert.

i2c-set Syntax

Anschließend kann man das Programm i2c-set verwenden um die gewünschten IO-Pins an- bzw. abzuschalten. Der Syntax des Programms lautet wie folgt:

root@gnublin:~# i2c-set I2CINTERFACE SLAVEADRESSE REGISTERADRESSE DATEN

Die einzelnen Werte lauten wie folgt:

I2CINTERFACE 		= 1 		(da wir das Device i2c-1 verwenden)
SLAVEADRESSE 		= 0x20		(falls A0,A1 und A2 mit GND verbunden sind)
REGISTERADRESSE 	= spezifisch, je nachdem welche Pins an- bzw. abgeschalten werden sollen. Siehe weiter unten.
DATEN			= spezifisch, je nachdem welche Pins an- bzw. abgeschalten werden sollen. Siehe weiter unten.

Die wichtigen Registeradressen des Portexpanders sind 0x02,0x03,0x06 und 0x07.

Register Grundwissen

Das Register an der Adresse 0x06 ist für die Richtung (Eingang/Ausgang) der Pins von Port-0 zuständig.

Bit 7 6 5 4 3 2 1 0
Symbol C0.7 C0.6 C0.5 C0.4 C0.3 C0.2 C0.1 C0.0
Default 1 1 1 1 1 1 1 1

Das Register an der Adresse 0x07 ist für die Richtung (Eingang/Ausgang) der Pins von Port-1 zuständig.

Bit 7 6 5 4 3 2 1 0
Symbol C1.7 C1.6 C1.5 C1.4 C1.3 C1.2 C1.1 C1.0
Default 1 1 1 1 1 1 1 1

Möchte man zum Beispiel alle Pins von Port-0 als Ausgang setzen schreibt man einfach den Wert 0x00 an die Registeradresse 0x06. Eine 0 bedeutet Ausgang und eine 1 Eingang.


Das Register an der Adresse 0x02 ist für den Pegel der Pins von Port-0 zuständig.

Bit 7 6 5 4 3 2 1 0
Symbol O0.7 O0.6 O0.5 O0.4 O0.3 O0.2 O0.1 O0.0
Default 1 1 1 1 1 1 1 1

Das Register an der Adresse 0x03 ist für den Pegel der Pins von Port-1 zuständig.

Bit 7 6 5 4 3 2 1 0
Symbol O1.7 O1.6 O1.5 O1.4 O1.3 O1.2 O1.1 O1.0
Default 1 1 1 1 1 1 1 1

Möchte man zum Beispiel den Pin 0 von Port 1 auf High setzen, schreibt man den Wert 0x01 an die Registeradresse 0x03. Eine 0 bedeutet LOW-Pegel, eine 1 bedeutet HIGH-Pegel.


Beispielbefehle

Um alle Pins des Port-0 als Ausgang zu konfigurieren verwenden wir den folgenden Befehl:

root@gnublin:~# i2cset 1 0x20 0x06 0x00

Anschließend kann man zum Beispiel ausschließlich Pin-1 auf High setzen, dies geschieht folgendermaßen:

root@gnublin:~# i2cset -y 1 0x20 0x02 0x01

Möchte man den alle Pins von Port-0 wieder auf Low setzen wird folgender Befehl verwendet:

root@gnublin:~# i2cset -y 1 0x20 0x02 0x00
In anderen Sprachen