AVR 8-Bit SPI Interface als Slave 3 Byte nonstop senden

Gast #2927545
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?
Gast #2927824
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.
Gast #2927967
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 
...
#2927994
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?
Gast #2929211
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.
#2929280
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren