Forum: Mikrocontroller und Digitale Elektronik At90CAN128 Probleme mit SPI bit SPIF


von Alex (Gast)


Lesenswert?

Hallo community!

ich bin gerade relativ verzweifelt.
Ich versuche mit einem externen gerät per SPI zu kommunizieren.

Hier die Initialisierung:
1
SPCR = (1<<SPE) | (1<<MSTR) | (1<<CPOL) | (1<<CPHA);
2
SPCR &= ~(1<<DORD);  // MSBit first
3
SPSR |= (1<<SPI2X);  // Clock/2 is taktrate für SPI (4MHz)
4
DDRB = (1<<0) | (1<<1) | (1<<2);  //SPI PINS

und hier der sende-/empfangs-code
1
for(int c = 0;c<iLength;c++)
2
   {
3
     SPDR = ((uint8_t*)pxSendDataBuffer)[c];
4
     while(!(SPSR & (1<<SPIF)) && ((PINE & (1<<PINE7)) != 0));
5
     ((uint8_t*)pxReceiveDataBuffer)[c] = SPDR;
6
     
7
   }
So. nun bleibt die schleife bei dem while() stecken und bewegt sich 
nicht.
Die überpfüfung von PINE habe ich nachträglich dazugefügt um das gerät 
ordnungsgemäß herunterfahren zu können.

De facto wird SPIF im SPSR nie gesetzt nachdem SPDR geschrieben wurde.

Auch habe ich durch den debugger rausgefunden, dass SPIF bereits VOR dem 
ersten schreiben in SPDR gesetzt ist! Allerdings wird es irgendwo 
zwischen SPDR und der While schleife gelöscht, sodass diese nie aufhört 
zu blockieren...

Wie kann das passieren? Dies ist die einzige funktion welches die SPDR 
register bedient. Und SPIF is read-only, kann also nicht vorher gesetzt 
werden. Natürlich kann ich das Flag dadurch auch nicht manuell 
löschen...

Ich hoffe jemand hat zumindest ne vermutung wo das herkommen kann...

von Jim M. (turboj)


Lesenswert?

Schau Dir im Debugger mal DDRB und SPCR an. Es gibt nur 2 Gründe warum 
SPI Master nicht tut: Es ist nicht enabled, oder SS ist input und low.

Alex schrieb:
> Auch habe ich durch den debugger rausgefunden, dass SPIF bereits VOR dem
> ersten schreiben in SPDR gesetzt ist! Allerdings wird es irgendwo
> zwischen SPDR und der While schleife gelöscht,

Es wird beim Schreiben des SPDR gelöscht, das ist IMHO normal wenn auch 
nicht unbedingt dokumentiert. Nach dem Aussenden des Bytes sollte SPIF 
wieder High werden, bis SPSR und SPDR gelesen wurden.

von Falk B. (falk)


Lesenswert?

Der Klassiker. Ist das SS-Pin als AUSGANG definiert? Siehe Datenblatt, 
"SS-Pin Functionality".

von Alex (Gast)


Lesenswert?

Habe gerade den Fehler gefunden...
Die SPI-Init und die definition der DDRs gehört vertauscht!

Ansonsten geht die MCU in den Slave modus und setzt als Folge das 
SPIF...

Danke für die Hinweise!

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.