I2C als Hausbus

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Infos

Infos allgemein zu Hausbus, I²C.

Es wird oft behauptet das I²C nur für Verbindungen innerhalb einer Leiterplatte gedacht ist. Das ist sicherlich die Hauptanwendung, aber es gibt auch allseits bekannte Einsatzgebiete wo etliche Meter überbrückt werden. Bei VGA (DDC) und HDMI wird z.B. eine I²C-Bus Verbindung zur Kommunikation zwischen den Endgeräten benutzt. VGA und HDMI Kabel können (offiziell) rund 15m lang sein.

Allerdings werden für diesen Einsatz oftmals auch spezielle Treiber Bausteine eingesetzt, die eine höhere Buskapazität vertragen, verbesserten ESD Schutz haben, die Pegel übersetzen (z.B. 3,3 auf 5V), Hot-Plug-fähig sind, etc. Als Beispiel sei hier der PCA9507 (NXP) aufgeführt, der einige dieser Eigenschaften besitzt.

Michael Lassey ist SCHULD!

Hallo ihr keks

Datensicherheit

Von Hause aus ist bei I²C keine Checksumme o.ä. vorgesehen. Einzelne Bytes werden nur mit einem ACK bestätigt.

Man muss also eigene Konzepte entwickeln um sicherzugehen, dass Daten korrekt gesendet und empfangen wurden.

Einige Möglichkeiten wären:

  • Geschriebene Daten zurücklesen
  • Daten immer mehrmals schreiben/lesen
  • Wenn man µC als Slave programmiert, kann man eine Checksumme als zusätzliches Byte mitübertragen

Ein weiteres Problem ist, dass Slaves sowohl das SDA Datensignal, als auch das SCL Taktsignal (Clock-Stretching) dauerhaft auf "Low" ziehen können, was den Totalausfall des Busses zur Folge hat. Das kann z.B. beim Ausfall der Stromversorgung eines Slaves auftreten, es sind aber auch Schaltkreise bekannt, die diese Fehlfunktion bei längerem Betrieb zeigen (z.B. LM75). Die Auswirkungen eines lokalen Stromausfalls begrenzt ein klassischer Pegelshifter mit MOSFET, zwischen Bus und Slave geschaltet, bereits zuverlässig. Das Erlauben von Clock-Stretching ist generell ein Problem, da das Bus-Timing und somit die Reaktion des Gesamtsystems in Echtzeit nicht mehr garantiert werden können.

Adressierung

Wie viele Adressen einzelne I²C Bausteine haben, ist unterschiedlich. In der Regel sind 1-8 Adressen möglich. Es gibt aber auch (neuere) Bausteine die bis zu 64 mögliche Adressen haben. Somit kann es also sein, das man evt. Probleme bekommt wenn man mehrere Bausteine des selben Typs einsetzen will.

In dieser Hinsicht ist der PCA9501 I/O Expander Baustein recht interessant. Er bietet als einer der wenigen älteren Bausteine bis zu 64 mögliche Adressen. Zudem hat er ein integriertes EEPROM (256 Byte) und ist somit für Hausbus Anwendungen gut geeignet.

Eine andere Lösung dieses Problems ist die Verwendung von I²C Multiplexern- bzw. Switches. Wie z.B. den PCA9544. Dieser Baustein kann einzelne Busabschnitte bei Bedarf abtrennen, so das man in den einzelnen Abschnitten identische Adressen verwenden kann.

Eigene Erfahrungen

Vor einigen Jahren war ich als Servicetechniker bei einer Geräteinstallation im Einsatz, bei der die laut Datenblatt möglichen Längen bei weitem überschritten wurden. Ab 12m ging nix mehr. Der Grund war aber nicht der I²C-Bus, sondern die Spannungsversorgung der entfernten Geräte. Die Masseleitung war auch 12m lang, und der Stromverbrauch der Geräte hat den Massepegel soweit angehoben, dass der I²C-Bus nicht mehr funktioniert hat. Mit einer dickeren Masseleitung hat's sofort wieder funktioniert.

Die Kabel sind (bezüglich der gemeinsamen Masse) eine Kette über differentiell kleiner Widerstände parallel geschaltener differentiell kleiner Kondensatoren. Durch einen Pegel-Wechsel müssen all diese kleinen Kondensatoren über die Widerstände umgeladen werden. Folge ist eine deutlich kleinere Ausbreitungs-Geschwindigkeit des Signals und ein geringerer Spannungs-Anstieg an den Anschlüssen der Geräte. Zu der Kapazität der Kabel kommt vor allem noch die Kapazität der Geräte. Im I²C-Standard von Philips ist diese Kapazität auf 400pF limitiert. Im access.bus-Standard (welcher für Computer-Komponenten und Peripherie entwickelt wurde) ist diese Kapazität auf 1000pF beschränkt. Vgl. Ausbreitungsgeschwindigkeiten, Kapazitäten bei anderen Bus-Systemen wie USB, SATA, RS485


Habe ein I2C Netzwerk im Haus, sternfoermig und Reihe gemischt, vielleicht 40m alles zusammen, bei 70kHz mit P82B715 an allen Knoten, CAT5 Kabel, laeuft einwandfrei. Musst natuerlich Fehlererkennung (NACK) etc Routinen vorhalten.


Habe bei meinem I2C-Hausbus eine Kabellänge von ca. 120m. Auch sternförmig und reihe gemischt. Taktfrequenz 96kHz, jedes der 22 Module ist mit einem P82B715 ausgestattet. Den Pull-up Widerstand von SDA und SCL habe ich auf 180 Ohm verringert. Läuft fehlerfrei seit ca. 15 Jahren. Verwendetes Kabel für SCL, SDA: 2x0,14mm², geschirmt. Spannungsversorgung +/-15V und Interrupt: 5x1,5².


Mein I2C-Hausbus hat ca. 150m Gesamtlänge, Topologie sowohl als Stern, als auch Linien gemischt. Taktfrequenz 3 kHz und weitere Optimierungen. Einheitlicher Bus mit Masse/SDA/SCL und +12V zur Stromversorgung. Läuft seit 2004 weitgehend fehlerfrei. Dokumentation im Netz (Projekt Hauscomputer).

Passende Sensoren / Module

Links

Allgemein

Foren Beiträge

Application Notes

Praktische Anwendungen

Siehe auch