Wie funktioniert I2C – einfach erklärt!

I2C

I2C steht für Inter-integrated-circuit, für eine einfache Schreibweise werden die beiden I zusammengenommen und als I2 oder I2 geschrieben. Entwickelt wurde dieses Bussystem vom Philips in den frühen 80er-Jahren für eine einfache Kommunikation zwischen Komponenten. I2C benötigt nur 2 Leitungen, eine SDA (serial data line) über diese die Daten übertragen werden und eine SCL (serial clock line) die Takt-Impulse sendet. Zum Unterschied von UART benutzt I2C eine synchrone Kommunikation über die gemeinsame Clock Leitung und kann damit Geschwindigkeiten von 100 Kbps bis zu 3,4 Mbps im Highspeed mode erreichen. Die beiden Leitungen müssen mit einem Pull-up Widerstand (4,7 -10 kΩ) auf VCC vom Mikroprozessor gezogen werden. Wenn man die am Mikroprozessor vorgesehenen Pins für die I2C Kommunikation verwendet, dann wird der Widerstand nicht benötigt, da sie intern verbaut sind. 

I2C kann mit bis zu 128 (112) Teilnehmer im gleichen Bus bei einer 7-bit Adressierung kommunizieren und jeder Teilnehmer hat eine eindeutige Adresse. Ein paar Adressen sind reserviert aber 112 Adressen können frei genutzt werden. Wenn das zu wenig ist, I2C kann auch mit 10-bit Adressierungen umgehen und damit 1024 (1008) verschiedene Teilnehmer im Bus ansprechen.

Es können mehrere Master und Slaves in einem Bus gleichzeitig betrieben werden. Wenn mehrere Master in einem Bus Verwendung finden, dann darf ein Master, bei einer bestehenden Kommunikation nicht eingreifen. Alle Master im Netzwerk müssen als Multimaster definiert werden um die Regeln für einen Multimaster Betrieb einhalten zu können, damit die bestehende Kommunikation nicht gestört wird. Ein Master darf nur dann ein Signal senden, wenn die SDA Leitung HIGH ist. 

I2C Netzwerk Aufbau
Das Clock Signal

Das Clock Signal synchronisiert die Ausgabe von Datenbits vom Master mit dem Abtasten von Bits durch den Slave. In jedem Taktzyklus wird ein Datenbit übertragen und das bestimmt die Geschwindigkeit der Datenübertragung. 

Um Sicherzustellen, dass das Datensignal genug Zeit hat vom Pegel LOW auf HIGH zu wechseln oder umgekehrt, werden die Daten genau in der Mitte von jedem Clock HIGH Signal gelesen.

Das Start und Stop-bit

Start-bit: Die Datenleitung wird von HIGH auf LOW gesetzt, noch bevor das Clock Signal von HIGH auf LOW geht. 

Stop-bit: Genau umgekehrt wird das Stopp-bit erzeugt, die Datenleitung geht von LOW auf HIGH, nachdem das Clock Signal von LOW auf HIGH gesetzt wird.

I2C Start udnd Stop bit
Adressierung (Ax) und das Read/Write bit

Nach dem Start-bit sendet der Master die Adresse vom Slave, mit dem er Daten austauschen möchte. Die Adresse kann 7 (Standard) oder 10 bit gross sein. In unserem Beispiel verwenden wir eine 7 bit Adresse. Als achtes bit (RW) sendet der Master, ob er den Slave beschreiben will (0 – write) oder ob er vom Slave Daten lesen möchte (1 – read). Beim Beschreiben vom Slave wird RW (read/write) auf 0 gesetzt und beim Daten lesen vom Slave auf 1.
Als Beispiel in diesem 1 Byte (8 bit) grossen Block möchte der Master auf dem Slave mit der Adresse 0x59 Daten schreiben und sendet dafür folgende Daten (10110010), mit MSB (most significant bit) first, also vom Datensatz links gestartet bei bit 6.

I2C Adressierung
Acknowledge (ACK) und Not Acknowledge (NACK)

Nach jedem Byte Daten wird vom Empfänger ein Bestätigung-bit gesendet. Wenn das Bit LOW ist (ACK), dann signalisiert das dem Master, dass der Slave die Adresse oder die Daten empfangen hat und alles in Ordnung ist.

Sollte ein Problem auftreten wie zum Beispiel, dass der Slave die Daten nicht lesen kann oder gerade mit was anderem Beschäftigt ist und keine Zeit hat mit dem Master zu kommunizieren, dann sendet der Slave ein HIGH Signal (NACK)

