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.
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.
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.
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
@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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.