Поскольку мне часто нужны функции для настройки SPI, то я их сделал тут. Пока что работает на одной скорости - на скорости 125 кГц, для 16 мГц основной частоты.
1
2void SPI_init() {
3
4
5 DDRB |= (1<<2) | (1<<3) | (1<<5);
6 DDRB &= ~(1<<4);
7 PORTB &= ~(1<<5);
8 PORTB |= (1<<2);
9
10
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
24void SPI_put(unsigned char data) { SPI_transmit(data); }
25unsigned char SPI_get() { return SPI_transmit(0xFF); }
26
27
28void SPI_ce(char sig) {
29
30 if (sig) PORTB |= (1<<2);
31 else PORTB &= ~(1<<2);
32}