Поскольку мне часто нужны функции для настройки SPI, то я их сделал тут. Пока что работает на одной скорости - на скорости 125 кГц, для 16 мГц основной частоты.
void SPI_init() {
DDRB |= (1<<2) | (1<<3) | (1<<5);
DDRB &= ~(1<<4);
PORTB &= ~(1<<5);
PORTB |= (1<<2);
SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0);
SPSR &= ~(1 << SPI2X);
}
unsigned char SPI_transmit(unsigned char data) {
SPDR = data;
while (!(SPSR & (1 << SPIF)));
return SPDR;
}
void SPI_put(unsigned char data) { SPI_transmit(data); }
unsigned char SPI_get() { return SPI_transmit(0xFF); }
void SPI_ce(char sig) {
if (sig) PORTB |= (1<<2);
else PORTB &= ~(1<<2);
}