Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem SPI


von Jens (Gast)


Lesenswert?

Hallo,

mache grad erste Geh-Versuche mit dem RFM12 Modul.
Das Modul wird über SPI angesteuert.

Scheinbar schreibt und liest man über SPI ja gleichzeitig?
Jetzt mal eine ganz blöde Frage: Wieso muss ich immer lesen, wenn ich 
etwas schreibe? Ggf. will ich ja nur etwas schreiben oder andersrum.

Gibt es verschiedene Modi oder habe ich grundsätzlich etwas falsch 
verstanden?

Das nächste Problem tritt schon auf, wenn ich sehe, dass mein uC nur 
8Bit im Register für SPI hat aber ich den RFM12 mit 16 beschreiben 
muss... Einfach zweimal schreiben?

Vielleicht kann mir einer auf die Sprünge helfen.

von Purzel H. (hacky)


Lesenswert?

Das SPI ist ein Schieberegister, eigentlich sind es zwei 
schieberegister. Eins zum Schreiben, eins zum Lesen. 1 Byte Schreiben 
loest eine Folge von 8 bits plus clock aus. Dh 16 bit schreiben sind 
zwei byte schreiben. Ja. Aber nach dem ersten byte warten bis es 
draussen ist.
Lesen bedeutet man muss erst den clock ausloesen. Indem man ein 
Dummybyte schreibt. und wenn das draussen ist, das Register liest. Steht 
aber alles im Datenblatt.

von Michael B. (mb_)


Lesenswert?

Hex Oschi schrieb:
> Das SPI ist ein Schieberegister,

Man kann sich SPI als ein X-bit Schieberegister vorstellen, von dem 
jeweils der Host und der Slave X/2-bit haben. Dieses register wird bei 
jedem Transfer (ein SCK) um ein Bit rotiert. Das heißt das erste Bit 
"fällt" vorne raus und wird über die Leitung übertragen. Hinten wird 
aufgefüllt mit dem Bit was beim Kommunikationspartner rausgefallen ist. 
Deshalb sind Senden und Empfangen untrennbar.

1
       Master                       Slave
2
       Register                    Register
3
--   [########]   -->-MOSI-----   [########]   --
4
|                                               |
5
-------------------<--MISO-----------------------

Die Rauten (#) sind die Bits.

von Jens (Gast)


Lesenswert?

Hallo,

erstmal danke für Eure guten Antworten.

Wenn ich das richtig verstanen habe, haben die beiden Partner also 
nachdem ein Byte gesendet wurde (vorausgesetzt, die Register haben ein 
Byte Länge) die Inhalte getauscht?


Wenn das passiert ist würde ich z.B. bei Master das Register auslesen, 
neu füllen und das ganze wiederholen?

Wenn ich nichts vom Slave haben möchte ignoriere ich den Inhalt einfach?

Und die letzte Frage: Warum macht man das so, effizienter?

Jens

von Toni (Gast)


Lesenswert?

@Jens

Soweit richtig verstanden.

Wenn Du nur Senden willst, kannst Du das hereingekomme Byte ignorieren.

Wenn Du nur Empfangen willst, (z.B. einen vorher angeforderten Wert)
dann kannst Du ein "beliebiges" Byte senden i.d.R. sende ich dann
den Wert 0x00. Die empfangenen Bytes werte ich dann natürlich aus.

Ich könnte mir vorstellen daß es aus Gründen der schnelleren Übertragung
so gelöst wurde, mit 8 Clocks wird ein Byte Empfangen und gesendet.
Es gibt sicher noch weitere Gründe, viellecht fällt ja den Anderen hier
auch etwas dazu ein. (Bin niemals lernresistent)

von Michael B. (mb_)


Lesenswert?

Jens schrieb:
> Und die letzte Frage: Warum macht man das so, effizienter?

SPI ist halt hardwaremäßig als Vollduplex (mit Slave Multiplexing) 
ausgelegt. Master und Slave haben jeweils ihre eigene Sendeleitung.

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.