Пытаюсь реализовать SPI для attiny, пока что тестирую на mega8. Код нашел на форуме, говорят вроде что раотает, тогда что не так?
Вот код мастера
Вот код для двух ведомых, тут все работает, можно и не смотреть
Раздел: AVR
Вот код мастера
#include <mega8.h>
#include <delay.h>
#define MOSI PORTB.3
#define MISO PINB.4
#define SCK PORTB.5
unsigned char spi(unsigned char data) {
unsigned char miso = 0;
unsigned char mask = 0x01; // если надо начинать со старшего бита - заменить на 0x80
for(; mask; mask <<= 1) { // если надо начинать со старшего бита - заменить на mask >>= 1;
MOSI = (data & mask) ? 0 : 1;
SCK = 1;
if(MISO) miso |= mask;
SCK = 0;
}
return miso;
}
void main(void) {
// Настройка SPI
DDRB.3 = 1;
DDRB.4 = 0;
DDRB.5 = 1;
// Порты выбора ведомого
DDRB.2 = 1;
DDRB.1 = 1;
// Поочередная посылка байта двум ведомым
// Можно пропустить и не вникать
while(1) {
PORTB.2 = 0;
spi('1');
delay_ms(1000);
spi('0');
delay_ms(1000);
PORTB.2 = 1;
PORTB.1 = 0;
spi('1');
delay_ms(1000);
spi('0');
delay_ms(1000);
PORTB.1 = 1;
}
}
Вот код для двух ведомых, тут все работает, можно и не смотреть
#include <mega8.h>
interrupt[SPI_STC] void spi_isr(void) {
unsigned char data;
data = SPDR; // Читаем приходящие байты
// Если пришла 1, включить светодиод
if(data == '1') { PORTD = 0xFF; }
// Если пришел 0, выключить светодиод
if(data == '0'){ PORTD = 0x00; }
}
void main(void) {
PORTB = 0x00;
DDRB = 0x10;
PORTD = 0x00;
DDRD = 0xFF;
// SPI initialization
// SPI Type: Slave
// SPI Clock Rate: 125,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
SPCR = 0xC2;
SPSR = 0x00;
// Clear the SPI interrupt flag
#asm
in r30, spsr
in r30, spdr
#endasm
#asm("sei")
while(1);
}
Раздел: AVR