Forum: Mikrocontroller und Digitale Elektronik SPI: Byte in SPDR schreiben während Übertragung


von Maxim (Gast)


Lesenswert?

Habe jetzt keine Möglichkeit, das auszuprobieren. Weiß jemand, was 
passiert, wenn der Slave während einer Übertragung ein Byte, das er an 
de Master senden will, in den SPDR schreibt? Im Datenblatt steht nur, 
dass es nicht erlaubt ist, nicht aber, was dann passiert.

Wird das gerade gesendete Byte zerstört? Oder ist der SPDR zum Zeitpunkt 
der Übertragung gerade schreibgeschützt?

von Maxim (Gast)


Lesenswert?

Vergessen: Ist natürlich ein AVR :)

von ... (Gast)


Lesenswert?

Das SPDR ist das SPI Datenregister, das ist das effektive 
Schieberegister. Was ist so schwierig, darauf zu warten bis das byte 
draussen ist ?

von Benedikt K. (benedikt)


Lesenswert?

Maxim wrote:

> Wird das gerade gesendete Byte zerstört?

Ja, das definitiv. Ich bin mir nicht ganz sicher, aber ich glaube beide 
Bytes gehen vorloren, also das alte und das neue. Und zwar kommt 
anscheinend die ganze Logik durcheinander, denn am Ausgang kommt 
irgendwas undefinierbares raus, was nicht mit den gewollten Daten zu tun 
hat.
Es sind pro Übertragung übrigends mindestens 17 Takte notwendig (bei 
fCPU/2 Taktrate).

von Maxim (Gast)


Lesenswert?

Hm, also muss der Slave eventuell warten, bis die Übertragung fertig 
ist. Das ereknnt er z.B. daran, dass der SS-Pin high ist, oder?

Kann ich das SPDR beschreiben, während der SS-Pin low ist (z.B. vor dem 
Senden eines Pakets)?

Ich denke, ich mache das so:

Der Slave fragt den SS-Pin ab. Ist dieser low, so weiß der Slave, dass 
die SPI gerade aktiv ist. Ist der SS-Pin high, kann der Slave seine zu 
sendenden Daten in den SPDR schieben.

Was passiert aber, wenn der Slave gerade die Daten in den SPRD schieben 
will und zum gleichen Takt der SS-Pin auf low gezogen wird? Kann/darf 
das SPDR-Register bei SS-Pin = low noch aktualisiert werden?

Wenn das so ist, dann könnte ich im Master zwischen dem setzen des 
SS-Pins auf low und dem tatsächlichen Senden der Daten noch eine kurze 
Wartezeit einbauen (ein paar Takte), sodass der Slave da noch 
rechtzeitig das SPDR beschreiben kann.

von Benedikt K. (benedikt)


Lesenswert?

Ich würde einfach warten bis das SPIF Flag gesetzt ist. Dann weißt du, 
dass eine Übertragung fertig ist. Wenn der AVR den zeitpunkt verpennt, 
dann schreibt er dann zwar die Daten mitten in der Übertragung, aber 
selbst wenn er jetzt noch wartet, dann werden die alren und somit 
falschen Daten gesendet. Läuft am Ende auf dasselbe hinaus: Die Pause 
zwischen den Bytes muss ausreichend groß sein.

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.