Serial Peripheral Interface
Das Serial Peripheral Interface, kurz SPI oder auch Microwire genannt, ist ein Bussystem bestehend aus drei Leitungen für eine serielle synchrone Datenübertragung zwischen verschiedenen ICs.
Der Bus besteht aus folgenden Leitungen
- MOSI (Master Out -> Slave In) auch SDO (Serial Data Out) oder DO
- MISO (Master In <- Slave Out) auch SDI (Serial Data In) oder DI
- SCK (Serial Clock) - Schiebetakt
Zusätzlich zu diesen drei Leitungen wird für jeden Slave eine Slave Select (SS) oder auch Chip Select (CS) genannte Leitung benötigt, durch die der Master den Slave zur aktuellen Kommunikation selektiert. Dies geschieht dadurch, dass der Master die SS/CS-Leitung von High nach Low zieht. Oft ist mit dieser Aktivierung durch den Master auch eine Benachrichtigung für den Slave verbunden mit der ihm mitgeteilt wird, dass jetzt eine Nachricht beginnt, das nächste Byte also zum Beispiel als Kommando aufzufassen ist.
Die Übertragung geschieht so, dass der Master seine Datenleitung (MOSI) auf den Pegel des nächsten Bits bringt und dann an der SCK Leitung einen Puls ausgibt. Gleichzeitig wird vom Master der Pegel an der Datenleitung vom Slave zum Master überwacht und ihr Zustand als nächstes einzulesendes Bit aufgefasst. Üblicherweise gibt es zumindest beim Master mehrere Einstellungen, die festlegen, welches der Grundzustand dieser SCK Leitung sein soll und welche Flanke des Taktes zur Datenübernahme herzunehmen ist (die steigende oder die fallende). Bei einigen Slaves ist diese Einstellung ebenfalls möglich, oft ist es aber so, dass per SPI anzusprechende IC eine feste Einstellung benutzen, an die sich der Master anpassen muss.
Für den SPI-Bus gibt es kein festgelegtes Protokoll. Die Taktpolarität (CPOL) und Phase (CPHA) können ebenfalls von Slave zu Slave unterschiedlich sein. Der SPI-Bus kann mit einer Taktfrequenz von vielen Megahertz betrieben werden. Es gibt viele verschiedene ICs die als Slave an dem SPI-Bus betrieben werden können, diese gehen von einfachen Schieberegistern bis hin zu RTCs oder Displaytreibern mit vorgegebenem Protokoll. Unter anderem werden die meisten AVR-Microcontroller von Atmel über SPI programmiert, siehe dazu AVR In System Programmer.
Übertragungsprinzip
Bei SPI verlieren die Begriffe 'Sender' und 'Empfänger' ihre Bedeutung. Das Übertragungsprinzip funktioniert so, dass gleichzeitig 1 Bit vom Master zum Slave und 1 Bit vom Slave zum Master übertragen wird. Die Übertragung ist eher mit dem Begriff "Austausch von Bits" zu beschreiben, als dass es sich um ein Senden bzw. Empfangen handelt. Je nach Sichtweise könnte man auch sagen, dass sowohl Master als auch Slave jederzeit sowohl Sender als auch Empfänger sind. Der einzige Unterschied zwischen den Busteilnehmern besteht darin, dass beim SPI Bus jegliche Kommunikation immer vom Master ausgeht. Er hat die Verwaltung der SCK Leitung inne und wenn der Master keine SCK Pulse generiert, dann kann ein Slave auch nichts übertragen. Die Generierung der SCK Pulse wird dabei üblicherweise dadurch angestossen, dass der Master einfach angewiesen wird, 1 Byte über SPI auszugeben. Des Weiteren kann ein Slave auch eine SPI Übertragung nicht hinauszögern, so wie es beim I2C-Bus der Fall ist. Wenn vom Master die SCK Pulse kommen, dann muss ein Slave die MISO Leitung bedienen. Er hat keine Möglichkeit dies nicht zu tun, selbst wenn er noch gar kein Ergebnis für den Master vorliegen hat. Selbst wenn der Slave die MISO Leitung nicht bedient, der Master wird zum per Modus eingestellten Zeitpunkt die Polarität der MISO Leitung auswerten und sich daraus das nächste Bit bestimmen.
Erfolgt eine Abfrage eines Masters an einen Slave dergestalt, dass der Master ein Kommando an den Slave sendet, auf das der Slave mit einem Ergebnis zu antworten hat, dann sind dazu immer mindestens 2 Übertragungen notwendig. Im ersten Byte-Austausch übermittelt der Master sein Kommando an den Slave (der zu diesem Zeitpunkt logischerweise noch kein Ergebnis vorliegen haben wird, er kennt ja das Kommando noch nicht) und im zweiten Byte-Austausch überträgt der Master einfach nur 1 Byte (meistens genügt da einfach irgendein Bytewert) um dem Slave seinerseits Gelegenheit zu geben, das zuvor angefragte Ergebnis zum Master zu übertragen. Beachten sollte man, dass ein Slave auch des öfteren etwas Zeit benötigen wird, um ein gerade erhaltenes Kommando auszuwerten und die entsprechenden Ergebnisse bereit zu stellen. Ein Master wird also gut daran tun, nach dem Byteaustausch zum Zwecke der Kommandoübermittlung eine kleine Pause einzulegen, ehe er dann mit dem zweiten Byteaustausch das Ergebnis abholt.
SPI-Modi
Wie schon angesprochen gibt es für das SPI verschiedene Möglichkeiten Polarität und Phase des Taktes einzustellen. Folgende vier Modi sind möglich:
Mode | CPOL | CPHA |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
2 | 1 | 0 |
3 | 1 | 1 |
- CPOL (Clock Polarity)
- 0: Takt ist in Ruhe LOW, ein Wechsel auf HIGH zählt als steigende Taktflanke
- 1: Takt ist invertiert: in Ruhe HIGH, ein Wechsel auf LOW zählt als steigende Taktflanke
- CPHA (Clock Phase)
- 0: Daten werden bei steigender Taktflanke (=abh. von CPOL) eingelesen, bei fallender ausgegeben
- 1: Daten werden bei fallender Taktflanke eingelesen, bei steigender ausgegeben
Man sieht, dass Mode 0 und Mode 3 bzw. Mode 1 und Mode 2 jeweils fast identisch sind. Der einzige Unterschied ist der Pegel des Taktes in Ruhe. In der Regel sind diese Modi deshalb austauschbar.
CPOL und CPHA lassen sich in den Konfigurationsregistern des Controllers einstellen. Beim AT91SAM hat sich Atmel ein kleines Extra einfallen lassen: hier heißt das Bit zur Einstellung der Clock Phase "NCPHA" und entspricht genau dem invertierten Wert von CPHA.
Es ist problemlos möglich ICs mit verschiedenen SPI-Modi an einem Bus zu betreiben, man muss nur vor dem Aktivieren des Chip Select den jeweils richtigen Modus einstellen.
Falle bei AVR Prozessoren
Bei den AVR-Prozessoren, welche eine SPI Einheit besitzen, ist es zwingend nötig, den SS-Pin der SPI Einheit auf Ausgang zu setzen, wenn man den Prozessor als Master benutzen möchte. Dies geschieht nicht automatisch, da ein auf Eingang geschalteter Pin im Multimaster Modus benötigt wird. Da dieser Fall aber recht selten vorkommt, wird er hier ignoriert. Schaltet man den Pin nicht auf Ausgang, dann hängt es vom extern angelegten Pegel ab, ob die Master-SPI Einheit arbeitet oder nicht. Daher muss man den Pin immer vorher auf Ausgang schalten. In diesem Fall ist der Pegel der SS Leitung dann irrelevant, die SPI Einheit arbeitet immer, sobald sie als Master konfiguriert wurde.
Fehlersuche
Immer wieder kommt es zu Problemen bei der Nutzung von SPI, obwohl diese Schnittstelle recht einfach aufgebaut ist. Oft kommt es u.a. zu dem Effekt, dass nur bestimmte SPI-Frequenzen funktionieren, etwas höher oder niedrigere nicht. Das ist ein klares Zeichen für Fehler. Folgende Punkte sollte man mit dem Oszilloskop prüfen, dabei sollte man die Tastköpfe richtig benutzen.
- Stimmt jeweils der SPI-Modus?
- Gilt nur für AVRs: Ist das SS-Pin vorher als Ausgang geschaltet, wenn der Master Modus verwendet wird?
- Sind die Select-Signale vorhanden?
- Sind die erreichten Pegel ausreichend?
- Sind die Taktflanken sauber genug? Siehe Wellenwiderstand.
- Sind die Daten während der Datenübernahme stabil?
- Ist die Zeit zwischen Select-Signal und Übertragungsbeginn ausreichend?
- Ist das SPI-Modul im Power Reduction Register (PRR) versehentlich deaktiviert?
Siehe auch
- Porterweiterung mit SPI
- AVR-Tutorial: Schieberegister
- MMC- und SD-Karten
- SPI Daisychain
- Forumsbeitrag: SPI Codetuning
- Forumsbeitrag: Beliebig viele CS Signale mit nur 2 CS Signalen am Controller glitchfrei erzeugen
- Forumsbeitrag: Skurriles Problem mit BS170 Mosfets; erfolgreiche Anwendung einer Thevenin-Terminierung für einen SPI-Bus mit langen Kabeln
- Forumsbeitrag: Echte Pegelwandler beheben Kommunikationsprobleme
Weblinks
- http://www.mct.net/faq/spi.html (Takteinstellungen, Slave-IC Liste, etc.)
- http://www.matuschek.net/atmega-spi (ATMega SPI Performance Tuning)
- AVR151: Setup and Use of the SPI Atmel Application Note (PDF)
- AVR151: Examples for Setup and use of the SPI Programming Examples for the Atmel Application Note (zip)
- Aardvark I2C/SPI Host Adapter, Universeller Adapter für I2C und SPI
- USB-SPI, Komplettbausatz von ELV