I²C

I²C (Inter-Integrated Circuit) (gesprochen aɪ skwɛərd ˈsiː oder aɪ tuː ˈsiː) ist ein Kommunikationsprotokoll zwischen verschiedenen Schaltungsteilen. Es wurde vor über 40 Jahren von Philips entwickelt und ist inzwischen zum Industriestandard geworden. Auch der Raspberry Pi 4 unterstützt dieses serielle Protokoll. Es wurde so gebaut, dass man möglichst wenig Verbindungen zwischen zwei Komponenten zur Kommunikation benötigt.Vielleicht ist dir im Python GPIO Post schon aufgefallen, dass einige Pins nicht für die GPIO Programmierung zur Verfügung stehen.

Raspberry Pi 4 GPIO Pinout (Bild von pinout.xyz) I²C Pins sind blau unterlegt.
Raspberry Pi 4 GPIO Pinout (Bild von pinout.xyz)

Funktionsweise von I²C

Bei I²C handelt es um einen Bus, über den mindestens ein Controller mehrere Targets steuern kann. Ein Target kann ein Sensor oder ein Display sein und jedes Target hat eine eindeutige Adresse, durch die der Controller es ansprechen kann.

Für I²C benötigt man normalerweise nur zwei Leitungen, die üblicherweise mit SCL (serial Clock) und SDA (serial Data) bezeichnet werden. SCL liefert ein Taktsignal in dem die Daten über SDA übertragen werden, beide Leitungen sind über einen 1,8kΩ PullUp Widerstand an die Versorgungsspannung angeschlossen. Viele Sensoren haben meist 4 Anschlüsse, da noch Vcc für die Versorgungsspannung und GND für Masse dazu kommen, da der Sensor auch messen soll, wenn gerade keine Daten übertragen werden sollen, ebenso soll ein Display auch etwas anzeigen, wenn keine Datenübertragung stattfindet.

Rückseite eines LED Matrix Display mit der typischen Anschlussleiste für I²C auf der rechten Seite (SCL, SDA, VCC, GND) (von oben nach unten)
Olli Graf - raspithek.de
led-matrix-backCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
Rückseite eines LED Matrix Display mit der typischen Anschlussleiste für I²C auf der rechten Seite (SCL, SDA, VCC, GND) (von oben nach unten)

Der Controller entscheidet, ob ein Target auf den Bus schreiben darf, in dem er den Bus zwischen Lesen und Schreiben hin und her schaltet. Kein Target kann von sich aus die Kommunikation beginnen.

Verschaltung der I²C Targets mit dem Controller über SCL und SDA
Verschaltung der I²C Targets mit dem Controller über SCL und SDA

Data Frame

Der Data Frame beginnt mit dem Startbit.Dieses legt die SDA Leitung auf LOW und die Targets wissen jetzt, dass sie aufpassen müssen. Danach folgen 7 Bits für die Targetadresse. Die Adresse ist 7-Bit breit und wird das Most Sigfinicant Bit wird zuerst gesendet. Es stehen folglich maximal 27= 128 Adressen für angeschlossene Targets zur Verfügung, da einige Adressen allerdings reserviert sind, bleiben nur 112 Adressen zur freien Verwendung. Jede Adresse darf nur einem Target zugeordnet sein! Sobald das Adressbyte übertragen ist, reagiert nur noch das Target mit der angebenden Adresse. Nach übertragenen Byte wird mit einem ACK/NAK (Acknowledge /No Acknowledge) signalisiert, dass es korrekt empfangen wurde (oder nicht).

Im achten Bit der Adresse teilt der Controller mit, ob er Daten erwartet oder sendet (Lesen=1, Schreiben=0),

Die einzelnen Bits des Data Frame bei I²C
Die einzelnen Bits des Data Frame bei I²C

Nach dem Startbit folgen immer die Targetadresse mit R/W und ACK. Bis zum Stopbit reihen sich dann mehrere Datenbytes mit ihrem ACK aneinander.

Im Standardmodus beträgt die Übertragungsgeschwindigkeit 100Kbit/s, im Fast Mode 400Kbit/s. der Highspeed Mode schafft 3,4Mbit/s und im Ultra-Fast Mode sind sogar 5Mbit/s möglich. Die Übertragungsgeschwindigkeit kann variable durch das Clocksignal umgeschaltet werden.

I²C beim Raspberry Pi 4B

Der Raspi verfügt über zwei I²C Kanäle: I2C0 auf den Pins 27 und 28 und I2C1auf den Pins 3 und 5. I2C0 wird häufig zum Anbinden des EEPROM auf einem HAT (Hardware Attached on Top) benutzt. Sofern du ein solches nicht benutzt, kannst den Kanal auch selber nutzen.

Standardmäßig ist I²C beim Raspberry Pi abgeschaltet und muss erst von dir eingeschaltet werden.

I²C Sensoren und Aktoren

Im Regelfall solltest du Sensoren und Aktoren immer auf Breakoutboards kaufen. Auf der kleinen Platine sitzt neben dem Sensor dann auch alle Elektronik für die Kommunikation mit dem I²C Bus benötigt wird, über eine Stiftleiste kannst das Board über Jumperkabel anschließen. Die Belegung der Pins ist meist auf dem Breakoutboard aufgedruckt.

i²C beim Raspberry Pi Pico

Auch der RP2040 des Pico stellt zwei I²C Kanäle zur Verfügung. Sie teilen sich teilweise auf Pins mit UART oder SPI, weswegen unser Programm auf den jeweiligen Betriebsmodus umschalten muss.

Praktisches Beispiel

Nach so viel Theorie, basteln wir jetzt was. Dazu brauchst du einen Raspberry Pi 4 (oder 3) und einen BME280 Wettersensor auf einem Breakoutboard.

Dies ist aber für diesen Blockpost zu komplex, daher folgt das später in einem weiteren.

Schreibe einen Kommentar

Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Olli Graf - raspithek.de
WordPress Cookie Hinweis von Real Cookie Banner