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
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
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
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.