Analogtechnik Wie man die Tücken einer vermeintlich einfachen IC-Schnittstelle bekämpft

Autor / Redakteur: Bill Laumeister* / Kristin Rinortner

Schnittstellen gelten häufig als simpel und man schenkt ihnen wenig Beachtung. Das rächt sich meistens in der Endphase eines Projektes. In diesem Artikel lesen Sie die Geschichte darüber, wie eine nicht funktionierende Schnittstelle aus einem fröhlichen Entwickler-Gesicht ein trauriges machen kann.

Anbieter zum Thema

Bild 1: Blockschaltbild eines SPI-Slaves (Schieberegister mit seriellem Eingang und parallelem Ausgang).
Bild 1: Blockschaltbild eines SPI-Slaves (Schieberegister mit seriellem Eingang und parallelem Ausgang).
(Bild: Maxim Integrated)

Gegenstand dieses Artikels ist ein häufig anzutreffender SPI-Fehler, dem man bei komplexen Systemen nur sehr schwer beikommt. Es wird erörtert, inwiefern Störsignale Systemprobleme hervorrufen können, und es wird auf ICs mit verminderter Störsignalanfälligkeit hingewiesen. Weiterhin werden die Vor- und Nachteile einer I2C-Systemimplementation sowie die grundlegende Funktionsweise der GPIO-Schnittstelle eines Mikroprozessors erläutert.

Gebräuchliche IC-Schnittstellen sind u.a. SPI, I2C und GPIO. Notwendige Voraussetzung für ein erfolgreiches Design ist eine funktionierende Schnittstelle zwischen den Peripherie-ICs und dem Mikrocontroller oder der CPU. Doch weil diese Schnittstellen landläufig als simpel oder gar primitiv gelten, schenkt man ihnen oft zu wenig Beachtung.

Bildergalerie

Die Zeit und Arbeit, die man dadurch in der Frühphase eines Projekts einspart, kann einen Entwicklungsingenieur glücklich machen... zumindest für den Augenblick. Diese Situation erinnert an den fröhlich dreinblickenden „Smiley“, der einem heutzutage auf Schritt und Tritt begegnet [1] und der hier als Metapher dient.

Vergessen Sie niemals Murphys Gesetz

Das „traurige“ Gesicht befällt den Entwicklungsingenieur in der Regel erst in der Spätphase des Projekts, wenn ihm Murphys Gesetz [2] – nachdem „alles, was schief gehen kann, auch schief gehen wird und zwar dann, wenn man es am wenigsten gebrauchen kann“ – betrifft. Dieser Artikel berichtet eine Episode, wie sie gar nicht so selten vorkommt. Es ist die Geschichte darüber, wie eine nicht funktionierende Schnittstelle aus einem fröhlichen Gesicht ein trauriges machen kann.

Funktionsweise des SPI-Busses

Der von Motorola entwickelte Serial Peripheral Interface Bus, oder SPI (ausgesprochen wie das englische Wort für Spion, „spy“) ist ein synchroner, serieller Vollduplex-Datenbus [3]. Die daran angeschlossenen Geräte kommunizieren im Master/Slave-Modus, wobei der Master den Daten-Frame initiiert.

Am Bus können mehrere Slaves hängen, die über Chip-Select-Leitungen adressiert werden. Gelegentlich wird SPI auch „serieller Dreidraht-Bus“ genannt (wenn nur Daten vom Master zum Slave und nicht in umgekehrter Richtung übertragen werden) oder „serieller Vierdraht-Bus“ [4]. Zur Vermeidung von Erdschleifen lässt sich eine SPI-Schnittstelle (Datenübertragung ausschließlich vom Master zum Slave) auf einfache Weise galvanisch trennen. Die galvanische Trennung kann durch Optokoppler, Kondensatoren oder Übertrager erfolgen.

Der erste Fehler, den einige Entwickler machen, ist anzunehmen, ein SPI-Bus sei intelligent. Dem ist nicht so. Bild 1 zeigt, wie ein SPI-Slave funktioniert; der Datenempfänger ist nichts anderes als ein simples Schieberegister mit einem seriellen Eingang und einem parallelen Ausgang.

