Witam, mam problem z komunikacją SPI na Atmega8. Zrobiłem chyba wszystko jak należy, ale dalej nie działa. Poniżej zamieszczam kody dla Mastera i Slavea.
======= M A S T E R =========
============ S L A V E ==============
Do Slavea mam podłączoną diodę, która informuje mnie w jakim stanie się znajdujemy. Efektem jest jej ciągłe szybkie miganie, czyli tak jakby czekała na odebranie danych. Co może być nie tak? Może ktoś ma gotowy program który obsługuje transmisję SPI i działa, czyli taki sprawdzony?
======= M A S T E R =========
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#define DD_MOSI PINB3
#define DD_SCK PINB5
#define DD_MISO PINB4
#define DDR_SPI PORTB
void SPI_MasterInit(void)
{
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
SPDR = cData;
while(!(SPSR & (1<<SPIF)))
{
}
}
int main()
{
char litera='a';
DDRD=0x40; //PIND6 podlutowany jest do PINB2, czyli SS Slave'a
SPI_MasterInit();
PORTD=0x00; //wysłanie 0 na SS i rozpoczęcie transmisji
SPI_MasterTransmit(litera);
PORTD=0x40; //zakończenie transmisji czyli wysłanie 1
}
============ S L A V E ==============
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#define DD_MOSI PINB3
#define DD_SCK PINB5
#define DD_MISO PINB4
#define DD_SS PINB2
#define DDR_SPI PORTB
void wait(int i) //pętla spowalniająca
{
int k, j;
for (k=0;k<i;k++) { for (j=0; j < 10;j++);}
}
void SPI_SlaveInit(void)
{
DDR_SPI=(1<<DD_MISO);
SPCR=(1<<SPE);
}
char SPI_SlaveReceive(void)
{
while (!(SPSR & (1<<SPIF))) //dopóki nie odbierze danych to dioda miga szybko
{
PORTD=0x00;
wait(400);
PORTD=0x80;
wait(400);
}
return SPDR;
}
int main()
{
char dane;
DDRD=0x80; //dioda podpięta do PD7
SPI_SlaveInit();
dane=SPI_SlaveReceive();
if(dane=='a')
{
while(1) { PORTD=0x80;} //jeżeli odbierze dane to dioda ma się świecić
}
else
{
while(1) //jeżeli odbierze dane, które się nie zgadzają
//z wysyłanymi to dioda miga wolno
{
PORTD=0x00;
wait(2000);
PORTD=0x80;
wait(2000);
}
}
}
Do Slavea mam podłączoną diodę, która informuje mnie w jakim stanie się znajdujemy. Efektem jest jej ciągłe szybkie miganie, czyli tak jakby czekała na odebranie danych. Co może być nie tak? Może ktoś ma gotowy program który obsługuje transmisję SPI i działa, czyli taki sprawdzony?