Forum: Mikrocontroller und Digitale Elektronik AVR 8-Bit SPI Interface als Slave 3 Byte nonstop senden


von Praktikant (Gast)


Lesenswert?

Hallo,
habe mir gerade diverse Threads zur leider ungepufferten SPI 
Schnittstelle in Senderichtung der 8-Bit AVRs durchgelesen, sowie das 
Datenblatt durchstöbert.

Das habe ich vor:
Ich möchte mit mindestens 2-4 MHz SPI Takt und 16 MHz Systemtakt als 
Slave 3 Byte ohne Unterbrechnung rausschieben.

Frage:
Wann muss ich SPDR setzen damit das so (sicher) funktioniert? Muss ich 
immer über ein /SS unterbrechen? Wenn ja, kann ich hierfür den Chip kurz 
in den Master Mode setzen, um das ganze von der echten Master-Seite aus 
zu umgehen?

Soweit ich verstanden habe, tritt ja wenn ich zu früh/spät auf SPDR 
schreibe ein wcol Event (colission) ein. Aber nirgends habe ich etwas zu 
den minimalen Abständen zu den jeweiligen Flanken gefunden. Wenn ich 
jetzt mit 2 MHz Takte habe ich ja zwischen Flanken immer 8 Takte Zeit, 
von denen ja noch 4 für die Übertragung nutze, leite ich mir mal so aus 
der maximalen Frequenz von CLK/4 ab für SPI?

von Rainer U. (r-u)


Lesenswert?

Praktikant schrieb:
> Wann muss ich SPDR setzen

Ich würde mal sagen - sobald das SPIF gesetzt ist, denn dann weißt Du, 
dass eine Übertragung fertig ist und die nächste folgen kann.

von Peter (Gast)


Lesenswert?

Ich hatte ähnliche Probleme. Der Master sendet den Takt schneller als 
der Slave die neuen Daten in den Übertragungspuffer schieben kann.
Eine einfache Lösung ist, den Master mit Verzögerung senden zu lassen.

Ich hatte zum Glück keine sonderlich hohen Anforderungen an die 
Geschwindigkeit und habe einfach den langsamsten Takt genommen - da 
gings dann auch ohne Verögerung.

von Praktikant (Gast)


Lesenswert?

Habe die SPI jetzt mit 200 kHz laufen und aktualisiere den Wert zirka 
1,1-1,2 µsec vor steigender Flanke des neuen Bytes. Das funktioniert.

Bei 240 ns (knappe 4 Taktzyklen) vor neuem Byte (CLK steigende Flanke) 
scheint es nicht zu funktionieren.

Daher:
Aber mit 2-4 MHz wird das nicht mehr klappen. Überlegung Timer 
einsetzen, welcher kurz vor abschluss Byteübertragung eine ISR anstößt, 
in welcher dann SPIF gepollt wird. Aber was die Mindesttimings betrifft, 
welche die Hardware verlangt, habe ich immer noch nicht die richtigen 
Daten. Es soll ja nicht nur bei 20 °C funktionieren und bei diesem einen 
µC ...
Zu dem pollen = Abfrage + Sprung = 3 Taktzyklen, wenn ein Takt SPI aber 
nur noch 8 Taktzyklen hat wird das auch nicht mehr klappen behaupte ich 
mal.weitere Überlegung PIN auf high CLK abfragen von Bit 8 und dann über 
Assembler passend auf SPDR Daten legen.

Sorry, falls es etwas durcheinander ist, konnte nicht am Stück schreiben 
...

von Rainer U. (r-u)


Lesenswert?

also wenn es so zeitkritisch ist, rate ich mal, dass Du in Assembler 
programmierst. Da sollte es einen Takt dauern, in dem das SPIF gesetzt 
wird. In den nächsten beiden Takten springst Du dadurch (interrupt) in 
die ISR, im nächsten Takt lädst Du das SPDR innerhalb der ISR aus einem 
vorbereiteten Register - macht 4 Takte, danach hast Du wieder viel 
Zeit.. oder?

von Praktikant (Gast)


Lesenswert?

Schaue morgen mal weiter ...

Aber mit Sprüngen und so weiter komme ich da auf mehr als 4 Takte?

von Peter D. (peda)


Lesenswert?

Das Zeitfenster zum Laden des SPDR berträgt genau 0,5 SCK-Zyklen.

Also bei 2MHz SCK hast Du genau 250ns Zeit, das SPIF abzufragen und dann 
das SPDR zu schreiben = 4 CPU-Takte bei 16MHz.


Peter

von Praktikant (Gast)


Lesenswert?

Ok, vielen Dank an alle und insbesondere @peda!
Mal schauen wie ich das jetzt mache.
Müssen jetzt 4 MHz werden, also werde ich wohl eine extra Lese Routine 
für die langsameren machen müssen. Denn 2 Taktzyklen ... da geht nicht 
viel.

von Falk B. (falk)


Lesenswert?

SPI-Slave mit soviel Software Overhead wie beim AVR ist nicht so doll. 
Die meisten ICs der Welt haben einfach richtige Schieberegister bzw. 
reine Digitallogik ohne Software, da geht das beliebig schnell.
 Und für das Nachladen bei maximaler Geschwindigkeit nimmt man 
logischerweise KEINEN Interrupt, denn der schluckt extra noch eine 
Handvoll Takte, in C sogar nochmehr. Das MUSS man pollen, ggf. auch im 
Interrupt. Die paar Mikrosekunden tut das nicht weh. Nur das Erkennen 
der fallenden Flanke von SS erfolgt meistens per Interrupt.

von Peter D. (peda)


Lesenswert?

Wie wärs, als Slave einen 8051 zu nehmen, die haben gepuffertes SPI, 
d.h. Du hast 8 SCK-Takte Zeit zum Nachladen.
Da sind 4MHz kein Problem, auch nicht als Interrupt und in C 
programmiert.

http://www.atmel.com/products/microcontrollers/8051architecture/flash_isp-single_cycle_core.aspx


Peter

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.