// JESTEM MASTEREM
//
// Działanie wyprowadzeń w trybie nadrzędnym
//----------------------------------------------
// Wyprowadzenie | Kierunek |
//----------------------------------------------
// MOSI | user defined |
// MISO | WEJÅšCIE |
// SCK | user defined |
// !SS | user defined |
//----------------------------------------------
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/delay.h>
//....................................definicje..................................
#define SW_0 0x01
#define DD_MOSI 5
#define DD_MISO 6
#define DD_SS 4
#define DD_SCK 7
volatile unsigned char zmienna=0x55;
volatile unsigned char i;
//................................wektor obsługi przerwania od SPI......................
ISR(SPI_STC_vect)
{
PORTC=SPDR;
zmienna=SPDR;
PORTB |= (1<<DD_SS);
}
ISR (TIMER0_OVF_vect)
{
i++;
sei();
if(i>4
{
i=0;
}
}
//..............................inicjalizacja trybu master.........................
void SPI_MasterInit(void)
{
cli();
PORTB=0xFF;
DDRB=((1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS));
SPCR=((1<<SPE)|(1<<MSTR)|(1<<SPIE)|(1<<SPR0));
sei();
}
void reg_init(void)
{
cli();
TIMSK=(1<<TOIE0);
TCCR0 |=((1<<CS02)|(1<<CS00));
sei();
}
//...........................petla main............................................
void main (void)
{
PORTA= 0xFF;
DDRA= 0x00;
PORTC= 0xFF;
DDRC= 0xFF;
reg_init();
SPI_MasterInit();
sei();
//.............................petla while(1)...........................................
while(1)
{
if(i==2)
{
if(zmienna==0x55)
{
PORTB &=~(1<<DD_SS);
SPDR=0xAA;
}
if(zmienna==0xAA)
{
PORTB &=~(1<<DD_SS);
SPDR=0x55;
while(!(SPSR & (1<<SPIF)));
}
}
}
}
// JESTEM SLAVEM
//
// Działanie wyprowadzeń w trybie podrzędnym
//----------------------------------------------
// Wyprowadzenie | Kierunek |
//----------------------------------------------
// MOSI | INPUT |
// MISO | User defined|
// SCK | INPUT |
// !SS | INPUT |
//----------------------------------------------
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/delay.h>
#define DD_MOSI 5
#define DD_MISO 6
#define DD_SS 4
#define DD_SCK 7
volatile int zm=0xAA;
//makro obsługi przerwania od SPI
ISR(SPI_STC_vect)
{
PORTC=SPDR;
zm=SPDR;
if(zm==0x55)
{
SPDR=0xAA;
}
else if(zm==0xAA)
{
SPDR=0x55;
}
}
char SPI_SlaveReceive(void)
{
return SPDR;
}
void main (void)
{
PORTA=0xFF;
DDRA=0x00;
PORTC=0xFF;
DDRC=0xFF
PORTB=0xFF
DDRB=(1<<DD_MISO);
SPCR=((1<<SPE)|(1<<SPIE));
SPDR=zm;
sei();
while(1)
{
SPI_SlaveReceive();
}
}