Listing 3
$ bash test.bash 0x01 0x01 0x01 0x01 0x01 0x01^C
Bei unserem nächsten Versuch machen wir erst einmal alles falsch, was man so falsch machen kann: Wir hängen zwischen den Raspberry Pi und unseren Testaufbau 100 Meter Kabel (Abbildung 4). Hier steht zu erwarten, dass schlicht nichts mehr geht. Tatsächlich zeigt ein Test mit dem Tool I2cdetect, dass sich die PCA8574-Bausteine nicht einmal mehr am Bus melden (Listing 4). Wir können also getrost darauf verzichten, das Testprogramm zu starten: Es würde jetzt nur Fehlermeldungen auswerfen.
Listing 4
$ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
… geschickt kompensiert
Nun kommt unser letzter kleiner Test: Wir fügen in unseren Versuchsaufbau die zwei P82B715-Bausteine mitsamt entsprechenden Pullup-Widerständen ein. In Abbildung 5 sehen Sie den kompletten Versuchsaufbau, Abbildung 6 zeigt, wie die Beschaltung genau aussehen muss.
Wie bei den zwei ersten Versuchen verwenden wir wieder I2cdetect, um zu sehen, ob sich unsere beiden PCA8547-Chips diesmal am Bus melden. Das Ergebnis zeigt Listing 5: Wie erhofft, klappt diesmal alles, und wir können unser Testprogramm aus Listing 2 starten – es arbeitet fehlerfrei.
Listing 5
$ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 21 -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Zugegeben: Mit einer Kabellänge von 100 Metern bewegen wir uns dabei weitab jeder Spezifikation. Für den Erfolg war es auch nicht ganz unwesentlich, dass wir beim Test ein teures Cat7-Netzwerkkabel verwendet haben. Falls Sie in Ihrem Aufbau ein weniger hochwertiges Kabel einsetzen, ist es recht wahrscheinlich, dass Sie eine Distanz von 100 Metern nicht überbrücken können. Immerhin demonstriert unser Aufbau auf beeindruckende Weise, dass und in welchem Ausmaß der P82B715 die Reichweite des I2C-Busses zu erweitern vermag.
Tempolimit
Wie eingangs bereits erwähnt, lässt sich die Reichweite auch steigern, indem man die Busgeschwindigkeit senkt. Hier wirkt sich wieder die Gesamtkapazität des Busses aus: Bei einer niedrigeren Übertragungsrate stört die Leitungskapazität weniger. Ergo kann man sich etwas mehr Leitungslänge leisten, wenn man die Übertragungsrate absenkt.
Die Geschwindigkeit der I2C-Schnittstellen des Raspberry Pi lässt sich über das Kernel-Modul i2c_bcm2708 einstellen, in der Vorgabe beträgt die Übertragungsrate 100 kHz. Mit dem Befehl aus der ersten Zeile von Listing 6 lesen Sie die momentane Baudrate aus dem Modul aus. Erhalten Sie hier eine “0” zurück, bedeutet das eine Übertragungsrate von 100 kHz.
Um die Baudrate zu ändern, müssen Sie zuerst einmal das Kernel-Modul entladen. Anschließend können Sie es mit neuen Parametern wieder laden. Das funktioniert nicht nur für I2C-Treiber so, sondern für alle ladbaren Kernel-Module. Die Kommandos aus den Zeilen 2 und 3 von Listing 6 senken die Geschwindigkeit auf 32 kHz ab.
Listing 6
$ sudo cat /sys/module/i2c_bcm2708/parameters/baudrate $ sudo modprobe -r i2c_bcm2708 $ sudo modprobe i2c_bcm2708 baudrate=32000
Der I2C-Bus arbeitet synchron, was bedeutet, dass der Busmaster die Übertragungsgeschwindigkeit frei wählen darf. Es muss sich also um keinen glatten Wert handeln, den Sie für die Übertragungsgeschwindigkeit wählen. Falls Sie allerdings einmal Fehler mit dem Oszilloskop suchen, werden Sie sich über einen solchen glatten Wert freuen, der sich als Zeitbasis an Ihrem Gerät einstellen lässt.
Achten Sie beim Herabsetzen der Busgeschwindigkeit auch darauf, dass die Übertragungsrate für Ihre Anwendung noch ausreicht: Ein Display, das nur noch im Dia-Modus arbeitet, findet niemand gut.
Fazit
Wie unsere Versuchsreihe zeigt, lässt sich mithilfe der richtigen Bausteine und Treiber der I2C-Bus bis auf eine Entfernung von 100 Metern ausdehnen. Dabei darf man allerdings nicht vergessen, dass in dem Aufbau nur wenige Busteilnehmer vorhanden waren und ein hochwertiges Cat7-Kabel zum Einsatz kam.








