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