Поскольку мне часто нужны функции для настройки SPI, то я их сделал тут. Пока что работает на одной скорости - на скорости 125 кГц, для 16 мГц основной частоты.
1// Настроить 3=MOSI, 2=SS, 5=SCK на OUTPUT; 4=MISO на INPUT; Установка SCLK=0
2void SPI_init() {
3
4    //         SS       MOSI     SCK
5    DDRB  |=  (1<<2) | (1<<3) | (1<<5);  // 2,3,5 OUTPUT
6    DDRB  &= ~(1<<4);                    // 4     INPUT
7    PORTB &= ~(1<<5);                    // SCLK  = 0
8    PORTB |=  (1<<2);                    // SS    = 1
9
10    // Включить SPI, Master, clock rate f_osc/128 (125 kHz), double_speed = 0
11    SPCR  =  (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0);
12    SPSR &= ~(1 << SPI2X);
13}
14
15// Общая функция трансмиттинга
16unsigned char SPI_transmit(unsigned char data) {
17
18    SPDR = data;
19    while (!(SPSR & (1 << SPIF)));
20    return SPDR;
21}
22
23// Ввод-вывод на SPI
24void SPI_put(unsigned char data) {        SPI_transmit(data); }
25unsigned char SPI_get()          { return SPI_transmit(0xFF); }
26
27// sig: 0=LOW, 1=HIGH
28void SPI_ce(char sig) {
29
30    if (sig) PORTB |=  (1<<2); // HIGH
31        else PORTB &= ~(1<<2); // LOW
32}