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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.