At90CAN128 Probleme mit SPI bit SPIF

Gast #4452990
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...
#4453132
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.

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