Forum: Compiler & IDEs SPI ohne zu warten bis Byte fertig ist


von Matthias (Gast)


Lesenswert?

SPI Ausgabe klappt so:

SPDR = daten_char;  // Schreiben Datenbyte
while (!(SPSR & (1<<SPIF)));

Da die Ausgabe durch einen relativ langsamen SPI-Baustein viel Zeit in 
Anspruch nimmt, würde ich gern nicht auf das Ende der Ausgabe warten, 
sondern erst wieder prüfen, wenn das nächste Byte gesendet werden soll.

Geht das? Die while Abfrage vor SPDR = ... zu machen klappt nicht.

von Matthias (Gast)


Lesenswert?

µC: Atmega 644

von ich (Gast)


Lesenswert?

>Geht das? Die while Abfrage vor SPDR = ... zu machen klappt nicht.

Ich sehe keinen Grund warum das nicht funktionieren sollte.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn es sehr langsam ist, kannst du auch über interruptgesteuertes
SPI nachdenken.

von Fabian B. (fabs)


Lesenswert?

Setze einen Interrupt auf "SPDR ist leer" und lade in diesem das SPDR 
neu. Schon kannste während des Sendens andere Dinge tun.

Gruß
Fabian

von Jörg G. (joergderxte)


Lesenswert?

>>Geht das? Die while Abfrage vor SPDR = ... zu machen klappt nicht.
>Ich sehe keinen Grund warum das nicht funktionieren sollte.
Es geht wahrscheinlich beim ersten Mal nicht - das SPIF ist nach dem 
Reset nicht gesetzt. Das Flag bedeutet ja 'Übertragung beendet' und 
nicht 'SPI ist bereit', im Gegensatz zu USART oder TWI.

@OP: sonst dreh eben die Abfrage um - wenn das Flag nicht gesetzt ist 
soll die main() noch was anderes machen.

hth, Jörg

von Matthias L. (Gast)


Lesenswert?

>Es geht wahrscheinlich beim ersten Mal nicht

Genau das stimmt. Das Einschalten des Interrupts reicht (im Gegenteil zu 
UART) nicht aus. Ich nutze dazu immer ein Dummy-Send.

Also SPI-Initialisieren, Interrupt zuschalten und dann SPDR=0x00 oder 
sowas schreiben.

Ab dann funktioniert der Interrupt bestens.

von Peter D. (peda)


Lesenswert?

Die meisten ICs brauchen allerdings nach dem Schieben eine 0->1-Flanke 
auf dem /CS-Signal, um die Daten zu übernehmen.
Dazu muß man doch auf das Ende warten.


Peter

von Matthias (Gast)


Lesenswert?

Das Problem war das CS-Signal nach dem SPI-senden. Es ist doch besser, 
immer das komplette Byte anzuwarten. Ich lasse es nun so.

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.