mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik nach SPI übertragung SPIF immer löschen?


Autor: Matten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich möchte gerne Daten über die SPI-Schnittstelle in eine Kette 
von Schieberegistern schieben.

Hab auch alles schon soweit fertig. Nur jetzt frag ich mich, ob ich 
jedesmal nach dem Senden eines Bytes und warten auf das SPIF flag 
(Transmission complete) das SPIF-Flag wieder löschen muss (über auslesen 
von SPSR und zugriff auf SPDR). Ich arbeite ohne den SPI-Interrupt.

Im Datenblatt meines ATmega 32 steht, dass das SPIF-Flag Hardwaremäßig 
nur durch den Interrupt handling vector zurückgesetzt wird, oder halt 
über auslesen von SPSR und SPDR.

Reicht es nicht einfach nur ein neues Byte in das SPDR Register zu 
schreiben?

Vielen Dank für eure Antworten

Matthias

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ws sagt denn das Datenblatt ? Soweit ich mich erinnere, wird man das 
SPIF wieder los, indem man entweder ein neues byte in das SPDR 
reinschiebt, oder das SPIF aktiv loescht.

Autor: Matten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Originaltext Datenblatt:

• Bit 7 – SPIF: SPI Interrupt Flag
When a serial transfer is complete, the SPIF Flag is set. An interrupt 
is generated if SPIE in
SPCR is set and global interrupts are enabled. If SS is an input and is 
driven low when the SPI is
in Master mode, this will also set the SPIF Flag.

SPIF is cleared by hardware when executing the
corresponding interrupt handling vector. Alternatively, the SPIF bit is 
cleared by first reading the
SPI Status Register with SPIF set, then accessing the SPI Data Register 
(SPDR).

MfG Matthias

Autor: Matten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der App-Note zum SPI steht noch ein Flussdiagramm, wo das SPIF-Flag 
nur während der Initialisierung zurückgesetzt wird. Daneben ist ein 
Flußdiagramm für die Übertragung und da taucht das SPIF Flag gar nicht 
auf. Im Beispielcode für eine Übertragung wird auch nur mit einer 
While-Schleife gewartet, bis das Flag kommt. Vielleicht ist das ja schon 
das "auslesen" des SPSR-Registers, und durch das einschreiben eines 
neuen Bytes in SPDR wird auf SPDR "zugegriffen" so dass das SPIF-Flag 
gelöscht wird.

Who knows?

Hat jemand eine verlässliche Antwort / Praxiserfahrung?

Danke Matthias

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist denn damit ?

SPIF is cleared by hardware when executing the corresponding interrupt 
handling vector. Alternatively, the SPIF bit is cleared by first reading 
the
SPI Status Register with SPIF set, then accessing the SPI Data Register
(SPDR).

Autor: Matten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll damit sein, das hab ich gelesen, oben hab ich geschrieben: Ich 
benutze keine Interrupts. Da der vector nicht ausgelöst wird, wird das 
Flag auch nicht Hardwaremäßig zurückgesetzt. Punkt 1 fällt also weg. Die 
Frage ist, ob ich das SPSR Register EXTRA lesen und das SPDR Register 
EXTRA lesen/schrieben MUß, oder ob durch solch einen Code:

void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}

in der while-Schleife auf das SPSR-Register zugegriffen wird, und ich 
das nächste Byte sofort danach reinschreiben kann in SPDR.

Eigentlich ja oder? While fragt eigentlich die ganze Zeit das SPSR 
Register ab, und wird erst beendet wenn SPIF==1 ist, d.h. es wird auf 
SPSR zugegriffen NACHDEM SPIF==1 ist so wie im Handbuch gefordert. Durch 
schreiben eines Bytes in SPDR erfüllt man dann den zweiten Teil zum 
löschen des SPIF-Flags.

Oder mache ich einen Denkfehler?

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falls man keinen Interrupt hat :

Alternatively, the SPIF bit is cleared by first reading the
SPI Status Register with SPIF set, then accessing the SPI Data Register

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matten wrote:
> Eigentlich ja oder? While fragt eigentlich die ganze Zeit das SPSR
> Register ab, und wird erst beendet wenn SPIF==1 ist, d.h. es wird auf
> SPSR zugegriffen NACHDEM SPIF==1 ist so wie im Handbuch gefordert. Durch
> schreiben eines Bytes in SPDR erfüllt man dann den zweiten Teil zum
> löschen des SPIF-Flags.

Nö, passt. Wenn du das nächste Byte sendest, sprichst du SPDR an, womit 
SPIF gelöscht wird.

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.