Es ist lange her, dass ich den Post zu I²C geschrieben habe. Jetzt ist Zeit, dass Serial Periphial Interface (SPI) zu beleuchten, dass vom Raspberry Pi und den meisten anderen Single Board Computer und MicroControllern unterstützt wird.
Serial Periphial Interface
SPI wurde 1987 von Motorola zur Anbindung von Peripheriegeräten an einen Prozessor entworfen. Dies können Sensoren oder andere Geräte sein, die seriell kommunizieren.
Es ist ein bidirektionales Protokoll. Das nach dem Master/Slave Prinzip arbeitet.
Da ich diesen Begriff für veraltet halte, benutze ich lieber Controller für Master und Periphial für Slave.
Verschaltung
Um ein Peripheriegerät an den Controller anzuschliessen, werden mehrere Daten und Steuerleitungen benötigt. Diese sind
- SCL – Das Clocksignal gibt den Takt für die Datenübertragung vor und gilt für alle Periphial gleich.
- COPI – „Controller Out / Periphial In“, damit sendet der Controller Daten an ein Periphial. Auch diese Leitung teilen sich alle Geräte am Bus. In älteren Dokumenten heißt diese Leitung MOSI.
- POCI – „Controller In / Periphial Out“, in der Umkehrrichtung sendet das Periphial hierüber Daten an den Controller. Die veraltete Bezeichnung ist MISO.
- CS – „Chip Select“, damit wird gesteuert, welches Periphial gerade Daten sendet oder empfangen soll. Jedes Periphial hat seine eigene dedizierte CS Leitung. Diese wird veraltet mit SS abgekürzt.

Ein Periphial muss nicht von allen Steuerleitungen Gebrauch machen. Ein Display wird nur die Anzeigedaten entgegennehmen, aber nichts senden. Periphial 4 aus der Grafik oben könnte ein Sensor sein, der nur Daten liefert, aber keine erwartet.
Wie funktioniert SPI?
An der Grafik kannst du sehen, dass es beim Serial Periphial Interface anders als bei I²C immer nur einen Controller gibt.
Wenn dieser Daten an beispielsweise Periphial 2 senden will, setzt er CS2 auf low und sendet die Daten und sendet die Daten mit dem SCL Takt auf der COPI Leitung.
Umgekehrt setzt Periphial 2 CS2 auf low, wenn es Daten über CIPO zum Controller überträgt.
Die Übertragung geschieht seriell bitweise mit maximal 20MBt/sec.

Die CS-Leitung funktioniert wie ein Signal an einer Bahnstrecke: Sie legt fest, welcher Teilnehmer den Bus verwenden darf. Die eigentlichen Daten fahren dann gleichzeitig auf zwei getrennten Gleisen — COPI für die Richtung Controller → Periphial und POCI für Periphial → Controller.
Übertragungsweise
Im Gegensatz zu I²C gibt es bei SPI kein spezielles Datenformat, Periphial und Controller handeln die Übertragungsweise untereinander aus. Auch eine Busadresse gibt es nicht, da die Ansteuerung eines bestimmten Periphial über die CS Leitung geregelt wird.
Die Daten werden bitweise in der Mitte der Taktflanke übertragen, meist mit dem höherwertigen Bit zuerst (MSB= most significant bit). Das Periphial kann aber auf LSB (least significant bit) verlangen.
SPI einschalten
Um SPI überhaupt benutzen zu können, muss die Schnittstelle in der raspi-config auf dem Raspberry Pi aktiviert werden. Dies geschieht im Menüpunkt Interface Options >> SPI

Nach einem Neustart des Raspi steht das SPI dann zur Verfügung.
Fazit
SPI benötigt zwar zum Anschluss mehr Leitungen als I²C, ist aber auf Protokollebene einfacher zu implementieren, da das Adressmanagement wegfällt. Anderseits ist dadurch die Anzahl von Sensoren, die du an deinen SBC bzw. deine MCU anschließen kannst, begrenzt auf die Anzahl der zur Verfügung stehenden GPIO Pins für die CS Leitung.
Ein praktisches Beispiel zu SPI liefere ich schnellstmöglich nach.