AVR SPI Slave problem
Karel Minarčík
karel.minarcik na gmail.com
Pondělí Únor 28 10:05:52 CET 2011
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
>
------------- dal?í ?ást ---------------
HTML p?íloha byla odstran?na...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20110228/c7350d72/attachment.htm>
Další informace o konferenci Hw-list