Hallo, ich habe das gleiche Problem - bei mir hängt wird ebenfalls auf
SPIF gewartet und es geht nicht weiter.
Ich initialisiere als Master:
1 | void SPI_InitMaster()
|
2 | {
|
3 | SPI_DDR |= (1<<SPI_MOSI) | (1<<SPI_SCK) | (1<<SPI_SS); // outputs
|
4 | SPI_DDR &= ~(1<<SPI_MISO); // input
|
5 | SPI_PORT |= (1<<SPI_MISO); // pull-up
|
6 |
|
7 | SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPIE); // enable SPI, Master mode, enable Interrupt
|
8 | SPCR = (1<<SPR0 | 1<<SPR1); // set clock rate /128
|
9 | }
|
Danach wird ein byte gesendet:
1 | void SPI_MasterTransmit(uint8_t byte)
|
2 | {
|
3 | SPDR = byte;
|
4 | while( !(SPSR & (1<<SPIF)) ); // wait until transmission complete
|
5 | }
|
Wenn ich das richtig verstehe, wird SPIF gesetzt, nachdem das byte durch
das Schieberegister durch ist, es muss also nichtmal ein zweites Gerät
angeschlossen sein, oder? Man empfängt im Gegenzug praktisch 0x00...
Also Kontroller wird bei mir vor Ausführung des Befehls eine LED
ausgeschaltet und nach dem Befehl danach wieder eingeschaltet. Sie geht
aus, aber nicht wieder an, entprechend wird es an der Schleife liegen.
Slave Select wird in der Initialisierung als Output gesetzt, das löst
das Problem leider nicht.
Vielen Dank schonmal!