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?
Das SPDR ist das SPI Datenregister, das ist das effektive Schieberegister. Was ist so schwierig, darauf zu warten bis das byte draussen ist ?
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).
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.