Adressierung vom internen Register (Bx)

Ein Gerät wie z. B. der BME280 Sensor hat eine Adresse, aber er hat verschiedene Register in denen die Werte wie Temperatur, Luftdruck und die Luftfeuchtigkeit gespeichert sind. Diese Register können nicht nur gelesen werden, man kann auch Register beschreiben wie z. B. das 0xF5 „config“ Register um verschiedene Optionen zu setzen.

Nachdem Daten Byte für die Register Adressierung wird vom Slave wieder ein ACK bit gesendet.

I2C Adressierung mit Register
Die Datenübertragung (Dx)

Nachdem der Master das ACK bit von der Int. Register Adresse vom Slave erhalten hat, kann die eigentliche Übermittlung der Daten erfolgen. Ein Block von Daten ist immer 1 Byte gross, also 8 bit und startet mit dem Most Significant Bit (MSB) zuerst. Zum besseren Verständnis machen wir ein Beispiel.

Wenn wir als Datenpaket den HEX Wert 0xD0 senden wollen, dann ergibt das als 8 bit Binary Wert 1101000. Sollen die Daten mit MSB first gesendet werden, dann starten wir mit dem linken Wert zuerst, also mit der 1 gefolgt von der zweiten 1 und so weiter bis wir alle 8 bits gesendet haben.

Es gibt auch das Least Significant Bit (LSB), hier starten wir auf der rechten Seite mit den Daten. Zuerst die 0 gefolgt von der zweiten und dritten 0 und so weiter.

Nach jedem Byte, das gesendet wird, bestätigt der Slave mit einem ACK bit das er die Daten erhalten hat. Die Daten können jetzt Byte für Byte gesendet werden, bis der Master ein Stop-bit sendet und damit die Kommunikation beendet.

I2C Datensatz
MSB und LSB
Daten lesen vom Slave

Das Daten lesen von einem Slave funktioniert fast gleich wie das Beschreiben von einem Slave. Der Master sendet die Geräte Adresse, gefolgt von einer 1 bei RW (lesen). Nachdem der Master das ACK bit vom Slave erhalten hat, sendet er die Register Adresse aus der er Daten lesen möchte.

I2C Adressierung mit Register

Die Daten werden vom Slave zum Master gesendet, das Clock Signal wir aber dennoch vom Master bereitgestellt. Nach jedem empfangenen Byte sendet der Master das ACK bit zum Slave und der sendet so lange weiter bis der Master die Übertragung mit einem NACK-bit gefolgt von einem Stop-bit beendet.

►Node-MCU ESP8266 Board:

https://amzn.to/2U7Urmn – NodeMCU ESP8266 ESP-12F

https://amzn.to/2J5wLJ3 – 3er Set, ESP8266 ESP-12F

https://amzn.to/3belvGd – 5er Set, ESP8266 ESP-12F

►ESP32 und ESP32 Node-MCU Boards:

https://amzn.to/3erQVKq – ESP32 Node-MCU Board

https://amzn.to/2Om89OW – 3er Set ESP32 Node-MCU Board

https://amzn.to/3erIkaS – 5er Set ESP32 Node-MCU Board

https://amzn.to/2Ct9H7c – 4 Stück ESP32 Module

Netzteile:

* https://amzn.to/3beWY3V – 2er-Pack USB Ladegerät 5V/2A

* https://amzn.to/398WzP9 – Raspberry Pi 4 Netzteil, USB-C, 5.1V, 3A

* https://amzn.to/2wsS8Bh  – HomeSpot Netzteil 3A/5V inkl. 1,5M Micro USB Kabel 

Jumper Wire:

* https://amzn.to/2WxKwIl Female to Female F2F 40 STK. je 20 cm

* https://amzn.to/2xeKb2V – Set 3 x 40 STK. je 20 cm M2M/ F2M / F2F

►Breadboard:

* https://amzn.to/2QQ7JSL – Breadboard Steckbrett mit 830 Kontakten

USB Kabel:

* https://amzn.to/2y01THNUSB A auf Micro USB  Kabel 0.5m

* https://amzn.to/2xkgqgQ – USB auf Mini USB Kabel 0.5m

* https://amzn.to/2QBxCp7 – USB A zu USB B Kabel 0.5m

Alle Links mit “*” sind Amazon Affiliate Links. Ich bekomme bei einer Bestellung einen kleinen Teil vom Umsatz, ohne das euch dafür Mehrkosten entstehen.

Zum Video

★☆★ Wenn ihr den Kanal unterstützen wollt über ★☆★

oder über

Twint Spenden Code