mikrocontroller.net

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


Autor: Jakob Keres (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark Hämmerling (haemi)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.