AVR SPI Slave problem

Karel Minarčík karel.minarcik na gmail.com
Pondělí Únor 28 10:37:05 CET 2011


Ne, psal jsem v prvnim prispevku:
Testoval jsem ten prenos kdyz byly veskere ostatni preruseni zakazane, zadny
program krome nekonecne smycky se nevykonaval, nic jineho to zpozdit nemuze.
KM

2011/2/28 Tomas Chvatal <tchvatal na ezop.cz>

>  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 přáním hezkého dne / Best regards
> Tomáš Chvátal
> EZOP Praha s.r.o.
> tel./fax.: 257320853
> www.ezop.cz
> tchvatal na ezop.cz
>
> ----- Původní zpráva -----
> *Od:* Karel Minarčík <karel.minarcik na gmail.com>
> *Komu:* HW-news <hw-list na list.hw.cz>
> *Odesláno:* 28. února 2011 10:05
> *Předmět:* 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
>
>
> _______________________________________________
> 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/786c9745/attachment-0001.htm>


Další informace o konferenci Hw-list