Forum: Mikrocontroller und Digitale Elektronik AVR USI-SPI Verständnisfragen


von Johann (Gast)


Lesenswert?

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!

von Johann (Gast)


Lesenswert?

Experten, wo seit ihr???
Helft mir doch bitte mal!

von Andi (Gast)


Lesenswert?

"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

von Johann (Gast)


Lesenswert?

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

von Hagen (Gast)


Lesenswert?

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

von Andi (Gast)


Lesenswert?

"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
Noch kein Account? Hier anmelden.