I2C-Bus / IIC-Bus

Der 1-Wire Bus ist nur eine Möglichkeit zwei oder mehrere Geräte elektrisch miteinander zu verbinden. der I2C oder TWI (Two Wire Interface)-Bus ist eine weitere Möglichkeit. Diese Bus kann mit entsprechenden Extendern auch über etwas längere Entfernungen genutzt werden. Eine direkte EinsatzMöglichkeit bei Exchange und Lync ist natürlich nicht gegeben. Aber über I2C kann z.B. die Umgebung (Temperatur/Feuchtigkeit) überwacht werden oder Anzeigen gesteuert werden. Das Interface ist auch nicht mal zu selten anzutreffen. In vielen elektronischen Geräten kommunizieren interne Systeme damit.

Für den I2C-Bus sind neben der Energieversorgung zwei Leitungen für Takt und Daten erforderlich. Manchmal finden Sie daher auch die Bezeichnung "TWI" für "Two Wire Interface", was den Bus dann auch zu "1-Wire Bus" abgrenzt.

I2C Grundlagen

Mein Stichwortzettel zum I2C-Bus ist:

  • Es gibt genau einen Master und mehrere Slaves
    Der Master steuert die komplette Kommunikation und versorgt auch den Bus mit Energie während die Slaves passiv sind
  • Daten und Takt-Leitung sind bidirektional und halbduplex
    Eine Leitung gibt den Takt vor während die andere Leitung die Bits überträgt.
  • Spannungsgesteuert mit Open Collector
    Jeder Teilnehmer kann den Bus "auf Masse ziehen". Das Verfahren bedeutet natürlich, dass die Spannungen und Ströme nicht zu hoch sein dürfen, damit die Geräte nicht zu viel Verlustleistung erzeugen. Da nicht mit differenziellen Werten oder Strömen gearbeitet wird, ist der Bus recht störanfällig und sollte auf kurze Strecken beschränkt werden.
  • Jeder Slave muss eine eindeutige Adresse habe
    Einige Geräte haben dazu Jumper oder Pins, mit denen die Adresse verändert werden kann.
  • 5 Volt / 3,3 Volt Pegelwandler
    In der Spezifikation sind High/Low mit 0,7/0,3 von VDD spezifiziert. Wenn der Bus mit 3,3V betrieben wird aber einige Geräte mit 5V parallel existieren, dann erkennen diese "3,3V" nicht mehr zuverlässig hals High. Mit Pegelwandlern kann dies gelöst werden.

TWI/I2C mit 5/3,3V

Die klassische Arduino-Plattform nutzt 5 Volt-Pegel, während ESP8266/ESP32 und andere Bausteine schon auf 3,3V-Technik aufsetzen und damit mit LiPO-Akkus (3,7V) arbeiten können.

Da I2C ja eine "Open Collector"-Schaltung nutzt und jeder Teilnehmer die Datenleitung auf "GND" ziehen kann, ist im Grund der Parallelbetrieb von 5V Geräten und 3,3V Geräten möglich. Allerdings darf die Datenleitung, die vom Master gespeist wird, natürlich nicht mehr als die 3,3V haben, um diese Geräte nicht ggfls. zu zerstören. Das bedeutet natürlich, dass Geräte mit 5V auch einen 3,3V Pegel als "High" erkennen müssen. Auf kurzen Stecken mit wenigen Geräten geht das oft sogar gut. Aber je länger die Verbindungsleitungen sind, desto instabiler wird das Verhalten. Wer auf der sicheren Seite sein will, setzt entsprechende bidirektionale Wandler ein.

AN97055 Bidirektionaler Pegelwandler
https://cdn-shop.adafruit.com/datasheets/an97055.pdf
http://www.semiconductors.philips.com/acrobat/applicationnotes/AN97055.pdf

I2C Adressen

Alle Geräte auf dem I2C Bus werden über individuelle Adressen angesprochen. Diese können aber bei den meisten Sensoren nicht frei konfiguriert werden. Meist lassen sich über 3 Bit nur 8 unterschiedliche Adressen aus den 127 möglichen Adressen einstellen. Wenn Sie gleiche Sensoren parallel einsetzen, dann müssen Sie eindeutige Adressen herstellen.

Ich habe mehrere I2C Geräte bislang eingesetzt und folgende Adressen dabei gefunden.

Defaultadresse Bereich Baustein

 

0x0-0x0F

reservierte Adressen

0x27

0x27-0x37

HD44780 LDC mit I2C Interface

0x29

0x29

VL6180X Time of Flight Distance Ranging Sensor

0x76

0x76-0x77

BME 280 Temp/Barometer/Hygrometer

 

0x78-0x7B

Reserviert für 10bit Adressierung

 

0x7c-0x7f

Reserviert für zukünftige Erweiterungen

Wenn Sie ein unbekanntes Gerät haben, dann können Sie es an einen IC2 ohne weitere Geräte hängen und danach suchen. Es sind ja maximal 127 Adressen bei einer 7-bit Adressierung:

#include <Wire.h>
 
void setup() {
  Wire.begin();
  Serial.begin(115200);
}

void devicefound(int i2caddr, int errcode, String message) {
    Serial.print("Scanning Address:0x");
    if (i2caddr<16) {Serial.print("0");}
    Serial.print(i2caddr,HEX);Serial.print(String(" " + message));Serial.print(" Code: ");Serial.println(errcode);
}

void loop() {
  byte error, address;
  int totaldevices = 0;

  Serial.println("--- Start Scan for I2C-Devices---");
  for(address = 1; address < 127; address++ )  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      devicefound(address,0,"Device Found");
      totaldevices++;
    }
    else if (error==4) {
      devicefound(address,4,"Error 4");
    }
    else if (error==2) {
      // devicefound(address,2,"No Device");
    }
    else {
      devicefound(address,error," Unknown Error");
    }
  }
  Serial.print("Total Devices:");Serial.println(totaldevices);
  delay(5000);           // wait 5 seconds for next scan
} 

Die Ausgabe erfolgt auf dem seriellen Port mit 115200 Baud:

I2C am PC

Die I2C-Schnittstelle gehört nicht zum Standardanschluss eines PCs. Wer Sensoren über diesen Bus am PC anschließen will, benötigt einen Adapter. Den gibt es mittlerweile z.B. von ELV kommerzielle. Wer mag kann aber auch einfach z.B. einen Arduino hernehmen, der problemlos ein I2C-Interface abbilden kann und per USB die Befehle annimmt und die Daten zurück meldet. 

Sie können natürlich auch mit einem ESP8266, ESP32, Arduino o.ä. sich eine vergleichbare Lösung auch selbst zusammen schneiden. Wenn )sie auch ein Gehäuse suchen, dann schauen Sie sich z.B. den M5Atom Lite (M5Stack, 5 US$) an, der per USB-C am PC eine serielle Schnittstelle anbietet und über einen Grove-Stecker auch I2C spricht. Dann fehlt nur noch die passende Software oder die installieren MicroPython oder LUA als interaktiver Interpreter über ein serielles Terminal.

I2C Client mit ATTiny85 u.a.

Dass Mikrocontroller oder PCs als I2C-Master agieren und die verschiedenen Sensoren als Client angebunden ist, kennen Sie nun. Aber vielleicht möchten Sie I2C in Projekten nutzen, in denen Sie auch Sensoren selbst bauen wollen, weil es vielleicht keine geeigneten Geräte gibt. So kann ein Sensor mit einer gewissen Intelligenz ausgestattet werden und ein Master sammelt nur die Daten ein. Gerade mit dem ATTINY85 gibt es einen super kleinen Chip, der sich mit wenig Beschaltung dazu eignet. Allerdings brauchn Sie eine Client-Library und das Timing ist nicht immer trivial, wie das folgende Video gut beschreibt.

How to make DIY I2C slave devices with ease - ATtiny Device
https://www.youtube.com/watch?v=6BXPm6O2VaI

I2C auf langen Strecken

Auch wenn gegenüber 1-Wire der I2C Bus neben Stromversorgung und GND eine eigene Leitung für Daten und eine Leitung für Takt hat, und damit der Takt gedrosselt werden kann, so sind lange Leitungen durch ihre Kapazitäten immer ein "Problem" für Rechtecksignale. Die Übertragung erfolgt ja per "Pegel" und nicht als Stromschleife. Aber auch hier gibt es spezielle Chips, die auch längere Stecken überbrücken.

  • P 82B96 I²C-Bus Repeater/Hubs/Extenders
  • P 82B715 I²C bus extender

Es gibt aber auch einen "Differential I2C" Mode. Ein Chip setzt dabei die beiden Leitungen auf zwei Leitungspaare mit differenziellen Spannungen um.

Laut Datenblatt soll die Reichweite dann bei 1 MBit bis zu 3 Meter betragen. I2C ist ein Bus innerhalb eines Gerät.

Wer lange Leitungen bedienen will, sollte sich eher bei RS-485 / ModBus umschauen, auch wenn Sie dann vielleicht noch einen ATTiny als Umsetzer für einen I2C-Sensor dazwischen schalten müssen.

Weitere Links