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