Forum: Mikrocontroller und Digitale Elektronik WANN ist eine SPI Übertragung tatsächlich abgeschlossen?


von alterHerr (Gast)


Lesenswert?

Einen schönen Guten Abend,

Mir kam des letzteren immer wieder der Gedanke, wie lange und wann genau 
eine SPI Daten übertragung denn nun wirklich abgeschlossen ist.

Nehmen wir mal an:
Master-Slave System. Slave kann nur empfangen.

1) Slave Select Leitung wird auf Low gezogen
2) Byte wird übertragen
3) warten bis Byte aus dem Transmit Shift Register raus ist, um ggf ein 
neues Byte zu senden.
4) Slave Leitung wird auf High gesetzt.

-Benötigt das Slave intern, um die empfangenen Daten zu verarbeiten, die 
Slave Leitung auf High, um die Übertragung "abzuschließen" oder wird 
sofort nach dem Empfang los gelegt?

Wie kann ich mit gutem Gewissen sagen, dass das Byte schon verarbeitet 
ist? Wenn ich die Daten mit einem Clock X MHz raussende, und das 
Transmit Register leer ist, darf ich dann behaupten dass zu dem 
Zeitpunkt wo das letzte Bit mein Shift Register verlassen hat, alles 
schon im Empfangs Shift Register angekommen ist ?

Bin interessiert was für Gedanken bei raus kommen.

lG, Manfred.

von S. R. (svenska)


Lesenswert?

alterHerr schrieb:
> Bin interessiert was für Gedanken bei raus kommen.

Heißt das, du bist an Fakten garnicht interessiert?

Ich behaupte mal aus dem Bauch heraus:
Das hängt davon ab. Vom Empfänger nämlich.

von Wolfgang (Gast)


Lesenswert?

alterHerr schrieb:
> Nehmen wir mal an:
> Master-Slave System. Slave kann nur empfangen.

Falsche Annahme. Bei SPI wird ein Byte zwischen Master und Slave 
ausgetauscht. Je nach Mode werden mit der einen Clockflanke die Daten 
umgeschaltet, i.e. das nächste Bit auf die Leitung gelegt und mit der 
anderen beim Partner übernommen. Da du nicht genau weisst, wie schnell 
der Empfänger ist (Laufzeiten o.ä.) kann man die Übertragung erst mit 
der nächsten "Wechselflanke" als abgeschlossen betrachten.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

ich sehe das anders. Die Verarbeitungszeit des Datenpaketes hängt allein 
vom Empfänger, hier Slave ab. Damit einhergehend bedingt es eine 
Wartezeit seitens des Senders, hier Master, bevor er ein neues 
Datenpaket senden darf.

Bsp. Display. Zwischen den Kommandos gibts eine Mindestwartezeit. Oder 
jemand wirft dir ständig Matheaufgaben an den Kopf die du ausrechnen 
sollst, hierfür benötigst du auch Empfangspausen zum Kopfrechnen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

alterHerr schrieb:
> -Benötigt das Slave intern, um die empfangenen Daten zu verarbeiten, die
> Slave Leitung auf High, um die Übertragung "abzuschließen" oder wird
> sofort nach dem Empfang los gelegt?
Wie und wann der Slave die übertragenen Daten auswertet, steht in dessen 
Datenblatt. Aber in der Regel wird der SS# als Synchronisation für ein 
übertragenes Paket verwendet. Er zeigt an, wenn das erste Bit kommt und 
manchmal zeigt er auch an, wenn das letzte Bit gekommen ist.
Manche Slaves "zählen" auch die übertragenen Bits mit und lösen dann je 
nach Bitposition bestimmte Aktionen aus (z.B. Übertragung einer Antwort 
nach 8 Bits o.ä.).

alterHerr schrieb:
> Slave kann nur empfangen.
Du solltest dir vergegenwärtigen, dass SPI lediglich hintereinander 
geschaltete Schieberegister sind, und so üblicherweise pro Takt sowohl 
ein Bit gesendet und gleichzeitig eines empfangen wird.

Siehe dort das mittlere Bild:
http://www.lothar-miller.de/s9y/archives/15-SPI.html

von c-hater (Gast)


Lesenswert?

alterHerr schrieb:

> Wie kann ich mit gutem Gewissen sagen, dass das Byte schon verarbeitet
> ist? Wenn ich die Daten mit einem Clock X MHz raussende, und das
> Transmit Register leer ist, darf ich dann behaupten dass zu dem
> Zeitpunkt wo das letzte Bit mein Shift Register verlassen hat, alles
> schon im Empfangs Shift Register angekommen ist ?

Ja, denn es handelt sich um synchrones Verfahren und es ist festgelegt, 
dass die Übernahme der Bits an der "aktiven" Flanke des Takts zu 
erfolgen hat, die wiederum in der Mitte der Bitzeit erfolgt. D.h. am 
Ende der Bitzeit ist das Bit mit Sicherheit beim Empfänger angekommen.

