Verständnisproblem SPI

Gast #2159182
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.
#2159213
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.
#2159220
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.
Gast #2159646
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
Gast #2159668
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren