Allgemein:

I²C steht für Inter Integrated Circuit-Bus und ist ein von Phillips entwickelter serieller Datenbus. Oft wird auch die Bezeichnung TWI verwendet. TWI bedeutet Two-Wire-Interface und ist mit I²C gleichzusetzten. Die beiden unterschiedlichen Bezeichnungen entstanden aus lizenzrechtlichen Gründen.

I²C verwendet das Master-Slave Prinzip. Ein Datentransfer wird über einen Master initiiert, worauf der mit einer festen Adresse angesprochene Slave antwortet. Ein Master ist in diesem Fall der Mikrocontroller und als Slave könnte ein Sensor fungieren.


Aufbau:

I²C Aufbau

Abb.: I²C Bus Aufbau ; Quelle: BBS2 Wolfsburg

Bei einer Ansteuerung über den I²C Bus ist es notwendig, Pull Up-Widerstände mit 4,7 kΩ für die Busleitungen SDA und SCL zu verwenden. Der I²C Bus arbeitet mit positiver Logik. Ein High Pegel auf der Leitung steht für eine logische "1" und ein Low Pegel für eine logische "0".

Ein High Pegel sollte mindestens 0,7 * 5V = 3,5V betragen, ein Low Pegel maximal 0,3 * 5V = 1,5V.

I²C verwendet zwei Versorgungs- sowie zwei Datenleitungen (SDA und SCL). SDA steht für Serial Data Line und überträgt Daten oder Adressen. SCL steht für Serial Clock Line und überträgt den Takt. Der Takt liegt bei Verwendung des Atmega 328P standartmäßig bei 100 kHz. Er kann durch die Verwendung von Vorteilern verändert werden.

I²C ermöglicht es als Bussytem etwa 112 Teilnehmer anzuschließen. Der große Vorteil: digitale oder analoge Pins werden durch die Verwendung von I²C fähigen Sensoren oder Aktoren nicht belegt und können weiterhin für nicht I²C fähige Perepherie verwendet werden.


Warum werden für die Slaves feste Adressen vergeben?

Bei I²C ist es möglich, mehrere Slaves zu werden. Somit kann an den Datenbus beispielsweise ein Temperatursensor, ein Luftfeuchtigkeitssensor und ein Barometer angeschlossen werden. Da alle Komponenten an einem gemeinsamen Datenbus anliegen, kann man sich viele Leitungen und vor allem digitale/analoge Pins am Mikrocontroller sparen. Der Master spricht mittels fester Adresse den Slave an, von dem er Daten abfragen möchte. Um also gezielt Geräte anzusteuern und abzufragen, brauchen diese eine feste eindeutige Adresse. Zur Adressierung kommt ein Adressraum von 7 Bit zum Einsatz. Theoretisch ist damit eine Teilnehmeranzahl von 128 möglich. Da jedoch 16 Adressen für Sonderzwecke reserviert sind, reduziert sich die Teilnehmeranzahl auf 112.

Aufbau mehrere Slaves

Abb.: I²C Bus Aufbau verschiedene Slaves ; Quelle: BBS2 Wolfsburg

Übertragungsverfahren

Der Master liefert als erstes die Startbedingung (SCL = High und SDA = fallende Flanke) sowie permanent den Übertragungstakt SCL (Übertragungsgeschwindigkeit). Danach sendet der Master eine 7 Bit Slaveadresse sowie ein Richtungsbit (High -> Daten vom Master zum Slave übertragen, Low -> Daten vom Slave zum Master übertragen) um einen Slave anzusprechen. Der per eindeutiger Adresse angesprochene Slave sendet bei erfolgreicher Kontaktierung ein Bestätigungsbit zurück an den Master (ACK = low). Dieses Bestätigungsbit wird mit ACK abgekürzt und steht für Acknowledge. Im folgenden Schritt kann je nach gesendetem Richtungsbit der Master Daten an den Slave (z.B. für ein LCD Display) oder der Slave Daten an den Master übertragen (z.B. die gemessene Temperatur eines Sensors). Diese Datenübertragung geschieht bitweise, beginnend mit dem höchstwertigsten Bit (MSB). Am Ende der Datenübertragung wird wieder ein Bestätigungsbit (ACK) gesendet. Der Master kann dann die Stoppbedingung für die Übertragung senden (SCL = High, SDA steigende Flanke).


Übertragung

Abb.: Übertragungsverfahren; Quelle: BBS2 Wolfsburg


Quittierung

Mittels der Quittierung (ACK), die auf die Slaveadresse folgt, lässt sich erkennen, ob die gesendete Adresse einem Busteilnehmer zugehörig ist. Low steht für eine positive Quittung (sichtbar im oberen Bild). Der Master erkennt, dass ein Slave mit der gesendeten Adresse verfügbar ist. Im nächsten Schritt kann die Datenübertragung erfolgen. Ein High beim ACK der Slaveadresse steht für eine negative Quittierung In diesem Fall kommt es zu keiner Datenübertragung.


Clock Stretching

Beim Datenübertragen vom Slave zum Master kann es aufgrund von Datenverarbeitung oder Datensammlung des Slaves notwendig sein, dass der Slave mehr Zeit benötigt, als die vom Master durch den Takt (SCL) zur Verfügung gestellt wird. In diesem Fall muss der Slave den Takt des Masters verzögern. Dies geschieht, indem der Slave den Takt (SCL) für eine gewisse Zeit auf LOW "festhält". Der Master ist in der Lage, das Festhalten zu erkennen und wartet. Das Verfahren wird als Clock Stretching bezeichnet.


Multi Master

Im Multi Master Betrieb besteht die Möglichkeit, mehrere Master am I²C Bus anzuschließen. Sie übernehmen dann abwechselnd die Kontrolle über den Bus. Master, die nicht senden, verhalten sich während der Sendezeit eines Masters wie ein Slave. Zwischen Start- und Stoppsignal eines Masters ist der Bus belegt. Kein anderer darf in dieser Zeit ein Startsignal geben. Das heißt im Umkehrschluss, dass ein Master nur eine Start-Kondition ausgeben darf, wenn der Bus "frei" ist. Um dies zu garantieren, muss jeder Master den aktuellen Bus Status "abhorchen". Verwendet wird der Multimastermodus beispielsweise, wenn mehrere Mikrocontroller untereinander Daten austauschen wollen.

Anwendungsbeispiel: Ein Arduino verwendet I²C um Sensordaten in Echtzeit zu erfassen und arbeitet daher als Master. Zudem ist am Arduino über I²C ein Raspberry Pi angeschlossen, der ebenfalls als Master arbeitet und die gesammelten und vorverarbeiteten Daten vom Arduino abfragt, um sie grafisch darzustellen.

Multi Master Aufbau

Abb.: Aufbau I²C Bus Multimaster ; Quelle: BBS2 Wolfsburg


Zuletzt geändert: Donnerstag, 10. Februar 2022, 11:13