Forum: Mikrocontroller und Digitale Elektronik SPI: Master empfangen, Slave senden


von Jakob Keres (Gast)


Lesenswert?

Hi,
ich möchte zwei µC per SPI koordinieren, wobei der eine immer Master
und der andere immer Slave sein soll.
Mir ist dabei nicht ganz klar, wie der Empfangsvorgang aus
Master-Sicht, bzw. der Sendevorgang aus Slave-Sicht aussieht.

Also der Master bekommt meinentwegen per Interrupt mitgeteilt, dass der
Slave neue Daten hat. Und dann?
Zieht der Master /SS nach Low? Und dann sendet der Slave munter drauf
los? Und wenn der Slave doch keine Daten hat? Kann der Master den Slave
auch periodisch abfragen oder muss sichergestellt sein, dass da Daten
bereit liegen?

So wie ich das Datenblatt verstehe, sind
MISO-MISO und
MOSI-MOSI
direkt verbunden, also nicht über Kreuz.

Viele Grüße
Jkob

von Peter Dannegger (Gast)


Lesenswert?

Also der Slave will ausgelesen werden, dann stellt er ein Byte in das
SPI-Register und signalisiert dem Master, daß was da ist, z.B. mit
einer Flanke auf einer extra Leitung.

Nun zieht der Master /SS auf low und schreibt irgendein Byte in den
Sendepuffer und da er der Master ist, werden 8 Takte erzeugt, die die
Bytes austauschen. D.h. der Master hat nun das Byte des Slave und
umgekehrt.

Der Slave stellt nun das nächste Byte in das SPI-Register und erzeugt
die nächste Flanke auf der extra Leitung, damit der Master nun dieses
Byte abholen möge usw. bis alle Bytes abgeholt wurden.

Insgesamt braucht man also 5 Leitungen.


Zum Abholen muß also der Master immer ein Dummy-Byte raustakten und
vorher dem Slave Zeit gelassen haben, ein Byte ins Register zu
stellen.


Peter

von Mark H. (haemi)


Lesenswert?

Salve,

(ich seh grad, der Peter war wieder schneller :p - schicke es trotzdem
mal ab...)

richtig. MISO bleibt MISO und MOSI bleibt MOSI. Der Name sagt ja schon
alles über deren Funktion (M/S bzw. I/O) aus.

SPI-Geräte mußt Du Dir vorstellen wie Schieberegister. Im AVR liegen
die Daten ja dann auch gleich in je einem I/O-Register bereit. Diese
beiden Register teilen sich lediglich die I/O-Adresse (SPDR). Physisch
sind das zwei getrennte Register (je nach dem, ob das Programm davom
liest [Empfangsreg.] oder hineinschreibt [Sendereg.]).

Wenn der Slave ein Byte zu senden hat, schreibt er dieses in sein SPDR,
bevor der Master lostaktet (das tut er genau dann, wenn Du ihm ein
[evtl. Dummy-]Byte ins SPDR geschrieben hast). Mit den danach
eingehenden SCK-Pulsen (immer gesandt vom Master) wird dieses Byte dann
Bit für Bit an den Master geschickt. Der Master schickt seinerseits
gleichzeitig auch ein Byte an den Slave. Wenn Du den Transfer nur in
eine Richtung brauchst (weil z.B. die Antwort von dem Byte aus dem
Slave abhängt), dann schickst Du wie gesagt nur ein Bogus-Byte, z.B.
0x00.

Bei SPI wird also immer gleichzeitig in beide Richtungen übertragen -
weil ja nur eine Clock vorhanden ist.

Im Slave wird bei inaktivem /SS (also high) der Bitzähler
zurückgesetzt, d.h. es wird ein komplettes neues Byte erwartet. Das
macht Sinn, um beide Geräte zu synchronisieren. Man nutzt es auch für
Framing - da kapselt man einen ganzen Block von Bytes, d.h. setzt /SS
nur für die Dauer der Blockübertragung aktiv (low). Bei mehreren Slaves
ist das Framing logischerweise impliziert (weil da jeder inaktive Slave
durch das Highschalten von /SS sein Empfangsregister initialisiert).
Was bei /SS inaktiv mit dem Senderegister passiert, weiß ich jetzt gar
nicht. Steht aber ganz bestimmt im Datenblatt.

Mark

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.