Ob allerdings das Byte vom Empfänger bereits verarbeitet wurde, ist 
natürlich von dessen Implementierung abhängig. Üblicherweise dürfte die 
Antwort nein lauten, die Verarbeitung dürfte bei den meisten Empfängern 
erst dann beginnen, wenn die inaktive Flanke des letzten Taktes ankommt, 
also am Ende der letzten Bitzeit.

Wenn du selber mal versuchst, eine SPI-Logik zu entwerfen, wirst du 
schnell dahinter kommen, warum das üblicherweise so ist.

von Volle (Gast)


Lesenswert?

Beim SPI ist wenig festgelegt
ich kenne Bausteine die wissen nach Bit 7 was sie tun sollen.
 Laden während Bit 8 die Daten in das Ausgangsregister, die dann mit 
Bit9-16 an den Master gehen.

Andre Bausteinen haben einen separaten Clock mit dem sie ihre Logik 
versorgen.

Am kompliziertesten ist ein System da ist zuerst der µC Master dann der 
angeschlossene Baustein Master und der µC Slave.
Da die Anwort keine feste Länge hat.


SPI ist einfach nicht so streng genormt wie z.B CAN

Clock, 1-2 Daten Leitungen mit unterschiedlicher Richtung, 0-n Select 
ist SPI

von Tobias S. (x12z34)


Lesenswert?

Wolfgang schrieb:
> alterHerr schrieb:
>> Nehmen wir mal an:
>> Master-Slave System. Slave kann nur empfangen.
>
> Falsche Annahme. Bei SPI wird ein Byte zwischen Master und Slave
> ausgetauscht. [...]

Lothar M. schrieb:
> alterHerr schrieb:
>> Slave kann nur empfangen.
> Du solltest dir vergegenwärtigen, dass SPI lediglich hintereinander
> geschaltete Schieberegister sind, und so üblicherweise pro Takt sowohl
> ein Bit gesendet und gleichzeitig eines empfangen wird

off-topic:
Eine kurze Anmerkung dazu: Es gibt durchaus ICs wie die MCP4xxx 
DA-Wandler (z.B. 
http://ww1.microchip.com/downloads/en/DeviceDoc/22250A.pdf), die zwar 
ein SDI (serial data in), aber kein sdo (serial data out) haben, bei 
denen somit ein Daten-"Austausch" nicht stattfinden kann.

Allerdings ist, um wieder On-topic zu werden und das zu bestätigen, was 
meine Vorschreiber schon schrieben: Im Datenblatt ist im Kapitel 5.2 
beschrieben, wann die Daten aus dem SPI Register verarbeitet werden.
Soll heißen, die Information ist im Datenblatt vorhanden und muss von 
dort extrahiert werden, da der Zeitpunkt vermutlich von IC zu IC 
unterschiedlich ist

edit: Kapitel korrigiert ;-)

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

alterHerr schrieb:
> Wie kann ich mit gutem Gewissen sagen, dass das Byte schon verarbeitet
> ist?

Entweder der Master wartet entsprechend lange nach jedem Byte oder der 
Slave hat eine ordentliche gepufferte Implementierung, was bei den 
standard AVRs jedoch nicht der Fall ist. Auch hat der AVR keine 
Interruptlevel, um dem SPI Vorrang geben zu können. Insbesondere das 
Slave senden ist daher bei den AVRs ein pain in the ass.

alterHerr schrieb:
> Wenn ich die Daten mit einem Clock X MHz raussende, und das
> Transmit Register leer ist, darf ich dann behaupten dass zu dem
> Zeitpunkt wo das letzte Bit mein Shift Register verlassen hat, alles
> schon im Empfangs Shift Register angekommen ist ?

Nein, erst mit der nächste Taktflanke nach Anlegen des letzten Datenbits 
übernimmt der Slave. Und solange muß /SS auf low bleiben. In der Regel 
wird dann erst auch das Transmit-Done Flag gesetzt, so daß man das 
absichern kann, ohne einen Timer aufsetzen zu müssen.

von Jim M. (turboj)


Lesenswert?

alterHerr schrieb:
> -Benötigt das Slave intern, um die empfangenen Daten zu verarbeiten, die
> Slave Leitung auf High, um die Übertragung "abzuschließen" oder wird
> sofort nach dem Empfang los gelegt?

Es gibt verschiedene SPI Slave Implementationen.

Eine SD Karte z.B. verarbeitet die Daten ohne dass man den Slave Select 
auf High setzen muss. Ein AVR triggert mit der 8. Flanke seinen SPI 
Interrupt.


Ein NordicSemi NRF5x braucht für seine SPIS jedoch zwingend ein CS=High, 
weil erst dann der SPI-DMA Puffer an den µC Core zurückgegeben wird. 
Vorher sieht er nicht wieviele Bytes übertragen wurden.

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.