Witam,
Chce skomunikować ze sobą dwie Atmegi32 po sprzętowym SPI, ale jakoś nie chcą ze sobą gadać tak jak ja bym chciał... Z przesłaniem i odbiorem jednego bajtu nie mam problemu, ale chce przesyłać do slave'a 2 bajty albo i więcej (tylko jak je tam odebrać?). Wydaję mi się że jest problem z odbiorem tych 2 bajtów u slave'a. Poniżej kod dla mastera:
Konfiguracja mastera:
Przesłanie dwóch bajtów przez mastera:
Kod dla slave'a
Konfiguracja slave'a:
Odbieranie 2 bajtów przez slave'a:
Dwa bajty odbierane są losowo i tylko przypadkiem zdarza się że otrzymywana jest odpowiednia wartość. W funkcji odbierz() zwracałem sobie również dla sprawdzenia zmienna odb2 i wyrzucałem na wyświetlacz, i wychodziło na to że jest ona losowym złożeniem bitów dwóch bajtów, tak jak gdyby brakowało synchronizacji. Czy można zrealizować przesył kilku bajtów przy użyciu zwykłych funkcji czy może trzeba użyć przerwań? Proszę o jakieś wskazówki, może ktoś miał podobny problem i udało mu się go rozwiązać. Z góry dziękuje za pomoc.
Chce skomunikować ze sobą dwie Atmegi32 po sprzętowym SPI, ale jakoś nie chcą ze sobą gadać tak jak ja bym chciał... Z przesłaniem i odbiorem jednego bajtu nie mam problemu, ale chce przesyłać do slave'a 2 bajty albo i więcej (tylko jak je tam odebrać?). Wydaję mi się że jest problem z odbiorem tych 2 bajtów u slave'a. Poniżej kod dla mastera:
Konfiguracja mastera:
void inicSPImaster(void)
{
DDRB |= 1<<MOSI | 1<<SCK | 1<<SS;
HIG_SS;
SPCR |= 1<<SPE | 1<<MSTR | 1<<SPR0; // włączone SPI, master, fsys/16, fsys = 1000000
}
Przesłanie dwóch bajtów przez mastera:
void dwaBajtySPI(uint8_t dane1, uint8_t dane2)
{
LOW_SS;
SPDR = dane1;
while(!(SPSR & (1<<SPIF)));
SPDR = dane2;
while(!(SPSR & (1<<SPIF)));
HIG_SS;
}
Kod dla slave'a
Konfiguracja slave'a:
void inicSPIslave(void) //tryb podrzedny
{
DDRB = 1<<MISO;
SPCR = 1<<SPE; // wł. SPI
}
Odbieranie 2 bajtów przez slave'a:
uint8_t bajtSPIslave(void) // odebranie bajtu
{
while(!(SPSR & (1<<SPIF)));
return SPDR;
}
uint16_t odbierz(void) // odebranie 2 bajtow
{
uint16_t odb1, odb2;
odb1 = bajtSPIslave();
odb2 = bajtSPIslave();
odb1 = (odb1<<8) | (odb2);
return odb1;
}
Dwa bajty odbierane są losowo i tylko przypadkiem zdarza się że otrzymywana jest odpowiednia wartość. W funkcji odbierz() zwracałem sobie również dla sprawdzenia zmienna odb2 i wyrzucałem na wyświetlacz, i wychodziło na to że jest ona losowym złożeniem bitów dwóch bajtów, tak jak gdyby brakowało synchronizacji. Czy można zrealizować przesył kilku bajtów przy użyciu zwykłych funkcji czy może trzeba użyć przerwań? Proszę o jakieś wskazówki, może ktoś miał podobny problem i udało mu się go rozwiązać. Z góry dziękuje za pomoc.