logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMEGA8][C] SPI Slave - odbiór bajtu.

mgradzki 11 Sie 2008 21:59 2378 2
REKLAMA
  • #1 5430568
    mgradzki
    Poziom 16  
    Witam

    Chcę połączyć dwa procki po SPI i o ile wiem co zrobić z masterem, to nie mogę nigdzie znaleźć w jaki sposób slave powinien odebrać bajt.

    Po zainicjowaniu mastera (którym jest ATMEGA32) wysyłam w taki sposób (kiedyś tak nadawałem do przetwornika AC):
    
    void SPI_send(void)
      {
       PORTB &=~_BV(4);
       SPDR = byte_to_send;
       while(!(SPSR & (1<<SPIF))); //Wait
       PORTB |=_BV(4);
      }
    


    Problemem jest odbiór przez Slavea - nie mogę ustalić (to, co jest w datasheecie jest dla mnie mało jasne), czy przerwanie SPI Serial Transfer Complete jest generowane w Slavie, czy można się nim jakoś posłużyć, czy trzeba jakoś inaczej, np w pętli sprawdzać stan SS i reagować na niego.
    LEDy, które podłączam do portu SPI Slavea migają, więc SCK i MOSI jest elektrycznie dołączone do procesora.
    Jeśli ktoś miał z tym do czynienia to prosiłbym o kilka linijek kodu.

    Dzięki, pozdrawiam.

    Dodano po 2 [godziny] 52 [minuty]:

    Testuję coś takiego:

    
    void SPI_SlaveInit(void)
    {
    /* Set MISO output, all others input */
    DDRB=0X00;
    DDRB|=_BV(4);
    /* Enable SPI */
    SPCR = (1<<SPE);
    SPCR = (1<<SPIE);
    }
    
    SIGNAL(SIG_SPI)
    {
    PORTD=0xff;
    }
    

    ale nie działa. PORTD jest jako wyjście, przerwania są uaktywnione.
  • REKLAMA
  • #2 5458679
    rfhzcx
    Poziom 14  
    O ile sobie dobrze przypominam należy jeszcze identyfikować niestety programowo stan SS.
    Co więcej używałem takiej komunikacji pomiędzy ATMega32(master) i ATTiny(slave) nie było tego problemu - ATTiny robił to samodzielnie
    Pozdro
    KA
  • #3 5458821
    zerpo
    Poziom 22  
    rfhzcx napisał:
    O ile sobie dobrze przypominam należy jeszcze identyfikować niestety programowo stan SS.
    Co więcej używałem takiej komunikacji pomiędzy ATMega32(master) i ATTiny(slave) nie było tego problemu - ATTiny robił to samodzielnie
    Pozdro
    KA

    Nie, nie trzeba. W slave'ie wywoływane jest przerwanie, gdy odebrany zostanie bajt (ściślej mówiąc odebrany i wysłany, bo wymiana danych następuje jednocześnie w dwie strony). Gdyby była konieczna programowa kontrola SS, to dlaczego procesor ma do tego celu specjalnie przeznaczony pin, skoro każdy mógłby pełnić jego rolę? ;)

    W programie kolegi mgradzki jest przynajmniej jeden błąd:
    /* Enable SPI */ 
    SPCR = (1<<SPE); 
    SPCR = (1<<SPIE);

    Zauważmy, że w pierwszej linijce (nie licząc komentarza) włączany jest SPI, w drugiej natomiast przerwanie, ale jednocześnie wyłączany jest SPI. Powinno być:
    /* Enable SPI */ 
    SPCR = (1<<SPE); 
    SPCR |= (1<<SPIE);

    lub od razu:
    /* Enable SPI */ 
    SPCR = (1<<SPE) | (1<<SPIE); 


    Poza tym nie wiem, czy nie ma jeszcze jakiś uchybień. Testować i dociekać, na pewno będzie działać.
REKLAMA