Happy Face

Interface – Happy or Sad Face?

 Happy Face
Happy Face

Gebräuchliche IC-Schnittstellen sind u.a. SPI, I2C und GPIO. Notwendige Voraussetzung für ein erfolg­reiches 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. 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 :cry: 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 umge­kehrter 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.

 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).

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.

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.

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 erfor­derlich, 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.

 Tabelle 1: Serielles Datenformat
Tabelle 1: Serielles Datenformat

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.

 Bild 2: Beispiel für eine SPI-Schnittstelle (aus dem Datenblatt des MAX5312).
Bild 2: Beispiel für eine SPI-Schnittstelle (aus dem Datenblatt des MAX5312).

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.

 Tabelle 2: Programmierbefehle für eine serielle Schnittstelle
Tabelle 2: Programmierbefehle für eine serielle Schnittstelle

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.

Fehlerbild: „Mein SPI-Bus spielt gelegentlich verrückt“

Es kommt vor, dass ein Anwender besorgt feststellt, dass in seinem System unerklärliche Dinge geschehen, insbesondere unerwartete Reaktionen auf SPI-Befehle. Oft werden Störsignale als Ursache vermutet. Doch das ist eher unwahrscheinlich aus folgendem Grund:

Während Übertragungspausen müsste ein Störer das Signal CS (Chip Select) auf Low ziehen und gleichzeitig die Takt- und Datenleitung in den 30 bis 70% Pegelbereich bringen, was unwahrscheinlich ist. Während einer Datenübertragung reicht eine kurzzeitige Störung einer der Leitungen. Die Erfahrung zeigt jedoch, dass in solchen Fällen die Datenübertragung überhaupt nicht funktioniert oder die Daten werden völlig verstümmelt, der DAC-Ausgang würde also wilde Sprünge vollführen.

Es ist eine alte Weisheit ist, dass man bei der Diagnose eines Fehlers zuerst nach der wahrscheinlichsten Erklärung suchen sollte. In unserem Beispiel ist es viel wahrscheinlicher, dass die „unerklärlichen Vorgänge“ durch einen unvollständigen SPI-Befehl verursacht wurden.

Aber wie kommt es dazu, dass ein Befehl unvollständig übertragen wird? Während der Systementwicklung arbeitet man in der Regel mit einem kleinen System oder einer Untermenge des endgültigen, komplexen Systems. Das bedeutet, dass der Prozessor nur schwach ausgelastet ist und deshalb nur selten die Ausgabe eines SPI-Befehls durch einen Interrupt unterbrochen wird. Wenn das System wächst und der Prozessor immer mehr Befehle an immer mehr Geräte sendet, nimmt die Wahrscheinlichkeit dafür zu, dass ein SPI-Befehl durch einen Interrupt unterbrochen wird.
Deshalb müssen Interrupts während der SPI-Übertragung unbedingt maskiert werden.

Wie können sich Störsignale auf ICs auswirken?

Starke Störsignale können eine digitale Datenübertragung zum Erliegen bringen [6, 7]. Deshalb sollten die stärksten potenziellen Störquellen, beispielsweise Überspannungen infolge eines Blitzeinschlags, auf der Systemebene angegangen werden; nicht systemrelevante Probleme hingegen können auf der Chip-Ebene gelöst werden.

Ein typisches Beispiel für ein systemrelevantes Problem, mit dem ein gewöhnliches IC nicht fertig wird, ist eine instabile Betriebsspannung. Eine 3-V-Betriebsspannung, die zwischen 1 und 5 V schwankt, verursacht Fehler, die kein IC der Welt korrigieren kann. Zugegeben, das ist ein Extrembeispiel – aber so etwas kommt gar nicht so selten vor.

