AVR SPI Slave problem

Tomas Chvatal tchvatal na ezop.cz
Pondělí Únor 28 10:30:15 CET 2011


A nemate (treba jen nekdy) povolene preruseni i od jinych periferii ? Pokud je cpu v preruseni neceho jineho a prijde int. od /SS, tak
se preruseni od /SS obslouzi az po ukonceni aktualniho.

s práním hezkého dne / Best regards
Tomás Chvátal
EZOP Praha s.r.o.
tel./fax.: 257320853
www.ezop.cz
tchvatal na ezop.cz

  ----- Puvodní zpráva ----- 
  Od: Karel Minarcík 
  Komu: HW-news 
  Odesláno: 28. února 2011 10:05
  Predmet: Re: AVR SPI Slave problem


  Uplne cely program poslat nemuzu, jen znacne upraveny vytah:




  #define TLED_ON  PORTD |=  (0x80)
  #define TLED_OFF PORTD &= ~(0x80)




  void SPI_Slave_Init(void)
  {
      DDR_SPI2 = (1<<MISO2);
      SPI2_PORT = (1<<SCK2)|(1<<MOSI2)|(1<<CS2);
      SPCR = (1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA);
  }




  //Preruseni od SPI

  ISR(SPI_STC_vect)

  {

  uint8_t length = 10;

        uint8_t data;

        uint8_t a;  



  cli();

        SPCR = (0<<SPIE)|(1<<SPE)|(0<<MSTR)|(1<<CPOL)|(1<<CPHA);

        TLED_ON;

        SPDR = 0x02;

        do

        {

  #define delay 300

              for(a=0;a<delay;a++) if((SPSR&0x80))break;


              ...


              data = SPDR;

              SPDR = pole[data];


                          .....


  }while(--length);



        TLED_OFF;

        SPCR = (1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA);

        sei();

        return;

  }




  Ve smycce while je toho samozrejme vice, s problemem to ale nesouvisi. Nektere veci v kodu jsem pridaval a menil nahodne ze zoufalstvi, nic nepomohlo.
  To zpozdeni jsem zjistoval pomoci LA napichnuteho na SPI + jeden I/O pin AVR jako signalizace kdy jsem v preruseni.
  Problem se vyskytuje uplne nahodne, tj. treba mnohostokrat do preruseni skocim ihned po shozeni /SS, semtam az po prijeti jednoho byte.
  KM




  2011/2/28 Jan Waclawek <konfera na efton.sk>

    ----- Original Message ---------------
    >Uvnitr
    >preruseni zakazu globalni preruseni (cli)


    To je zbytocne, vyvolanim prerusenia sa automaticky dalsie prerusenia zakazu (procesor automaticky vynuluje flag I).

    >Zjistil jsem pomoci log. analyzeru ze v AVR se
    >vyvolalo preruseni pozde, az po prijmu prvniho byte a ne hned po shozeni
    >/SS.


    Ako presne ste to zistovali? Mozete poslat program?

    wek



    _______________________________________________
    HW-list mailing list  -  sponsored by www.HW.cz
    Hw-list na list.hw.cz
    http://list.hw.cz/mailman/listinfo/hw-list





------------------------------------------------------------------------------


  _______________________________________________
  HW-list mailing list  -  sponsored by www.HW.cz
  Hw-list na list.hw.cz
  http://list.hw.cz/mailman/listinfo/hw-list
------------- dal?í ?ást ---------------
HTML p?íloha byla odstran?na...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20110228/d8ebea64/attachment.htm>


Další informace o konferenci Hw-list