SPI Daisychain
SPI als Daisychain
SPI lässt sich neben den bisher hier erklärten Modi auch als Daisychain einsetzen. Das ist nützlich falls die Anzahl der verfügbaren Pins des Mikrocontrollers beschränkt und/oder die Anzahl der Slaves groß ist. Eine Daisychain unterscheidet sich grundlegend von einem "normalen" SPI-Aufbau darin, dass die Slaves nicht an einer gemeinsamen MISO/MOSI Leiterbahn angeschlossen sind, sondern die vom Master empfangenen Daten jeweils an den nächsten Slave weiterschieben und sich so ein Ring bildet, wobei am Ende die Antwortdaten wieder beim Master ankommen. Den Ausgangspunkt bildet hierbei der MOSI des Mikrocontrollers, das Ende der MISO. Die Taktleitung teilen sich alle angeschlossenen Geräte, ebenso wie den Slave-Select.
Aufbau
Dieser Aufbau lässt sich um fast beliebig viele Slaves erweitern, sie werden zwischen die beiden abgebildeten Slaves geschaltet, wobei der MISO des ersten Slaves an den MOSI des zweiten Slaves angeschlossen wird, der MISO des zweiten Slaves an den MOSI des dritten, usw.
Änderungen in der Steuerung
Der Hauptunterschied zum "herkömmlichen" SPI besteht darin, dass die Slaves durch den Slave-Select nicht ausgewählt werden, sondern, dass mit Änderung des Slave-Select auf logisch 0 die Übertragung begonnen, und mit Rücksetzen des SS die Übertragung beendet wird. Ein Beispiel: Man verwendet drei Slaves. Zu Beginn wird der SS auf logisch 0 gelegt. Dann beginnt man die Übertragung von drei Nachrichten. Nach Versenden der ersten Nachricht wird der Slave nicht reagieren. Schickt man nun eine zweite Nachricht hinterher, schiebt der erste Slave die erste Nachricht an den zweiten Slave und empfängt die zweite Nachricht. Keiner der beiden Slaves wird reagieren. Sendet man die dritte Nachricht, erhält der dritte Slave das zuerst gesendete Token, der zweite Slave das zweite, und der erste Slave die zuletzt gesendete Nachricht. Erst dann wird der Slave-Select wieder in den logischen 1 Zustand zurückversetzt. An diesem Punkt übernehmen die Slaves die Nachrichten aus ihrem SPI-Register und führen den Befehl aus. Der letzte Slave führt also den zuerst gesendeten Befehl aus, der erste Slave den zuletzt gesendeten. Ebenso verhält es sich bei den Antworten. Man wird nach dem Senden der ersten Nachricht die Antwort des letzten Slaves erhalten, dann die des vorletzten usw. Man muss den Slave-Select in diesem Modus selbst steuern. Das kann sich vom Timing her als schwierig erweisen.
Hinweise
Worauf sollte man achten?
- An einer Daisychain keine Slaves mit 8 und 16-bit Nachrichten mischen!
- Timing! Der SS sollte schon eine gewisse Zeit 0 sein bevor man beginnt zu senden. Lässt sich meist den Datenblättern der Slaves entnehmen.
- Sende-/Empfangsreihenfolge beachten, wie oben beschrieben
- Der Slave-Select muss vermutlich manuell (im Code) betätigt werden, es sei denn der Mikrocontroller unterstützt es
- Möglichst immer so viele Nachrichten schicken wie es Slaves gibt. Beispiel: 2 Slaves, ich schicke 0x05 an den ersten Slave, der möchte mit 0xE3 antworten und gibt dies an den zweiten Slave weiter. Hier beende ich die Übertragung. Der zweite Slave wird also 0xE3 als Befehl auffassen. Dies kann zu unerwünschtem Verhalten führen! außerdem können nicht alle Antworten empfangen können.
- Unterstützen die Slaves Daisychaining?
- Ebenso alles was im Artikel SPI beschrieben wird