#define F_CPU 16000000UL
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include <stdint.h>

void inicializace()
{
  //SPI0 jako master:
  DDRB = (1 << 2) | (1 << 3) | (1 << 5); //SS0, MOSI0, SCK0
  PORTB = PORTB | (1 << 2); //SS0 = 1
  SPCR0 = (1 << SPE) | (1 << MSTR);
  //SPI1 jako slave:
  DDRC = (1 << 0); //MISO1
  SPCR1 = (1 << SPE); 
}

inline void setbit(volatile uint8_t &reg, uint8_t bit)
{
  reg = reg | (1 << bit);
}

inline void clearbit(volatile uint8_t &reg, uint8_t bit)
{
  reg = reg & ~(1 << bit);
}

inline uint8_t getbit(volatile uint8_t reg, uint8_t bit)
{
  return (reg & (1 << bit)) >> bit;
}

volatile uint8_t& PORTSS = PORTB;
const uint8_t SS = 2;  //PB2 je /SS

int main(void)
{
  uint8_t zapisovano0 = 0, zapisovano1 = 255;
  uint8_t precteno0, precteno1;
  
  inicializace();
  printf("test SPI0 master, SPI1 slave\n");
  
  while (1)
  {
    //SS = 0, tedy vybere SPI1 jako slave:
    clearbit(PORTSS, SS); 
    //ulozeni dat pro zapis:
    SPDR1 = zapisovano1;
    SPDR0 = zapisovano0;
    //ceka na odvysilani SPI0:
    while(!getbit(SPSR0, SPIF));
    //SS = 1, SPI1 deaktivovan:   
    setbit(PORTSS, SS); 
    //ceka na odvysilani SPI1:
    while(!getbit(SPSR1, SPIF));
    
    //vypocet novych dat pro odeslani:
    zapisovano0++;
    zapisovano1--;
    
    //nacteni prijatych dat:
    precteno0 = SPDR0;
    precteno1 = SPDR1;
    
    //kontrolni vypis:
    printf("%3d, %3d ", precteno0, precteno1);
    if(precteno0 + precteno1 == 255)
      printf("O.K.\n");
    else
      printf("chyba \n");
    _delay_ms(500);
  }
}

