RasPi und I2C

Ein weitere Anschluss neben den generischen GPIO-Ports und dem 1Wire-Anschluss ist der I2C Anschluss

Elektrik und Adressierung

Er lässt sich am besten mit dem 1Wire-Anschluss vergleichen, nur dass diesmal Daten und Takt auf eigenständigen Verbindungen übertragen werden. Daher ist es auch ein 2-Wire-BUS und verschiedene Hersteller nutzen auch "TWI"  (Two Wire Interface) als Bezeichnung. Die ebenfalls erforderliche "Masse" zählt man nicht als eigene Leitung.

Auch wenn es mehrere Master geben kann, werden die meisten I2C-Installationen mit einem Master und vielen Slaves betrieben. Dabei hängen alle Geräte auf den gleichen Leitungen, die über "PullUp"-Widerstände auf "High" gehalten werden. Jedes Gerät kann die Leitung aber auf "Low" ziehen. Durch die Wahl von Potentialen statt Strömen ist I2C störanfällig und eignet sich nicht wirklich für längere Verbindungen.

Auch hier hat jedes Endgerät eine Geräteadresse, die aber nicht wie bei 1-Wire für jedes Gerät unterschiedlich ist. In der ersten Version wurden nur 7 Bit zur Adressierung genutzt, von denen einige Nummern spezielle Aufgaben haben, so das maximal 112 Geräte angeschlossen werden konnten. Mittlerweile wurde das Schema auf 10 Bit angehoben, so dass mehr Geräte am Bus betrieben werden können. Dennoch haben erst mal die Chips des gleichen Typs auch die gleiche Adresse. Es gibt Chips, von denen man in der Regel nur einen am Bus erwartet, z.B. Echtzeituhr oder Speicher. Hier haben die Geräte dann auch eine feste ID. Andere Geräte, die mehrfach vorkommen können, haben oft Eingänge um per externer Beschaltung die Adresse abwandeln zu können. So gibt es I/O-Bausteine bei denen die ersten 4 Bits "fest" sind und drei weitere Bits z.B. per Jumper angesteuert werden. Sofern Sie selbst bestimmen, welche Geräte sie anschließen, sollten sie darauf Rücksicht nehmen. Komplexere Steuerungen sind natürlich möglich, wenn ein Ausgabemodul verschiedene Eingangsmodule "aktiviert" oder deaktiviert.

Jedes I²C-fähige IC hat eine vom Hersteller festgelegte Adresse, von der bisweilen die untersten drei Bits (Subadresse genannt) über drei Steuerpins festgelegt werden können. In diesem Fall können bis zu acht gleichartige ICs an einem I²C-Bus betrieben werden. Wenn nicht, müssen mehrere gleiche ICs mit getrennten I²C-Bussen angesteuert oder abgetrennt werden können.
Quelle: Wikipedia I²C http://de.wikipedia.org/wiki/I%C2%B2C

Wenn der I2C Slave einen "Reset"-Anschluss hat, dann sollten Sie einen 1kOhm gegen Vcc schalten, damit ein definierter Pegel anliegt.

Beim RasPI ist es so, dass er zwei I2C-Busse anbietet, von denen einer über die GPIO-Ports nach außen geführt ist und der zweite I2C-Bus am Kameraverbinder anliegt.

Hinweis
Bei der Rev-B ist der I2C-Bus 1 während auf dem GPIO-Pin während I2C-Bus 0 am Kameraanschluss aufliegt. Beim RasPi Version A ist es umgekehrt. Die Beschreibung hier passt auf den I2C Bus 1, also den neuen RasPi.

Der RasPi hat zwar einen I2C Anschluss, der auf GPIO2 (SDA auf Pin ) und GPIO3 (SCL) heraus geführt ist, aber er ist per Default nicht aktiviert. Komplett wird der Anschluss durch die Stromversorgung (Pin2) und Masse (Pin 5). Siehe auch Raspberry:GPIO.

RasPI für I2C aktivieren

Zuerst muss man aber erst I2C aktivieren, da die Module auf der "Blocklist" stehen:

#sudo nano /etc/modprobe.d/raspi-Blocklist.conf

Hier muss die Zeile "Blocklist i2c-bcm2708" z.B. mit einem "#" auskommentiert werden. Die beiden erforderlichen Module können nun mit ModProbe geladen werden.

#modprobe i2c-bcm2708
#modprobe i2c_dev

Mit "lsmod" sollte dann die neuen Module erscheinen

lsmod

Diese Änderungen sind nun natürlich nur bis zum nächsten Neustart. Wenn der Start erfolgreich war, können Sie die Einstellungen auch permanent machen, indem Sie in die beiden Module in "/etc/modules" addieren.

#sudo nano /etc/modules

snd-bcm2835
i2c-dev

Ich habe dann die i2ctools installiert, damit ich per Kommandozeile schon mal die Basisfunktionen überprüfen kann.

#sudo apt-get Update && apt-get install i2c-tools

Nach der erfolgreichen Installation können Sie mit drei Programmen direkt den I2C-Bus steuern

  • i2cdetect
    Abfragen des Bus nach Teilnehmern und anzeigen:
#i2cdetect -y 1
  • i2cdump
    Anzeigen der Register eines angegebenen Geräts
#i2cdump -y 1 0xGerätenummer
  • i2cGet und I2cSet
    zum gezielten Lesen und Setzen von Registern.

I2C ist ein sehr flexibler Bus, für den es eine ganze Menge von Chip für unterschiedliche Aufgaben gibt. Ideal also um andere Geräte am RasPi anzuschliessen und die 3,3V GPIO-Ports zu schützen oder für andere Zwecke nutzen zu können.

