Startseite>I2C-Workshop (Teil 30): I/O-Expander-Baustein MCP23017
Aus Raspberry Pi Geek 04/2020

I2C-Workshop (Teil 30): I/O-Expander-Baustein MCP23017

© Romolo Tavani, 123RF

Intelligenter Anbau

Martin Mohr

Mit dem MCP23017 verschaffen Sie dem RasPi mehr Möglichkeiten, weil er den Mini-Rechner mit weiteren Modulen verbindet.

Den MCP23017 gibt es mit unterschiedlichen Gehäusen. Einige davon erlauben es sogar, sie mit den Mitteln eines Bastlers selbst zu löten. Um sich das Leben etwas leichter zu machen, lohnt es sich aber, auf ein schon verlötetes Modul zurückzugreifen. Die gibt es günstig für 1,28 Euro direkt aus China [1].

Der MCP23017 arbeitet im Spannungsbereich von 1,8 bis 5,5 Volt. Er unterstützt alle üblichen I2C-Bus-Geschwindigkeiten von 100 kHz bis zu 1,7 MHz und verfügt über drei Eingänge, mit denen Sie die I2C-Adresse im Bereich von 0x20h bis 0x27h frei wählen. Das im Beispiel verwendete Modul hatte ab Werk die Adresse 0x20h. Um die Adresse zu modifizieren, verändern Sie die SMD-Brücken.

Die 16 GPIOs teilen sich in zwei Gruppen auf (Port A und Port B), die beide in der Lage sind, einen programmierbaren Interrupt auszulösen. Jeder einzelne Anschluss nimmt bis zu 25 Milliampere auf oder stellt sie bereit. Abbildung 1 zeigt das Pinout.

Abbildung 1: Das Pinout des MCP23017 zeigt unter anderem die zwei Gruppen von GPIOs, die Sie jeweils separat verwenden dürfen.

Abbildung 1: Das Pinout des MCP23017 zeigt unter anderem die zwei Gruppen von GPIOs, die Sie jeweils separat verwenden dürfen.

Intern verfügt der Baustein über 22 Register, über die Sie alle Funktionen steuern. Sie sprechen sie auf zwei verschiedene Arten an (Bank=0 und Bank=1). Je nachdem, welchen Modus Sie verwenden, haben die Register eine andere Adresse. Im Beispiel bleibt die Bank auf der Standardeinstellung (Bank=0). Die Tabelle “Register” zeigt eine Übersicht der Register mit ihren Funktionen in diesem Zustand.

Adresse

Name

Beschreibung

0x00h

IODIRA

für Port A Pin bitweise als Ein-/Ausgang definieren (0=In, 1=Out)

0x01h

IODIRB

für Port B Pin bitweise als Ein-/Ausgang definieren (0=In, 1=Out)

0x02h

IPOLA

festlegen, ob ein Pin invertierend arbeitet (Port A)

0x03h

IPOLB

festlegen, ob ein Pin invertierend arbeitet (Port B)

0x04h

GPINTENA

Freigabe für Interruptverarbeitung (Port A)

0x05h

GPINTENB

Freigabe für Interruptverarbeitung (Port B)

0x06h

DEFVALA

Steuern der Interruptverarbeitung (Port A)

0x07h

DEFVALB

Steuern der Interruptverarbeitung (Port B)

0x08h

INTCONA

Steuern der Interruptverarbeitung (Port A)

0x09h

INTCONB

Steuern der Interruptverarbeitung (Port B)

0x0Ah

IOCON

Konfigurationsregister

0x0Bh

IOCON

Konfigurationsregister

0x0Ch

GPPUA

Pullup-Widerstände aktivieren (Port A)

0x0Dh

GPPUB

Pullup-Widerstände aktivieren (Port B)

0x0Eh

INTFA

Interrupt aufgetreten historisch (Port A)

0x0Fh

INTFB

Interrupt aufgetreten historisch (Port B)

0x10h

INTCAPA

Interrupt genau jetzt (Port A)

0x11h

INTCAPB

Interrupt genau jetzt (Port B)

0x12h

GPIOA

speichert Werte für Port A (R/W)

0x13h

GPIOB

speichert Werte für Port B (R/W)

0x14h

OLATA

Zugriff auf Zwischenspeicher für Port A

0x15h

OLATB

Zugriff auf Zwischenspeicher für Port B

Es gibt eine MCP23017-Variante, die Sie per SPI ansteuern. Sie trägt die Kennung MCP23S17 und ist bis auf den Bus baugleich mit der I2C-Version. Sollten Sie mehr Informationen zum MCP23017 benötigen, werfen Sie einen Blick in das Datenblatt [2].

TIPP

Wie in den letzten Teilen dieser Reihe kommt beim Programmieren und Basteln diesmal wieder die Umgebung zum Einsatz, die bereits in Teil 18 dieser Reihe benutzt wurde. Sie finden den entsprechenden Artikel online [3].

Eingabe

Für einen ersten Versuch verwenden Sie das Modul nur im Eingabemodus. Wie man im Schaltplan (Abbildung 2) erkennt, sind im Versuchsaufbau alle I/Os mit 10K-Widerständen auf Masse gezogen (Pulldown). Das erzeugt an den Eingängen eine logische 0.

Abbildung 2: Der Schaltplan für das Beispiel mit dem Eingabemodus zeigt, wie die I/Os gegen Masse gezogen sind.

Abbildung 2: Der Schaltplan für das Beispiel mit dem Eingabemodus zeigt, wie die I/Os gegen Masse gezogen sind.

Möchten Sie an einem Eingang eine logische 1 erzeugen, verwenden Sie dazu den DIP-Schalter. Auf dem Schaltplan sehen Sie auch, wie Sie den Raspberry Pi an das Modul anschließen. Abbildung 3 zeigt den kompletten Testaufbau. Um zu überprüfen, ob Sie das Modul richtig angeschlossen haben, verwenden Sie das Tool I2cdetect. Die Ausgabe sollte so aussehen wie in Listing 1.

Abbildung 3: Der Testaufbau mit einem MCP23017-Modul und der Input- sowie der Output-Platine.

Abbildung 3: Der Testaufbau mit einem MCP23017-Modul und der Input- sowie der Output-Platine.

Listing 1

$ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

War der Test erfolgreich, gehen Sie einen Schritt weiter und steuern mit den Tools I2cset und I2cget den Baustein von Hand an. In Listing 2 sehen Sie die Kommandos, mit denen Sie die Ports A und B in den Input-Modus schalten. Das Watch-Kommando startet alle zwei Sekunden den Befehl zum Auslesen der Ports, wobei I2cget zum Einsatz kommt.

Listing 2

### IODIR PORT A, alle in
$ i2cset -y 1 0x20 0x00 0xFF
### IODIR PORT B, alle in
$ i2cset -y 1 0x20 0x01 0xFF
$ watch 'i2cget -y 1 0x20 0x12; i2cget -y 1 0x20 0x13'
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
€0,99 – Kaufen
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland