I²C
I²C (gesprochen "I quadrat C") ist ein synchroner serieller Zweidraht-Bus, der jeweils eine bidirektionale Daten- und Taktleitung verwendet und für die Kommunikation zwischen ICs über kleine Distanzen geeignet ist. Die Bezeichnung steht für IIC, Inter-Integrated Circuit. Der Bus wurde Anfang der 80er Jahre von Philips entwickelt.
Aus Lizenzgründen heißt der I²C Bus bei manchen Herstellern auch TWI, two wire interface (siehe AVR TWI). Im PC wird ein dem I²C-Bus sehr ähnliches System benutzt, um z. B. die Daten eines SDRAM-Modules auszulesen. Dieser nennt sich SMBus (System Management Bus).
Busstruktur und Adressierung
In einem I²C-Bus gibt es mindestens einen Master sowie bis zu 127 Slaves. Ein I²C-Bus mit mehreren Mastern wird als "Multi-Master-Bus" bezeichnet.
Die Slaves in einem Verbund müssen alle mit einer eigenen, individuellen Adresse codiert werden. Somit sind sie für jedem Master individuell anzusprechen. Darüber hinaus existiert ein sogenannter Broadcastkanal, mit dem alle Slaves gleichzeitig angesprochen werden können.
Ein Problem mit manchen Slaves ist der eingeschränkte Adressbereich, d.h. sie liegen auf einem definierten Bereich und haben darin z.b. nur 3 Bit als Programmieroption. Somit schließen diese Slaves indirekt andere Adressen aus.
Adressierung
Der (oder die) Master sprechen die Slaves jeweils aktiv an. Slaves können nie selbstständig beginnen, Daten zu senden. Um eine Kommunikation zu etablieren, übernimmt der Master, der Daten senden oder empfangen möchte, den Bus und gibt die (7-bit- bzw. 10-bit-)Adresse des Slaves aus, mit dem er kommunizieren möchte. Nach der Adresse teilt der Master dem entsprechenden Slave mit, ob er Daten senden oder empfangen möchte. Danach werden die eigentlichen Daten (entweder vom Master oder Slave) auf den Bus gelegt. Hat der Master den Lese- oder Schreibvorgang abgeschlossen, so gibt er den Bus wieder frei. Sofern mehrere Master vorhanden sind, stellt ein logisches Protokoll sicher, dass sich diese nicht gegenseitig stören. Im Fall einer broad cast Operation kann ein time slot System sicherstellen, dass nie mehr als ein slave gleichzeitig antwortet.
Handshaking / Quittierung
Die Kommunikation auf Bitebene erfolgt seitens des Masters durch Senden von Start / Stopp Bedingungen, die sich aus der Kombination der Zustände von Takt- und Datenleitung ergeben. Um die erfolgreiche Kommunikation zwischen Master und Slave sicherzustellen, senden Slaves - ausser im broadcast Betrieb - nach erfolgreicher Dekodierung ihrer Adresse sowie im Schreibfall ein Acknowledge, in dem sie die Datenleitung ziehen. Diese muss dazu vom Master rechtzeitig freigegeben worden sein und beobachtet werden. Umgekehrt quittiert der Master in ähnlicher Weise den Empfang eines Datenbytes vom Slave und signalisiert somit weitere Empfangsbereitschaft. Der Takt wird immer vom Master getrieben.
Übertragungsraten
Die genormte Übertragungsrate beträgt beim sogenannten "standard mode" 100 kbit/s, beim "fast mode" 400 kbit/s und beim "fast mode+" 1000kbit/sec. Im sogenannten high-speed mode, der mit etwas anderen Spannungs- und Stromrandbedingungen arbeitet sind es zu 3,4 MBit/s. Die Raten beziehen sich auf die festgelegten Taktraten. Andere sind möglich, jedoch nicht genormt.
Die reale maximale Datenrate ist infolge des asynchronen Betriebs und der Pausen meistens etwas niedriger. Zudem kann - falls die Taktrate für einen Slave zu hoch ist - die Clock-Leitung auf Null durch ihn auf GND gezogen- und damit die Übertragung verlangsamt werden, was als sog. "Clock Stretching" bezeichnet wird. Dies ist auf Bit- wie auf Byte-Ebene möglich; ersteres allerdings nicht im high-speed mode.
Reale Beispiele
Um sich an längere Übertragungswege anzupassen, kann man die Taktrate theoretisch beliebig vermindern, jedoch erzeugen einige Bausteine aber irgendwann ein Time-Out. Manche interpretieren einen lange niedergehaltenen Takt auch als Reset. Daher sind Taktraten von unter 1kbps in der Regel nicht denkbar.
Als Beispiel können jedoch mit einer Taktfrequenz von nur 5 kbit/s durchaus mehrere Meter überbrückt werden:
Erfahrungen mit den Atmegas (gemessene I2C-Taktfrequenzen):
- 16,000MHz - schafft sauber bis zu 700KHz
- 18,432MHz - schafft sauber bis zu 950KHz
Selbst unter schlechten Bedingungen wie...
- 50cm 6-adriges Spiralkabel, frei schwingend verbaut in einem Rennwagen als Verbindung zwischen Lenkraddisplay und Amaturenbrett
- Nähe zu nicht geschirmten Leitungen mit 12V, GND und 5V PWM zum Dimmen von LEDs
- grausamen Umgebungsbedingungen, Fahrten im Regen, Schnee oder bei glühender Sonne und gefühlten 100° C ;-) auf der Rennstrecke.
... hat der Bus ohne Probleme funktioniert.
Um anders herum hohe Bandbreiten zu erreichen, lassen sich krumme I2C-Frequenzen ausserhalb der SPEC verwenden, damit sie besser zu den Controllern und deren Taktfrequenzen passen.
Bausteine
Neben Mikrocontrollern gibt es eine Reihe von Peripheriebausteinen, die per I²C angeschlossen werden können. Eine gute Anlaufstelle bei der Suche ist die unten angegebene Seite des "Erfinders" Philips, heute als NXP bekannt.
- serielle EEPROMs
- I2C MUX, zum Anschluss von ICs mit gleicher, fester Adresse
- Uhrenbausteine
- LCD-Treiber
- LED-Treiber
- HT16K33 (RAM Mapping 16*8 LED) von Holtek
- SAA1064 (seit 2005 abgekündigt! Restposten sehr teuer)
- Drucksensoren
- SMD500
- BMP085
- Beschleunigungssensor
- Audioverstärker
- TPA2016
- TPA2026
- TDA8594
- TPMs (Trusted Platform Module)
Galvanische Trennung
- AN913 von Analog Devices
- I2C Isolators von Analog Devices
- Si840 von Silabs,(Not Recommended for New Designs)
- I2C Isolator von Silabs
- Galvanische Trennung für I2C, Applikation National Semiconductor
- I2C FAQ
- P82B96, I2C Bus Extender, auch für galvansiche Trennung
- notes_82b96.pdf, Application Note zum P82B96
- warum die einfache Schaltung Probleme hat, siehe Seite 17
- an460.pdf, Application Note von Philips zum P82B96
- Forumsbeitrag: I2C Bus trennen
- Forumsbeitrag: I²C galvanisch trennen
- I2C Bus Isolator
Siehe auch
- AT91-TWI
- AVR TWI
- I2C als Hausbus
- Modulares Board
- Forumsbeitrag: I2C-Adressen mit 7 oder 8 Bit
- Forumsbeitrag: I2C über lange Entfernungen als differentielles Signal übertragen.
- Forumsbeitrag: Übersicht über die Adressen verschiedener I2C Bausteine
Weblinks
- NXP (ehemals Philips) Produktseite
- I2C Spezifikation 3.0
- I²C Bus FAQ, Einführung, Hintergrundinformationen zum I2C Bus auf Deutsch und Englisch
- robotikhardware.de
- Betrieb von 3V3 und 5V-Bausteinen am I2C-Bus
Bibliotheken
- AVR TWI Slave
- TWI MASTER in ASM
- AVR TWI/I2C MASTER in C (Peter Fleury)
- AVR TWI Master und Slave Funktionen in C
- universelle I2C Master Prozedur für AVR
- I2C (TWI) Sniffer mit AVR
- I2CLCD, HD44780 LCD Ansteuerung über I2C Bus
I²C-Interface
- Beitrag "i2c usb interface" Diskussion zu Interfaces für Linux
- USB4ALL bei sprut.de universeller USB-Baustein, auch für I2C (5V, CDC/Virtual-Comport)
- Aardvark I2C/SPI Host Adapter, Universeller Adapter für I2C und SPI
- USB-I2C-Interface Komplettbausatz von ELV (5V, Virtual-Comport)
- i2c-tiny-usb Open Source/Hardware (5V, Linux-Kernel-Treiber, C/C++ Beispiele)
- I2C-MP-USB Open Source (3,3V und 5V, Linux-Kernel-Treiber, Python-Bibliothek für Windows/MacOS/Linux)
I²C-Monitor
- http://realterm.sourceforge.net/#I2C%20Bus
- http://www.avrfreaks.net/index.php?module=FreaksTools&func=viewItem&item_id=411
- telos Connii MM 2.0 - I²C Monitor with USB Interface
- telos Tracii XL 2.0 - High-End I²C Monitor
- http://i2cchip.com/
- I2C Logger Firmware für USB AVR-ISP
- I2C Monitor mit Mega8 (Firmware)
- Cheapi2c by Numbnut (Andy Green) uses your PC CPU (Linux only!) and printer port to perform realtime snooping of a standard 100kHz I2C bus with 100% capture.
- I2C (TWI) Sniffer. Basierend auf einem ATtiny85 mit Ausgabe auf RS232 (C und ASM).
- I2C/TWI bus sniffer/analyzer (ATTiny2313 @ 20 MHz und USB über FTDI FT245RL oder UM245R)
- I2C Startbit-Detector auf www.i2cchip.com