Hallo KonZ!

Die beiden ersten Anweisungen in der Funktion "spi_init(void)" schreiben in das gleiche Register. Damit machst du zuerst MOSI und SCK zu Ausgängen und anschliessend überschreibst du DDRB wieder, und in PORTB ist nur noch CS ein Ausgang...

Wieso schreibst du nicht einfach
"DDRB = (1<<SCK) | (1<<MOSI) | (1<<CS);" ?

Gruß, Claus