nach SPI übertragung SPIF immer löschen?

Gast #1241053
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
Gast #1241077
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
Gast #1241082
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
Gast #1241085
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).
Gast #1241098
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?
#1241189
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren