Neben SPI ist wohl TWI oder auch i2c eine sehr oft verwendete SChnittstelle im Microcontrollerbereich. Viele Sensoren, die wir noch kennen lernen werden, bedienen sich dieses Protokoll. Wer sich in das Thema tiefer einlesen möchte, dem sei der Wiki Artikel emfohlen. Ich möchte hier an dieser Stelle die SCHnittstelle nur kurz vorstellen. Ähnlich wie SPI asrbeitet auch I2C mit einem Master und vielen Slaves. Allerdings benutzt die Schnittstelle nur 2 Leitungen. (Im gegensatz zu 4+ beim SPI)
Die Schnittstelle ist ein echtes Bussystem, d.h. es werden alle Slaves nur über die 2 Leitungen (und natürlich der Spannungsversorgung) angeschlossen. Hier mal ein Schaubild.
(Quelle: Wiki Artikel über I2C)
Um nun die verschiedenen Slaves ansprechen zu können, hat jeder Slave eine 7Bit lange Addresse. Üblicherweise werden die oberen 4 Bits vom Hersteller vorgegeben, die unteren 3 Bit lassen sich dann durch Pins oder anderweitig einstellen. Das höchte Bit der Adresse gibt übrigens an, ob der Master schreiben oder lesen möchte. Später wurde eine 10 Bit lange Adresse eingeführt, was aber unsere Bibliothek (noch) nicht unterstützt. Es gibt verschiedene Geschwindigkeiten auf dem I2C Bus. Der Master gibt aber den Takt vor.
Wie die Ansteuerung von den verschiedenen Sensoren funktioniert, werden wir bei den entsprechenden Sensoren lernen. Angeschlossen wird das ganze bei einem Arduino an den Pins 4 → SDA und 5 → SCL. Hier jetzt mal die verschiedenen Befehle.
Wire.begin() Wire.begin(Addresse)
Hiermit wird die Bibliothek in Betrieb genommen. Bei der Version ohne Adresse arbeitet die Bibliothek als Master, bei der Version mit Addresse als Slave.
Wire.requestFrom(Addresse, Anzahl) Wire.requestFrom(Addresse, Anzahl, Stop)
Fordert im Mastermode eine Antwort von einem Slave. Die Bytes können dann mit avaible() und read() gelesen werden. Addresse ist die Addresse des Slave, Anzahl gibt die Anzahl der zu lesenden Bytes an, Stop ist ein boolscher Wert und bedeutet bei Wahr, daß der Arduino nach dem Befehl ein Stop BEfehl sendet. Bei Falsch wird ein Restart Befehl gesendet.
Wire.available()
Liefert die Anzahl der Bytes, die lesbar sind.
byte value = Wire.read()
Liest ein Byte von der Schnittstelle.
Wire.write(Wert) Wire.write(Text) Wire.write(Datenfeld, Länge)
Schreibt ein Byte oder eine Anzahl von Bytes auf die Schnittstelle. Im Slave Mode werden die DAten einfach geschrieben, im Mastermode müssen die Write Befehle zwischen beginTransmission() und endTransmission eingebettet sein.
Wire.beginTransmission(Addresse)
Startet eine Komunikation mit dem Slave der Addresse. Alle jetzt mit write geschrieben Daten werden an diesen Slave gerichtet.
byte Status = Wire.endTransmission() byte Status = Wire.endTransmission(stop)
Beendet die Verbindung zu einem Slave. Wenn noch zu schreibende Daten im Puffer sind, werden diese Daten noch geschrieben. Ist Stop = Wahr dann wird nach dem Ende der Transmission die StopMeldung gesendet. Ansonsten wird eine Restart Meldung gesendet. Status kann folgende WErte annehmen:
0 alles OK, 1 Daten zu lang für den Übertragungspuffer, 2 Addresse wurde nicht bestätigt, 3 Daten wurden nciht bestätigt, 4 irgendwas anderes ist schief gelaufen…
Wire.onReceive(Handler) Wire.onRequest(Handler)
Hier können im Slavebetrieb Funktionen hinterlegt werden, die auf die entsprechenden Anforderungen eines Masters reagieren. Bei onReceive wird immer aufgerufen, wenn der Master Daten für den Slave hat, während onRequest aufgerufen wird, wenn der Master Daten haben möchte.
So weit erstmal zur reinen Bibliotheksbeschreibung.