Was du uns allerdings verschweigst ist, welchen Modus du bei spi_init()
nun eigentlich wählst.
Ehrlich: ich würde den ganzen Firlefanz da weglassen:
1 | static void spi_init(void) {
|
2 |
|
3 | SPI_DDR &= ~(1 << SPI_MISO);
|
4 | SPI_DDR |= (1 << SPI_SCK);
|
5 | SPI_DDR |= (1 << SPI_MOSI);
|
6 | SPI_DDR |= (1 << SPI_CS);
|
7 |
|
8 | SPCR = _BV(SPE) | _BV(MSTR);
|
9 |
|
10 | //SPSR = (1<<SPI2X); //Double the SPI Speed.
|
11 | }
|
Laut Datenblatt arbeitet das Teil (wie die meisten SPI-Geräte) im Modus
0, da brauchst das ganze CPHA- und CPOL-Gewusel nicht. SPI mit
Interrupt braucht man auch nur bei schweinelangsamen Slaves. Bei all
denen, die mit ein paar MHz SPI-Takt arbeiten (und du hast ja SPI2X
sogar in Erwägung gezogen), ist der Betrieb mit Interrupt langsamer
als das Polling.