#define BV(bit) (1<<(bit))
void spiInit(void)
{
PORTB|=BV(PB1)|BV(PB2)|BV(PB0)|BV(PB3);//|BV(PB4); //SCK, MOSI, #SS - 1
DDRB|=BV(PB1)|BV(PB2)|BV(PB0);//|BV(PB4); //SCK, MOSI, #SS - выход
DDRB&=~BV(PB3);//|BV(PB0)); //MISO - вход
//SPIE = 0 - работа без прерываний
//SPE = 1 - интерфейс включить
//DORD = 0 - передача старшего бита сначала
//MSTR = 1 - режим "мастер"
//CPOL = 1, CPHA = 1 spi mode 3
//SPR1 =0, SPR0 = 1 Fclk = fosc/4
SPCR|=BV(SPE)|BV(MSTR);//BV(CPOL)|BV(CPHA);
//SPSR|=BV(SPI2X); //Удвоенная скорость работы
//!!!Если кварц больше 10 МГц - скорость нужно снижать
//DDRB|=(1<<PB0);
//PORTB|=(1<<PB0);
}
//Помещает аргумент в регистр приема-передачи, ждет окончание передачи
//возвращает содержимое регистра приема-передачи
char spiRollByte(const char byte)
{
u08 t = SPSR;
t = SPDR;
SPDR = byte;
while(!(SPSR & (1<<SPIF)));
f3++;
return SPDR;
}
void main()
{
------------------
spiInit();
------------------
while(1)
{
------------------
spiRollByte(0x55);
------------------
}
}
В майне срабатывает несколько сот раз и виснет намертво