3.21. SPI-Grundlagen¶
SPI (Serial Peripheral Interface) ist ein synchroner serieller Bus, der für kurze, schnelle Verbindungen zwischen einem Controller und einem oder mehreren Peripheriegeräten auf derselben Platine ausgelegt ist. Es ist die Standardschnittstelle für SD-Karten, Displays, Flash-Speicher, ADCs und DACs sowie eine breite Palette von Sensoren.
Während UART keinen gemeinsamen Takt hatte und das Timing aus der Datenleitung selbst zurückgewann, führt SPI eine Taktleitung parallel zu den Datenleitungen. Der Controller treibt den Takt mit einer beliebigen Rate, und jedes andere Gerät am Bus tastet die Daten synchron zu diesem Takt ab. Es gibt kein Erraten der Baudrate und keinen Framing-Overhead – nur Taktflanken und Bits.
3.21.1. Die vier Leitungen¶
Ein Vollduplex-SPI-Bus hat vier Leitungen:
SCK (serieller Takt). Vom Controller getrieben. Jedes Bit wird auf einer Flanke dieses Signals ein- oder ausgetaktet.
MOSI (Controller-Ausgang, Peripherie-Eingang). Die Ausgangsleitung des Controllers; das Peripheriegerät tastet die Bits von ihr ab.
MISO (Controller-Eingang, Peripherie-Ausgang). Die Ausgangsleitung des Peripheriegeräts; der Controller tastet die Bits von ihr ab.
CS (Chip Select), manchmal SS (Peripherie-Auswahl) genannt. Eine separate Leitung pro Peripheriegerät. Der Controller zieht CS auf Low, um eine Transaktion zu starten, und wieder auf High, um sie zu beenden; jedes Peripheriegerät, dessen CS deaktiviert ist, ignoriert den Bus vollständig und treibt seinen MISO-Ausgang nicht mehr.
Ein SPI-Byte: CS geht auf Low, um das Peripheriegerät auszuwählen, SCK taktet acht Bits, und MOSI und MISO übertragen jeweils ein Byte in entgegengesetzte Richtungen.¶
Jede Taktflanke bewegt gleichzeitig ein Bit in jede Richtung. Ein einzelner SCK-Impuls sendet gleichzeitig ein Bit auf MOSI und empfängt ein Bit auf MISO – SPI ist auf Leitungsebene vollduplex. Software muss nicht beide Richtungen verwenden: Reine Schreib- und reine Lesetransaktionen sind üblich, wobei die ungenutzte Leitung entweder ignoriert oder auf High gehalten wird.
3.21.2. Taktpolarität und -phase¶
Zwei Konfigurationsbits entscheiden genau, welche Taktflanke die Daten bewegt:
Taktpolarität (
polarity, manchmalCPOL) – der Ruhezustand von SCK.0bedeutet, dass der Takt im Ruhezustand Low ist und auf High pulst;1bedeutet, dass der Takt im Ruhezustand High ist und auf Low pulst.Taktphase (
phase, manchmalCPHA) – welche Flanke die Daten abtastet.0tastet auf der ersten Flanke jedes Taktimpulses ab (steigende Flanke);1tastet auf der zweiten Flanke ab (fallende Flanke).
Zusammen ergeben diese vier Modi, die üblicherweise Mode 0 bis Mode 3 genannt werden. Mode 0 (polarity=0, phase=0) ist der häufigste und eine sichere Standardeinstellung für unbekannte Geräte.
Die entscheidende Regel lautet, dass beide Seiten sich auf den Modus einigen müssen. Nicht übereinstimmende Modi liefern Datenmüll, obwohl Takt- und Datenleitungen korrekt verdrahtet sind; wenn ein Gerät bei der ersten Transaktion Unsinn zurückgibt, ist der Modus das Erste, was man prüfen sollte.
3.21.3. Mehrere Peripheriegeräte¶
Mehrere Peripheriegeräte können sich dieselben SCK-, MOSI- und MISO-Leitungen teilen, solange jedes seine eigene vom Controller getriebene CS-Leitung hat:
Alle Peripheriegeräte sehen denselben Takt und dieselben Daten, aber jedes überwacht sein eigenes CS. Bei deaktiviertem CS (High) ignoriert ein Peripheriegerät SCK und MOSI vollständig und lässt MISO in einem hochohmigen Zustand, sodass es nicht mit anderen Geräten um die Leitung kämpft.
Der Controller aktiviert genau ein CS auf einmal, führt die Transaktion aus und deaktiviert CS, um den Bus freizugeben.
Ein Mikrocontroller mit einem einzigen Hardware-SPI-Block kann mit so vielen Peripheriegeräten kommunizieren, wie er freie GPIO-Pins für CS-Leitungen übrig hat – auf dem Bus selbst gibt es keine Adressierung.
3.21.4. Stärken und Schwächen¶
Die Stärken und Schwächen von SPI ergeben sich beide aus seinem Design:
Schnell. Auf kurzen Leiterbahnen mit einfacher Pegelumsetzung sind Dutzende von Megahertz erreichbar. SD-Karten-Lesegeräte und SPI-Displays nutzen dies.
Einfach auf Leitungsebene. Keine Adressierung, keine Bestätigungen, keine speziellen Start-/Stopp-Bedingungen – nur Bits auf den Leitungen, synchronisiert zu einem Takt.
Pin-hungrig. Drei gemeinsame Leitungen plus ein CS pro Peripheriegerät. Eine Platine mit fünf SPI-Geräten verwendet acht Pins (drei + fünf).
Kurze Reichweite. SPI setzt saubere, schnelle Flanken voraus, was kurze Leiterbahnen auf derselben Platine bedeutet. Für längere Verbindungen ist I2C oder einer der Frame-basierten Busse besser geeignet.