Täglich erleben wir Netzspannungstransienten, verursacht durch große Motoren, Lichtbogenschweißgeräte oder Überspannungen infolge von Blitzeinschlägen oder abrupten Laständerungen im Netz. Ausgedehnte Stromnetze müssen auf den veränderlichen Strombedarf durch Zuschalten oder Abtrennen von Kraftwerksressourcen reagieren. Diese Schaltvorgänge können Spannungsänderungen hervorrufen, die sich durch das ganze Stromnetz hindurch fortpflanzen können. Weitere potenzielle Quellen starker Störsignale sind hochfrequente Störstrahlung (RFI, Radio Frequency Interference), elektromagnetische Störeinstreuungen (EMI, ElectroMagnetic Interference) und elektrostatische Entladungen (ESD, ElectroStatic Discharge). In vielen Gegenden gibt es während des Sommers fast täglich Gewitter und im Winter elektrostatische Entladungen wegen der trockenen Luft. Alle diese potenziellen Quellen starker Störsignale müssen bei der Systementwicklung berücksichtigt und mit geeigneten Gegenmaßnahmen – beispielsweise Schutzerdung, Abschirmungen und Über­spannungsschutzbauteile – angegangen werden.

Typische Gegenmaßnahmen gegen die kleineren Probleme, die auf der Chip-Ebene behandelt werden müssen, sind: sternförmige Leiterbahnführung für Stromversorgungs- und Masseschienen; separate Layer für die Stromversorgungs- und Masseschienen von „sauberen“ (analogen) und „schmutzigen“ (digitalen) Spannungen [6]; Betriebsspannungsentkopplung durch Serienwiderstände, Induktivitäten, Ferritperlen und Parallelkapazitäten7.

Die genannten Störsignalquellen können Fehlfunktionen hervorrufen und müssen daher verhindert bzw. entschärft werden. Es sind zahlreiche Schutzbauteile verfügbar, die es ermöglichen, Störsignale von Versorgungsleitungen, Datenleitungen und Schnittstellen fern zu halten. Ein extremen Fällen muss man eventuell einen Watch-dog-Timer vorsehen, der den Systemprozessor gegebenenfalls neu startet.

I2C – nur einer von Dutzenden Schnittstellenstandards

Es gibt eine Unmenge Schnittstellenstandards, um nur einige zu nennen: RS-232, RS-422/RS-485, USB, Ethernet IEEE 802 mit unzähligen Suffixen, IO-Link, LIN bus, 1-Wire, I²C, SMBus, SPI, MICROWIRE/

MICROWIRE PLUS, M-Bus (EN1434), CAN (ISO11898)… Viele dieser Bezeichnungen sind Marken oder eingetragene Marken ihrer Schöpfer. Angesichts der Vielzahl und Vielfalt von Systemen, Protokollen, Standards und Substandards haben Entwickler die Qual der Wahl [8].

I2C (Inter-Integrated Circuit) ist ein serieller, mit unsymmetrischer Übertragungstechnik arbeitender Kommunikationsbus für den Anschluss von langsamen Peripheriegeräten an Fernsehapparate, Consumer-Produkte, Mobiltelefone oder sonstige elektronische Geräte. Die Technologie eignet sich gut für Kurzstreckenkommunikation innerhalb eines Gerätes oder einer Leiterplatte, wenn keine galvanische Trennung erforderlich ist. Sie wurde zudem für Anwendungen in verkabelten Systemen erweitert.

Wie die meisten Systeme hat auch die I2C-Schnittstelle ihre spezifischen Vor- und Nachteile. Eine grund­legende Beschränkung ist darin zu sehen, dass sie Pullup-Widerstände verwendet und dadurch für eine maximale Lastkapazität von 400 pF ausgelegt ist. Man würde sich außerdem eine geringere Leistungsaufnahme wünschen, insbesondere bei batteriebetriebenen Geräten.

Eine geringere Leistungsaufnahme würde allerdings mit niedrigerer Busgeschwindigkeit einhergehen. Einige Anwendungen erfordern jedoch eine schnellere Datenübertragung. Die Taktfrequenzen typischer I2C-Implementierungen betragen zwischen 100 kHz und 3,4 MHz; SPI hingegen erlaubt Taktfrequenzen bis zu einigen zig Megahertz. I2C, auch als „serieller Zweidraht-Bus“ [9] bezeichnet, ist eine ideale Lösung für langsamere Systeme. I2C arbeitet mit bidirektionaler Signalübertragung – für die Übertragung der Daten vom Master zum Slave wird die gleiche Leitung verwendet wie für die Übertragung der Bestätigung vom Slave zum Master. Ein I2C-System kann mehrere Master enthalten, und da der Takt von dem jeweils aktiven Master geliefert wird, kann auch das Taktsignal bidirektional sein. Diese bidirektionale Kommunikation erschwert die galvanische Trennung, weshalb I2C normalerweise nur in kleinen Bereichen eines Systems eingesetzt wird.

Es gibt am Markt eine Unmenge von ICs mit den unterschiedlichsten Schnittstellen. Bei der Entwicklung eines Systems sollte man die ICs zuerst nach ihrer Funktion auswählen – beispielsweise A/D-Wandler, D/A-Wandler, Temperatursensor, Digitalpotentiometer usw. – und sich dann für eine der verfügbaren Schnittstellen entscheiden.

GPIO – unkompliziert und einfach zu implementieren

GPIO (General-Purpose Input Output) ist eine Parallelschnittstelle, die es einem Mikroprozessor ermöglicht, einfache Geräte über ein paar Leitungen zu steuern. GPIO benutzt einfache Standard-Mikroprozessoranschlüsse als Parallelschnittstelle. Es gibt heute zahlreiche ICs mit Parallelschnittstelle, darunter auch A/D-Wandler und D/A-Wandler.

Fazit: Der Teufel steckt im Detail

Beim Umgang mit den oft unterschätzten IC-Schnittstellen sollte man den Details die nötige Aufmerk­samkeit schenken, insbesondere dann, wenn man nicht genau weiß, wie wichtig sie sind. Nicht ohne Grund heißt es: Der Teufel steckt im Detail ;-) .

Literatur

[1] „Smileys“ sind im Unicode vieler Schrift­systeme enthal­ten. In Unicode finden sich über 50 Gesichter,

darunter fröhliche und traurige, Tier-, Sonnen-, Mond-, Uhrengesichter und vieles mehr. Beispiel­e

siehe unter http://unicode.org/.

[2] Ausführliche Informationen über Murphys Gesetz finden Sie unter

http://en.wikipedia.org/wiki/Murphy%27s_law.

[3] Eine gute Einführung in SPI und I2C finden Sie unter http://www.byteparadigm.com/kb/article/AA-00255/22/Introduction-to-SPI-and-IC-protocols.html.

[4] Siehe Maxim Applikationsbericht 802, „Interfacing SPI Peripherals to the MAX7651 Processor“ unter www.maxim-ic.com/AN802.

[5] Siehe Maxim Applikationsbericht 4429, „Murphy’s Law and the Risks of Designing ‘Off Data Sheet’“ über ESD, RFI und die Länge von gedruckten Leiterbahnen unter www.maxim-ic.com/AN4429.

[6] Siehe Maxim Applikationsbericht 4345, „Well Grounded, Digital Is Analog“ über Masseebenen und Sterntopologien unter www.maxim-ic.com/AN4345.

[7] Siehe Maxim Applikationsbericht 4992, „Reduce the Chances of Human Error: Part 1, Power and Ground“ über Betriebsspannungsentkopplung, Eigenresonanz von Kondensatoren, Tiefpassfilter, Rauschen auf der Betriebsspannung und sternförmige Masse-Topologien unter www.maxim-ic.com/AN4992.

[8] Tutorials und Einführung in die Grundlagen von I2C: http://www.i2c-bus.org/;

  1. I2C Manual: http://www.nxp.com/documents/application_note/AN10216.pdf;
  2. Die I2C-bus-Spezi­fi­ka­tion: http://www.nxp.com/documents/other/39340011.pdf;
  3. Der I2C-bus und seine Anwen­dung: http://www.i2c-bus.org/fileadmin/ftp/i2c_bus_specification_1995.pdf;
  4. Was geschieht, wenn man die Pull-up-Wider­stände eines I2C-bus ändert? http://www.dsscircuits.com/articles/effects-of-varying-i2c-pull-up-resistors.html.

[9] Siehe Maxim Applikationsbericht 4024, “SPI/I²C Bus Lines Control Multiple Peripherals“ unter www.maxim-ic.com/AN4024; Applikationsbericht 3967, „Selecting a Serial Bus“ unter www.maxim-ic.com/AN3967; und Applikationsbericht 3438, „Serial Digital Data Networks“ unter www.maxim-ic.com/AN3438.

Von Bill Laumeister, Maxim Integrated.

Schreibe einen Kommentar

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