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