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?
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.
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.
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 ...
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?
Schaue morgen mal weiter ... Aber mit Sprüngen und so weiter komme ich da auf mehr als 4 Takte?
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.