mikrocontroller.net

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


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
µC: Atmega 644

Autor: ich (Gast)
Datum:

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

Ich sehe keinen Grund warum das nicht funktionieren sollte.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es sehr langsam ist, kannst du auch über interruptgesteuertes
SPI nachdenken.

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.