Der SPI-Bus ist „dumm“

Man kann nicht deutlich genug darauf hinweisen, dass ein SPI-Bus „dumm“ ist und nicht einmal eine einfache Fehlerprüfung durchführt. Es handelt sich im Wesentlichen um eine Kette aus Registern, in die Daten seriell eingeschrieben werden. Wenn die Chip-Select-Leitung gesetzt wird, wird das Register ausgelesen und ein paralleles Datenwort an den Chip übergeben. Die SPI-Bits an sich haben keine Bedeutung im Sinne eines Protokolls. Eine Nachricht muss nicht einmal aus einer bestimmten Anzahl von Bits bestehen; es werden immer so viele Bits übertragen, wie der jeweilige Slave benötigt.

Die Situation wird aus der Sicht des Entwicklers noch dadurch verkompliziert, dass mehrere Slave-Geräte unterschiedlicher Art und von unterschiedlichen Herstellern in einer Daisy-Chain-Konfiguration betrieben werden können. Natürlich müssen alle diese Geräte die gleiche Taktfrequenz und die gleichen Datenbeziehungen (einen der vier zur Auswahl stehenden „Modes" [3]) verwenden.

Stellen Sie sich jetzt drei Slave-Chips in einer Daisy-Chain-Konfiguration vor. Chip 1 „sieht“ zunächst eine Reihe von Befehlen „vorbeiziehen“, die für Chip 3 bestimmt sind, danach eine Reihe von Befehlen, die für Chip 2 bestimmt sind. Die Chip-Select-Leitung eines Chips wird erst dann gesetzt, wenn der für diesen Chip bestimmte Befehl in das Register eingeschrieben wurde. Dann, und nur dann, hat ein Befehl für einen der Chips – nämlich für den per Chip-Select adressierten – eine Bedeutung.

Komplexe Systeme mit stark ausgelasteten SPI-Bussen

Bei komplexen Systemen mit stark ausgelasteten SPI-Bussen kann es vorkommen, dass infolge eines Prozessor-Interrupts unvollständige SPI-Befehle gesendet werden; dies hat fatale Folgen. Man stelle sich vor, dass die ersten paar Bits eines Befehls in die ersten Zellen des SPI-Schieberegisters geschrieben werden und dann, bevor die Bits sich an der richtigen Registerposition befinden, die Chip-Select-Leitung gesetzt wird.

Der (unsinnige) Inhalt des Schieberegisters wird dann als paralleles Datenwort an den Chip übergeben. Um zu vermeiden, dass unvollständige SPI-Befehle gesendet werden, ist es unbedingt erforderlich, Prozessor-Interrupts während der Ausgabe von SPI-Befehlen zu maskieren.

Wir wollen die ordnungsgemäße Arbeitsweise einer SPI-Schnittstelle am Beispiel eines 12-Bit-D/A-Wandlers MAX5312 von Maxim Integrated illustrieren.

Wie aus den Tabellen 1 und 2 ersichtlich ist, wird das höchstwertige Bit (MSB, Most Significant Bit) als erstes und das niedrigstwertige Bit (LSB, Least Significant Bit) als letztes in das Schieberegister eingeschrieben. Die ersten vier Bits sind Befehlsbits, die übrigen Bits sind Datenbits. Wie Bild 2 zeigt, wird der 4-Bit-Befehl als erstes gesendet. Mit 4 Bit lassen sich insgesamt 16 Befehle codieren, wovon jedoch nur sechs „gelistet“ sind und verwendet werden sollen. Es wird davor gewarnt, nicht gelistete Befehle zu verwenden.

Auf nicht gelistete Befehle kann ein Slave-Chip reagieren oder auch nicht. Auf jeden Fall kann man nicht sicher sein, dass etwas Gutes dabei herauskommt. Ganz im Gegenteil – wahrscheinlich kommt etwas Verhängnisvolles dabei heraus. Deshalb sollte man die Verwendung nicht gelisteter Befehle vermeiden [5]. Der MAX5312 besitzt außerdem Schmitt-Trigger-Eingänge um die Störsignalanfälligkeit zu minimieren.

(ID:42439178)