Es sollte prinzipiell möglich sein, alle seriellen Schnittstellen zu benutzen ohne ein Delay zu benötigen.
Hmm...
Um mal bei den von Dir eingeworfenen seriell angebundenen Speichern zu bleiben:
Der Master-AVR soll also ein Byte von Adresse X lesen. Vereinfacht angenommen also folgendes Protokoll:
- CS aktivieren
- X senden (empfangenes Byte enthält entweder Status oder Müll)
- irgendwas senden (empfangenes Byte ist Inhalt von Adresse X)
- CS deaktivieren
Ok, wenn jetzt ein AVR die Rolle des Slave übernehmen soll, brauchst Du zwingend 'ne Pause (ob nun delay-basiert, durch irgendwelchen nebenbei laufenden sinnigen Code, oder durch einen hinreichend groß gewählten SPI-Prescaler) zwischen dem letzten Bit von "X senden" und dem ersten Bit von "irgendwas senden".
Der Slave muß ja Zeit zum reagieren haben - bei Verwendung von IRQs verstreichen erstmal vier Takte bis zur IVT, zwei weitere für den Sprung zur ISR. Dort wird dann sicherlich das SREG und vorher ein Rechenregister gerettet (mindestens), fünf weitere Takte. jetzt wäre das SPDR zu laden (1 Takt), das adressierte Byte zu laden (2 Takte) und nach SPDR zu schreiben (1 Takt).
Also mindestens 15 Takte.
Bei einem möglichen SCK-Vorteiler von vier wären da bereits gut drei Bits des nächsten Bytes im Transfer unterwegs.
Meinem Verständnis nach sollte bereits beim Beschreiben von SPDR nach der ersten SCK-Flanke (des neuen Bytes) 'ne Write Collision kommen.
Aus dem Datenblatt geht nicht genau hervor, ob SPDR während eines Transfers (nach der ersten SCK-Flanke) "gelockt" ist, aber "single buffered in the transmit direction" könnte man zumindest so interpretieren...
So wie es scheint, gibt es Probleme beim Schreiben der Empfangsdaten beim Master und dies kann ich nur durch ein delay (die schlechteste aller Möglichkeiten) in Griff bekommen...wenn ich dieses delay nicht habe (sende/empfange 8 Bytes) stehen im Empfangsbuffer des Masters teilweise die Werte des Sendebuffers des Masters - komisch ...
Das (Probleme beim Schreiben) glaube ich nicht. Wenn Du ein Byte ins SPDR schreiben läßt, wird das Byte ins Schieberegister geschrieben (sofern kein Transfer läuft). Bei gesetztem MSTR-Bit (=Master), wird dadurch auch ein Transfer angestoßen.
Nach dem achten Bit wird der Inhalt des Schieberegisters in den "Shift Register Read Buffer" kopiert.
Jedesmal wenn Du SPDR lesen läßt, wird in Wirklichkeit dieser Read-Buffer ausgelesen - das eigentliche Schieberegister kannst Du gar nicht (zurück-) lesen.
Wahrscheinlicher ist (meiner Meinung nach) eher, daß der Master (ohne Pause) den Transfer des zweiten Bytes bereits angestoßen hat, bevor der Slave das entsprechende Byte in sein SPDR legen konnte. Dort befand sich also bei Transfer-Begin noch das, vom Master empfangene Byte, welches jetzt zurück getaktet wird. Kannst ja testweise mal MISO unterbrechen, und beim Master fest auf Vcc oder Gnd legen - dann solltest Du immer 0xFF oder 0x00 empfangen, ega was Du sendest...
Aber das ist nur meine Vermutung (als nicht-studierter Hobby-Mikrocontroller-Amateur)...