===================================================== SPCR=0b01010000; // Регистр управления // 0... .... SPIE разрешение прерывания... // .1.. .... SPE разрешается работа SPI. // ..0. .... DORD порядок сдвига данных DORD=0 первым передается старший разряд. // ...1 .... MSTR (1-мастер, 0-подчиненный). // .... 0... CPOL 0 = SCK имеет низкий уровень в состоянии ожидания. (полярность синхро). // .... .0.. CPHA 0 = установка-задний фронт/выборка передий фронт SCK (фаза синхро). // .... ..00 SPR1, SPR0 SCK = кварц 4 Мгц/4 = 1 МГц (частота синхро). // .... ..00 SPR1, SPR0 f/4 // .... ..01 SPR1, SPR0 f/16 // .... ..10 SPR1, SPR0 f/64 // .... ..11 SPR1, SPR0 f/128 SPSR=0b10000000; // Регистр статуса // 1... .... Флаг SPIF завершении последовательной передачи. Сбрасывается при чтении SPDR . // .1.. .... Флаг повторной записи (устанавливается, если выполнена запись в регистр данных SPI (SPDR) во // время передачи данных). // .... ...1 SPI2X - удвоенная скорость передачи. SCK = кварц 4 Мгц/2 = 2 МГц (частота синхро). // (период SCK будет равен двум периодам синхронизации ЦПУ. // Если SPI работает как подчиненный, то работа SPI гарантирована только на частоте fosc /4 или менее. ======================================================== мастер char x; char x1; char x2; char bufer[8]={0,0,0,0,0,0,0,0}; ////////////////////////////////////////////// SPI аппаратный DDRB.5=1; // SCK PORTB.5=1; // SCK (!) DDRB.4=0; // MISO PORTB.4=0; // MISO DDRB.3=1; // MOSI PORTB.3=0; // MOSI DDRB.2=1; // SS PORTB.2=1; // SS //////////////////////////////////// Master > Slave PORTB.2=0; // SS SPCR=0x50; // 4 МГц/4 = 1 МГц -мастер SPDR=0b00000000; while(!(SPSR & (1<<7))); // PORTB.2=1; // SS SPCR=0x00; // 4 МГц/4 = 1 МГц -мастер ///////////////////// x=SPDR; /////////////////////////////////////////////////// //////////////////////////////////// Slave > Master if (x==0x10) { x2=0; for (x1=1; x1<8; x1++) { ///////////////////// PORTB.2=0; // SS SPCR=0x50; // 4 МГц/4 = 1 МГц -мастер SPDR=x1; while(!(SPSR & (1<<7))); // мастер PORTB.2=1; // SS SPCR=0x00; // 4 МГц/4 = 1 МГц -мастер ///////////////////// bufer[x2]=SPDR; x2++; }; ///////////////////// PORTB.2=0; // SS SPCR=0x50; // 4 МГц/4 = 1 МГц -мастер SPDR=0b00000000; while(!(SPSR & (1<<7))); // PORTB.2=1; // SS SPCR=0x00; // 4 МГц/4 = 1 МГц -мастер ///////////////////// bufer[x2]=SPDR; }; ////////////////////////////////////////////////// ======================================================== слейв char x; char bufer[8]={0x00,0x11,0x12,0x13,0x14,0x15,0x16,0x17}; /* // SPI interrupt service routine interrupt [SPI_STC] void spi_isr(void) { PORTB.0=1; // контроль x=SPDR; SPDR=bufer[x]; //while(!(SPSR & (1<<7))); // PORTD=x; PORTB.0=0; // контроль } */ ////////////////////////////////////////////// SPI аппаратный DDRB.5=0; // SCK PORTB.5=0; // SCK DDRB.4=1; // MISO PORTB.4=0; // MISO DDRB.3=0; // MOSI PORTB.3=0; // MOSI DDRB.2=0; // SS PORTB.2=0; // SS ////////////////////////////////////////////// SPCR=0x40; // 4 МГц/4 = 1.000.000 Hz -слейв // Global enable interrupts //#asm("sei") ////////////////////////////////////////////// /////////////////////////////////////////////// while(!(SPSR & (1<<7))); //слейв x=SPDR; SPDR=bufer[x]; ////////////////////////////////////////////// ========================================================