Forum: Mikrocontroller und Digitale Elektronik AVR SPI: Will nicht auf SPIF warten


von Dicker Liebhaber (Gast)


Lesenswert?

Hallo,

üblicherweise schiebt mal Daten via SPI ja so raus:

void SPI_MasterTransmit(char cData)
{
SPDR = cData;                      /* Start transmission */
while(!(SPSR & (1<<SPIF)))         /* Wait for transmission complete */
;
//mehr Code
nop();
nop();
nop();
nop();
nop();
nop();
nop();
PORTA|=(1<<PA1);

}

Ich habe jetzt den Fall, dass ich nicht bis zum Ende der Übertragung
(SPIF==1) warten möchte, sondern schon z.B nach der 3ten SPI-CLK Flanke 
einen beliebigen PORT-Ausgang (nicht SPI-PORT) setzen möchte.

Meine Idee:
Da das SPI-Modul mit f_clk/2 taktet, lasse ich die Anweisung while(...)
einfach weg und warte während der Übertragung einfach 6 NOPs ab und 
setzte dann meinen PORT.

Leider tauchen dabei dann Fehler auf, wenn while(!(SPSR & (1<<SPIF))) 
"ausgelassen" wird und währenddessen genoppt und Ports gesetzt werden.

Das äußert sich so, dass SPI CLK und MOSI plötzlich "stoppen"
und clk nun permanent auf high bleibt.

Beeinflusst das PORTsetzen etwa die SPI-Übertragung? Kann mmn nicht 
sein.

Was ist da los?

von Floh (Gast)


Lesenswert?

Dicker Liebhaber schrieb:
> Beeinflusst das PORTsetzen etwa die SPI-Übertragung? Kann mmn nicht
> sein.

Eigentlich nicht. Eher wahrscheinlich ist, dass du die Funktion ja 
mehrmals aufrufen wirst und so in eine noch nicht vollständig 
Übertragung reinpfuscht.
Zeig mal den kompletten Code her.

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.