SPI ¾z opisów

// 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();

}

}


Wyszukiwarka