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.
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.
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.
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),
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 I2C1
auf 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.