PCF8583 -Clock und Counter (0xA0 und 0xA2)

Dieser Baustein ist eine Uhr oder Counter, je nachdem wie man ihn verschaltet. Es ist aber keine "Echtzeituhr", da er keine eingebaute Batterie hat. Er kann aber "gestellt" werden und über einen eingebauten Taktgeber zählt er dann weiter. Genau dieser Taktgeber kann aber auch als Eingang verwendet werden, so dass man Impulse zählen kann. Er ist für unter 2€ erhältlich

Der Baustein kann so verschalter werden, dass er Signale am Anschluss OCSI mit bis zu 32768 Hz zählen kann und Werte von 0-999999 annimmt. Der Anschluss ist denkbar einfach:

Der Anschluss eines einzelnen Chips am RasPi ist dann sehr einfach zu gestalten. An Pin 1 ist der Eingang


Quelle: http://evil.hn.vc/linux/HomeServer/pdf/Raspberry%20Pi%20-%20Hardware.pdf Seite 11

Der Chip hat eine fest "Slave"-Adresse 101000A, und nur der Wert A kann über einen Pin geschaltet werden. Sie können so auf einem I2C-Bus also maximal zwei dieser Bausteine verwenden oder müssen eine weitere Logik addieren.

Uhr am I2C mit DS1307 (Hex D0)

Dass der RasPi keine Uhr "onBoard" hat, ist natürlich nervig, speziell wenn man Daten erfassen will. Sicher kann der RasPi mit Linux sich die Uhrzeit per NTP aus dem Internet holen, aber das geht doch nicht immer. Aber auch hier gibt es Abhilfe mit einem I2C Baustein DS 1307 :: Real Time Clock I²C für ca. 2,40 (Reichelt Okt 2013). Ein kleines Quarz dazu und eine Batterie (3Volt Lithium hält 10 Jahre) als Stütze und der RasPi hat eine echte Uhr. Nebenbei hat der Chip noch berauschende 56byte SRAM frei. Da könnte man schon den ein oder anderen Zählerstand speichern

LCD per I2C (Hex 24)

Wenn man nun den Anschluss schon mal hat, kann auch schnell ein LCD angeschlossen werden. Passende Software für den RasPi gibt es schon und die LCDs sind selbst als Bausatz nicht teuer

Das Gerät meldet sich mit der Adresse 24 am I2C Bus.

Digital In/Out mit PCF8574 (0x40/0x42 - 0x4E)

Für 1,10 Euro gibt es auch einen I2C Baustein (PCF8574), der 8 Ein/Ausgänge hat. Damit lassen sich dann einzelne LEDs oder über Verstärker auch größere Lasten schalten. Interessant ist aber auch die Kombination eines solchen Chips mit dem 8583, um mehr als zwei Geräte am Bus zu haben. Der Ausgang kann dann per AND-Gatter die A0-Leitung steuern und quasi immer einen von 8 PCF8583 auf A0=1 stellen. Eine Software würde dann über einen "Write" auf den PCF8574 erst den Zähler auswählen und dann abrufen. Aber auch einfache zusätzliche LED-Anzeigen sind schnell gebaut, da der Chip genug Strom für LED-Ansteuerungen liefert.

Mit den zusätzlichen Leitungen A0,A1 und A2 können sie bis zu 8 gleiche ICs am Bus betreiben. Zusätzlich gibt es mit dem PCF8574A den gleichen Chip nochmal mit einer weiteren Adresse, so dass Sie auf einem Bus direkt 16 Bausteine a 8 Ein/Ausgänge anschließen können. z.B. wie hier:

Über den PCF8574 sollten sie immer nur genau einen Ausgang auf 1 setzen uns so bei genau einem der PCF8583P die A0-Leitung hochziehen und damit auf der Adresse 0xD1 sichtbar werden lassen, während alle anderen auf 0xD0 laufen, aber nicht angesprochen werden. Das hier gezeigte Schaltbild ist natürlich nicht komplett. Wer nur zwei PCF8583 auf einem Bus betreibt, kann sich die Auswahl sparen und einen auf A0=0 und den anderen aus A0=1 stellen

Leider kann der PCF8574 nicht direkt zählen.

I2C und lange Leitungen

I2C ist eigentlich ein Bus in einem Gerät. Aber vielleicht will ich im Heizungskeller nicht jeden Temperaturfühler an einen Mikroprozessor hängen sondern einfach mehrere Geräte über ein paar Meter anschließen. Das ist ja die Grundidee bei einem Bus. Dann muss ich mir aber auch Gedanken über Spannungspegel, Leitungskapazitäten, Störeinflüsse und Baudraten machen. Das hat aber NXP schon gemacht

AN10658 "Sending I2C-bus signals via long communications cables",
www.nxp.com/documents/application_note/AN10658.pdf

Im Grund kann man es versuchen aber I2C ist als Bus mit Pegelsteuerung nicht besonders störfest. Man könnte die Baudrate reduzieren, die Pullup-Widerstände kleiner machen, damit mehr Strom fließt aber dann müssen das alle Slaves und der Master auch verkraften. Für längere Strecken ist daher eine Stromschleife (RS485) der bessere Ansatz.

Es gibt mit dem Baustein "P82B715" einen Signal/Busextenter, der laut Hersteller dann bis zu 50M überbrücken kann.

P82B715 I 2C-bus extender
 https://www.nxp.com/docs/en/data-sheet/P82B715.pdf

I2C Tester

Wenn man ein I2C-Bauteil hat aber dessen Adresse nicht kennt, dann gibt es einfache Projekte, um die Adressen zu lesen-

Weitere Links