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


von Matten (Gast)


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

von ... (Gast)


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.

von Matten (Gast)


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

von Matten (Gast)


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

von ... (Gast)


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).

von Matten (Gast)


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?

von ... (Gast)


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

von Philipp B. (philipp_burch)


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.

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.