Witam!
Mam 2 atmegi8 na 12MHz kwarcach. Połączone są ze sobą poprzez SPI. Wysyłanie i odpierane zrobione poprzez pooling. Nóżka SS w slave podłączona jest do masy (aktywacja SPI).
Generalnie chodzi o to, że połączenie nie działa... ale nie zawsze.
Mam podłączone 2 procesory.
1) Master wysyła 1 bajt, slave go nie odbiera.
2) odczekanie około _sekundy_ w pustej pętli (master) a slave ciągle czeka na transfer.
3) Master wysyła 2 bajt i teraz albo:
3a) jest błąd, że chcę wysłać 2 bajt a pierwszy jeszcze jest nie wysłany
3b) zaczyna wysyłać ale nie kończy (nie ustawia flagi końca transferu)
Kiedy podłącze mastera do programatora to bajty są wysyłane 1 za 2 i wszystko śmiga... Może mam lewego slava, połączenie albo program?
Kod mastera:
Kod Slave:
Mam 2 atmegi8 na 12MHz kwarcach. Połączone są ze sobą poprzez SPI. Wysyłanie i odpierane zrobione poprzez pooling. Nóżka SS w slave podłączona jest do masy (aktywacja SPI).
Generalnie chodzi o to, że połączenie nie działa... ale nie zawsze.
Mam podłączone 2 procesory.
1) Master wysyła 1 bajt, slave go nie odbiera.
2) odczekanie około _sekundy_ w pustej pętli (master) a slave ciągle czeka na transfer.
3) Master wysyła 2 bajt i teraz albo:
3a) jest błąd, że chcę wysłać 2 bajt a pierwszy jeszcze jest nie wysłany
3b) zaczyna wysyłać ale nie kończy (nie ustawia flagi końca transferu)
Kiedy podłącze mastera do programatora to bajty są wysyłane 1 za 2 i wszystko śmiga... Może mam lewego slava, połączenie albo program?
Kod mastera:
void Init_Master (void)
{
char IOReg;
// set PB4(/SS), PB5(MOSI), PB7(SCK) as output
DDRB = (1<<PB4)|(1<<PB5)|(1<<PB7);
// enable SPI in Master Mode with SCK = CK/4
SPCR = (1<<SPE)|(1<<MSTR);//|(1<<SPR0)|(1<<SPR1);
IOReg = SPSR; // clear SPIF bit in SPSR
IOReg = SPDR;
}
int main(void) {
unsigned char i, j, z;
Init_Master();
z = 100;
//diody PC4 i PC5, przycisk PC3
DDRC = ~(1<<PC3);
for(;;) {
PORTC = (1<<PC4);
for (j=0; j<100; j++)
for (i=0; i<200; i++) Delay(); //duuuzo czasu
SPDR = z;
while(!(SPSR & (1<<SPIF)))
if (SPSR & (1<<WCOL))
PORTC = ~((1<<PC5)|(1<<PC4)); //zaswieca obie gdy 3a)
PORTC = (1<<PC5);
for (j=0; j<100; j++)
for (i=0; i<200; i++) Delay(); //znow duza przerwa
}
return 0;
}Kod Slave:
void Init_Slave (void)
{
char IOReg;
// Set PB6(MISO) as output
DDRB = (1<<PB6);
// Enable SPI in Slave Mode with SCK = CK/4
SPCR = (1<<SPE);//|(1<<SPR0)|(1<<SPR1);
IOReg = SPSR; // Clear SPIF bit in SPSR
IOReg = SPDR;
}
int main(void)
{
unsigned char i, j, z, y;
Init_Slave();
DDRC = ~(1<<PC3);
for(;;){
PORTC = (1<<PC4);
while (!(SPSR & (1<<SPIF)))
if (SPSR & (1<<WCOL))
PORTC = ~((1<<PC5)|(1<<PC4));
y = SPDR;
PORTC = (1<<PC5);
}
return 0;
}