Поскольку мне часто нужны функции для настройки SPI, то я их сделал тут. Пока что работает на одной скорости - на скорости 125 кГц, для 16 мГц основной частоты.
// Настроить 3=MOSI, 2=SS, 5=SCK на OUTPUT; 4=MISO на INPUT; Установка SCLK=0
void SPI_init() {

    //         SS       MOSI     SCK
    DDRB  |=  (1<<2) | (1<<3) | (1<<5);  // 2,3,5 OUTPUT
    DDRB  &= ~(1<<4);                    // 4     INPUT
    PORTB &= ~(1<<5);                    // SCLK  = 0
    PORTB |=  (1<<2);                    // SS    = 1

    // Включить SPI, Master, clock rate f_osc/128 (125 kHz), double_speed = 0
    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;
}

// Ввод-вывод на SPI
void SPI_put(unsigned char data) {        SPI_transmit(data); }
unsigned char SPI_get()          { return SPI_transmit(0xFF); }

// sig: 0=LOW, 1=HIGH
void SPI_ce(char sig) {

    if (sig) PORTB |=  (1<<2); // HIGH
        else PORTB &= ~(1<<2); // LOW
}
29 июл, 2019
© 2007-2022 Права - это когда правый хук