SPI: Das Kommunikationsprotokoll einfach und klar erklärt

Wie Funktioniert SPI?

Das ist ein vollwertiger Auszug aus dem Buch Elektronik und Heimautomation DIY.

SPI, kurz für Serial Peripheral Interface, wurde 1987 von Motorola entwickelt und benötigt vier Leitungen zur Kommunikation. Die Open Source Hardware Association betrachtet die traditionellen Bezeichnungen der SPI-Signale („Master“ und „Slave“) als veraltet und hat alternative Begriffe vorgeschlagen, die teils bereits genutzt werden. Obwohl viele Komponenten weiterhin die alten Begriffe verwenden, stelle ich euch hier die neuen Bezeichnungen vor, um mögliche Verwirrung bei Begriffen wie COPI und CIPO zu vermeiden.

  • SCL (Serial Clock): Vom Controller (Master) ausgegebene Taktleitung.
  • MOSI (Master Output, Slave Input): Neu: COPI (Controller OUT, Peripheral IN).
  • MISO (Master Input, Slave Output): Neu: CIPO (Controller IN, Peripheral OUT).
  • CS/SS (Chip Select oder Slave Select): Wird vom Controller auf LOW gezogen, um ein spezifisches Peripheriegerät anzusprechen.

SPI zeichnet sich durch seine volle Duplexfähigkeit aus, da es gleichzeitig über die Datenleitungen MOSI (COPI) und MISO (CIPO) Daten senden und empfangen kann – und das mit einer Geschwindigkeit von bis zu 20 Mbps. Anders als bei I²C gibt es bei SPI jedoch immer nur einen Controller, während die Anzahl der Peripheriegeräte durch die verfügbaren GPIO-Pins des Controllers begrenzt ist.

Während der Kommunikation zieht der Controller die CS-Leitung des gewünschten Peripheriegeräts auf LOW und gibt das Taktsignal über die SCL-Leitung aus. Daten werden über die MOSI (COPI)-Leitung an das Peripheriegerät gesendet, während dieses – falls erforderlich – gleichzeitig Bits über die MISO (CIPO)-Leitung an den Controller zurückschickt. Sobald der Controller die CS-Leitung wieder auf HIGH setzt, ist die Kommunikation beendet.

SPI ist besonders effizient, da die Daten ohne Start- oder Stopbits übertragen werden können, was eine unterbrechungsfreie Kommunikation ermöglicht.

Das Clock Signal

Das Clock-Signal synchronisiert die Datenübertragung zwischen Controller und Peripheriegerät. Dabei wird pro Taktzyklus ein Datenbit übertragen, was als synchrone Datenübertragung bezeichnet wird, da ein gemeinsames Clock-Signal verwendet wird.

Die Eigenschaften des Clock-Signals bei SPI können durch zwei Parameter angepasst werden:

Taktpolarität (CPOL): Bestimmt, ob das Clock-Signal im Ruhezustand auf HIGH (1) oder LOW (0) ist.

Taktphase (CPHA): Legt fest, ob Daten am führenden (steigende oder fallende Flanke) oder am nachfolgenden Taktflankenrand erfasst werden.

Die Kombination dieser beiden Parameter definiert einen von vier SPI-Modi:

Modus 0 (CPOL = 0, CPHA = 0):

  • Clock-Signal beginnt im Ruhezustand auf LOW.
  • Daten werden bei der steigenden Flanke des Clock-Signals übernommen.

Modus 1 (CPOL = 0, CPHA = 1):

  • Clock-Signal beginnt im Ruhezustand auf LOW.
  • Daten werden bei der fallenden Flanke des Clock-Signals übernommen.

Modus 2 (CPOL = 1, CPHA = 0):

  • Clock-Signal beginnt im Ruhezustand auf HIGH.
  • Daten werden bei der fallenden Flanke des Clock-Signals übernommen.

Modus 3 (CPOL = 1, CPHA = 1):

  •  Clock-Signal beginnt im Ruhezustand auf HIGH.
  •  Daten werden bei der steigenden Flanke des Clock-Signals übernommen.
SPI-Modus CPOL CPHA Ruhepegel Clock Datenübernahme bei
- 0 0 - LOW 0 - LOW LOW steigender Flanke
- 1 0 - LOW 1 - HIGH LOW fallender Flanke
- 2 1- HIGH 0 - LOW HIGH fallender Flanke
- 3 1- HIGH 1- HIGH HIGH steigender Flanke
SPI Operation Modi

Die Wahl des Modus hängt von der spezifischen Peripherie ab, mit der kommuniziert wird. Controller und Peripheriegeräte müssen denselben Modus verwenden, um die Datenübertragung korrekt durchzuführen.

Die CS/SS-Leitung (Chip Select / Slave Select)

Die CS (Chip Select)– oder SS (Slave Select)-Leitung dient zur Auswahl des Peripheriegeräts, mit dem kommuniziert werden soll. Der Controller setzt diese Leitung auf LOW, um das gewünschte Gerät zu aktivieren und den Datenaustausch zu ermöglichen.

Da jede Peripherie ihre eigene CS-Leitung benötigt, ist die Anzahl der anschließbaren Geräte durch die verfügbaren GPIO-Pins des Controllers begrenzt. Alle anderen SPI-Leitungen (SCLK, MOSI, MISO) werden von allen Geräten gemeinsam genutzt.

Um eine fehlerfreie Kommunikation sicherzustellen, darf immer nur die CS-Leitung eines Geräts aktiv sein (LOW), während die CS-Leitungen der anderen Geräte auf HIGH verbleiben.

SPI ChipSelect Vorgang

MOSI (COPI) und MISO (CIPO)

Der Controller überträgt Daten Bit für Bit seriell über die MOSI (Master Out, Slave In)-Leitung, die in der neuen Terminologie als COPI (Controller OUT, Peripheral IN) bezeichnet wird. Standardmäßig werden die Daten dabei mit dem MSB (Most Significant Bit) zuerst gesendet.

Most significant bit

1010011

Das Peripheriegerät sendet Daten über die CIPO (Controller IN, Peripheral OUT)-Leitung zurück. Üblicherweise werden diese Daten mit dem LSB (Least Significant Bit) zuerst übertragen, dies kann jedoch je nach Gerät variieren.

Least significant bit

1010011

Clock Polarity (CPOL)

Die Clock Polarity (CPOL) bestimmt den Leerlaufzustand der Taktleitung (SCLK). Im Idle-Modus kann die Leitung entweder auf LOW (CPOL = 0) oder auf HIGH (CPOL = 1) liegen.

SPI Clock polarity

Clock Signal Phase (CPHA)

Die Clock Phase (CPHA) legt fest, zu welchem Zeitpunkt die Daten auf der Datenleitung gelesen oder geschrieben werden.

  • CPHA = 0: Die Daten werden am Anfang des Clock-Signals gelesen oder geschrieben.
  • CPHA = 1: Die Daten werden am Ende des Clock-Signals gelesen oder geschrieben.
SPI Clock Phase

SPI Daten senden

Auf dem nachfolgenden Bild seht ihr den Aufbau der Datenübertragung über SPI:

  • Zuerst wird das gewünschte Peripheriegerät über die CS/SS-Leitung aktiviert.
  • Anschließend wird das Clock-Signal auf den festgelegten Leerlaufzustand (CPOL = 0 oder 1) gesetzt.
  • Die Daten werden dann gemäß der ausgewählten Signalphase (CPHA) übertragen.

Ein wichtiger Punkt ist, dass die Daten immer in der Mitte des Clock-Signals gelesen werden. Dies vermeidet Fehler, die entstehen könnten, wenn das Signal gerade steigt oder fällt.

SPI - Standard Pins der Mikrocontroller

Mikrocontroller SCLK MOSI / COPI MISO / CIPO CS / CSS
ESP8266 GPIO 14 GPIO 13 GPIO 12 GPIO 15
Wemos D1 Mini GPIO 14 GPIO 13 GPIO 12 GPIO 13
ESP32 GPIO 18 GPIO 23 GPIO 19 GPIO 5
Wemos D1 Mini ESP32 GPIO 18 GPIO 23 GPIO 19 GPIO 5
Arduino Nano ESP32 GPIO 18 GPIO 23 GPIO 19 GPIO 5
Arduino Nano D13 D11 D12 D10
Arduino UNO D13 D11 D12 D10
Arduino Mega D52 D51 D50 D53

★☆★ Wenn ihr den Kanal unterstützen wollt über ★☆★

oder über

Vielen Dank im Voraus, Euer Edi.