Hallo, trotz Lektüre der USI-Schnittstellen Beschreibung des Datenblatts, ist mir noch nicht ganz klar wie der Datenaustausch geht. Mein Fernziel ist es, mit Hilfe einer eigenen PC-Software via LPT Daten an die USI/SPI Schnittstelle eines AVR zu senden. Der AVR soll die Daten dann ins RAM schreiben und auf Befehl wieder auf die USI ausgeben, wo sie dann vom PC gelesen werden sollen. Ist es richtig, daß - der Slave der Empfänger ist und der Master der Sender? - der Slave im three-wire mode jedes empfangene Bit quittiert und etwas (ein Bit) an den Sender zurückschickt? Brauche ich für das Vorhaben wirklich den three-wire-mode oder reicht auch ein two-wire-mode aus? Gibt es irgendwo Anleitungen oder was zu lesen über die Benutzung der USI? Besten Dank im vorraus!
"Ist es richtig, daß - der Slave der Empfänger ist und der Master der Sender?" Für die Clock-Leitung schon, sonst nicht. Beide Senden und Empfangen bei 3 Draht gleichzeitig, der Master bestimmt wann genau. Mit jedem Clock schiebt er ein Bit raus, und liest eins vom Slave ein. Der Slave macht das gleiche - schiebt ein Bit vom Master unten in sein Schieberegister rein, und sendet das Bit das oben rauskommt an den Master. Nach 8 Clocks hat er 8 Bits vom Master im Schieberegister, und der Master hat 8 Bits vom Slave. In diesem Moment müssen beide die Register lesen, wenn sie die Werte benötigen und das Schieberegister mit der Antwort überschreiben. (unten und oben können auch vertauscht werden - wäre dann LSB first). Blöd ist, dass nur der Master eine Übertragung beginnen kann, wenn er etwas vom Slave erwartet, muss er dauerend abfragen ob der Slave die Daten bereit hat. Darum benutzt man oft noch eine Rückleitung (ein Portbit) mit dem der Slave dem Master signalisiert - "hallo ich habe was für dich". Das kann dann beim Master einen Interrupt auslösen oder so, und er beginnt dann den Slave abzufragen. Auch wenn er nur vom Slave lesen will, muss er doch irgendwelche Bits senden (z.B. alles Nullen) damit das Schieben der Register läuft. "- der Slave im three-wire mode jedes empfangene Bit quittiert und etwas (ein Bit) an den Sender zurückschickt?" Quittieren Nein. Er sendet den Inhalt von seinem Schieberegister. Gruss Andi
@Andi, vielen Dank für die Erklärung. Ich verstehe noch nicht völlig, wozu der Slave für jedes empfangene Bit ein Bit aus seinem Sende-Schieberegister zurücksendet. Welchen Hintergrund oder Nutzen hat das? Kann man auf diese Weise kontrollieren, z.B. mit Hilfe einer Checksumme, ob die Übertragung vom Master an den Slave richtig angekommen ist? Wenn ja, wie würde das gehen, zumal das was der Slave sendet bereits zu Beginn der Übertragung im Register stehen muß? Mir fehlt da noch etwas die praktische Vorstellung.
Indem du zb. als Master 1-2 Bytes mehr sendest als nötig. Meistens sendet man einfach 0xFF Bytes. Der Slave hat somit 1-2 Bytes mehr Zeit und kann dann die Checksumme senden. Das 1. Byte des Slaves benutze ich immer als allgemeines Statusbyte, bit codiert, das den Status des Slaves anzeigt. Gruß Hagen
"Ich verstehe noch nicht völlig, wozu der Slave für jedes empfangene Bit ein Bit aus seinem Sende-Schieberegister zurücksendet." Das ergibt sich aus dem Hardware-Aufbau der SPI. SPI ist so ziemlich die einfachst mögliche Hardware für bidirektionale Datenübertragung. Im Wesentliche wirklich nur ein Schieberegister, das gelesen und beschrieben werden kann. "Welchen Hintergrund oder Nutzen hat das?" Man kann z.B. gleichzeitig in beide Richtungen Daten austauschen. Während dem die Antwort vom Slave hereinkommt, kann der Master schon das nächste Kommando schreiben. Meistens macht man das aber nicht, da es recht kompliziert werden kann. Bei deiner Anwendung ist das auch nicht nötig. Wenn der Master (der PC) ins RAM vom AVR schreiben will, beachtet er die Bits die vom AVR zurückkommen einfach nicht. Wenn der Master vom AVR-RAM lesen will sendet er z.B. die RAM-Adresse und die Anzahl, dabei beachtet er die Bits die vom Slave kommen wiederum nicht, danach sendet er Dummy-Bytes (z.B. $FF oder $00) und zwar genau so viele, wie die Anzahl, die er dem Slave mitgeteilt hat. Diese haben nur den Zweck dass der AVR die RAM Daten zurücksenden kann. Jetzt also beachtet der Master das was vom Slave kommt, der Slave muss aber den Inhalt der Bytes vom Master nicht beachten. Gruss Andi
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.