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