Knöpfchenspiel 2 – Bus-Interface auf Raspberry Pi

Das Differenzielle I²C Interface für den Komminikations-Bus im Knöpfchenspiel ist für den Raspberry Pi ein Hat mit dem PCA9615 Treiber Chip. Die Knöpfcheninterfaces haben den Treiber selbst on Board. Dieser Treiber Baustein konvertiert die normalen I²C Signale in differenzielle Signale um sie stabiler gegen elektromagnetische Störung zu machen. Auf der Empfängerseite werden die Signale dann wieder zurück konvertiert in 3,3V Open-Drain.

I²C Bus

Dieser Bus wurde bereits 1982 von Phillips Semiconductor (heute NXP) entwickelt und dient zur seriellen Datenübertragung zwischen integrierten Schaltungen. Daher auch der Name: Inter Integrated Circuit oder IIC. Der Bus besteht aus zwei Signalleitungen: Serial-Clock (SCL) und Serial-Data (SDA). Am Bus können mehrere Teilnehmer gleichzeitig hängen, aber immer nur einer ist der Master. Die Signalleitungen sind mit einem Widerstand auf eine Spannung voreingestellt. Meistens 5V, manchmal auch 3,3V je nach Interface Spannung. Daten werden auf diesem Bus übertragen, indem die Signalleitungen mit einem Transistor auf Masse Potential geschaltet werden, also auf 0V. Das SDA Signal nach Masse schalten können sowohl Master als auch die Slave Geräte am Bus. Der Master gibt den Takt vor indem er die SCL Leitung auf Masse zieht, oder los lässt und der Widerstand das Signal wieder auf Betriebsspannung ziehen kann. Die Datenleitung wird entweder vom Master, oder von den Slaves auf Masse gezogen, je nachdem wer gerade mit einer Datenübertragung beschäftigt ist. Dieses Prinzip sorgt dafür, dass bei einem Kurzschluss gegen Masse die Signale lediglich ungültig werden, der Chip aber nicht kaputt geht.

Die Adressierung auf dem I²C Bus ist 7-bit lang, kann also 127 Geräte bedienen. Das 8te Bit dient der Lese/Schreib Aktivierung. Dabei sind allerdings einige Adressen reserviert unter Anderem um eine Adressraum-Erweiterung auf 10-bit zuzulassen. Effektiv können also 112 Adressen angesprochen werden.

Adresse Funktion
00000000General Call Adresse
00000001Start Byte
0000001XCBUS Adresse*
0000010XReserviert für ein weiteres Busformat
0000011XReserviert für zukünftige Erweiterungen
00001XXXReserviert für zukünftige Erweiterungen
11111XXXReserviert für zukünftige Erweiterungen
11110XXX10-Bit Adressierung

*CBUS ist ein veraltetes System.

Signalform

Aus den I2C Spezifikationen Rev.6 April 2014 Fig.9

Die Signale SCL und SDA sind so genannte Single-Ended Signale. Sie haben ein Spannugnspotential gegen Masse (0V). Dabei können Störungen durch die Schaltflanken in die angrenzenden Leitungen übersprechen. Beispielsweise kann die konstanten Änderungen der Taktleitung (SCL) einen Spannungspuls in der Datenleitung erzeugen, die zwar vom Slave auf Masse gehalten wird, aber über den Leitungswiderstand und die Kapazität der Leitung gegen umliegende Masse trotzdem als Spannung (digitale 1) am Master Eingang erkannt wird. Dies wird zum Beispiel als Bitfehler in den Empfangenen Daten sichtbar. Je länger die Leitungen sind, desto stärker kann das Problem auftreten. Daher muss für eine länger Verbindung Vorsorge getroffen werden. Eine der Vorkehrungen ist zum Beispiel das Konvertieren in differenzielle Signale.

Dabei werden die oben gezeigten Signale von zwei auf 4 Drähte erweitert. Die zusätzliche Leitung ist das Komplementär der Signalleitung und dient als Referenz.

Hardware

Rasperry Pi 3B mit DIIC Hat

Das DIIC Hat ist die Hardware, mit der der Raspberry Pi I²C Signale auf die Differenzielle Leitung bringen kann. Es besteht aus mehreren Teilen: Dem 40-poligen Interface Stecker zum Pi, dem I²C EEPROM, das den Devicetree Patch mitbringt, die 12V Spannungsversorgung für die Bus Leitung und der Differenzielle I2C Transmitter.

Raspberry Pi 40-poliger Verbindungsstecker

Auf dem 40-poligen Verbindungsstecker liegen neben den 26 GPIO Signalen ebenfalls die beiden Signale ID_SC und ID_SD. Diese gehören zum Konfigurationsinterface des Hats. An diese beiden Signale wird das I2C EEPROM mit Adresse 0x50 angeschlossen. Im SPeicher des EEPROMS liegen Informationen zu dem Hat. In diesen Daten wird dem Linux auf dem Raspberry mitgeteilt, welches Hat aufgesteckt ist, welche Version, welcher Hersteller und welche Hardwarekonfiguration notwendig ist um das Hat zu betreiben. In unserem Fall ist das das Aktivieren des I2C Interfaces an GPIO02 und GPIO03, sowie das Resetsignal an GPIO5. Ohne dieses EEPROM ist die Hardware nicht konform mit der Anforderung an ein Raspberry Pi Hat und darf sich so auch nicht nennen.

EEPROM für das Hat. Angeschlossen an ID_SC und ID_SD

Das Hat stellt neben der Information zur Konfiguration des I2C Interfaces auch noch die Übertragungshardware zur Verfügung. Der PCA9615 ist der Transceiver und hat zwei Spannungsdomänen. Die klassische I2C Seite wird mit 3,3V betrieben und die differenzielle Seite mit 5V. Zum Starten der differenzielen Strecke, muss der Chip mindestens 11ms im Reset (low) gehalten werden, damit der Bus idle/stop Detektor ordnungsgemäß funktioniert. So lange ist die READY LED aus. Wenn der Resetimpuls beendet ist, geht die Leitung GPIO05 auf high und die LED leuchtet.

Beschaltung des differenziellen I²C Buffers PCA9615

Die LED wird vom Linux beim Booten angesteuert, so ist sicher gestellt, dass der Treiberbaustein ordentlich starten kann. Wenn das Linux gebootet ist, kann über die internen Tools wie i2cdetect oder i2cget/set der Bus verwendet werden. Als Gegenstelle steht der STM32 als I2C Slave zur Verfügung. dieser wartet auf den Adressen 0x30 und 0x31/0x32 auf Kommunikation mit dem Master.
Diese Software ist zur Zeit leider noch nicht funktionsfähig. Aber das sollte sich in den nächsten Tagen ändern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert