Próbuję właśnie nawiązać komunikację przez SPI pomiędzy Atmega8 oraz układem MCP2510 (kontroler CAN). Połączenia są dobre (MOSI->SI, MISO<-SO), /SS->/CS, SCK->SCK). Na linii SS mam diodę led, i widze że atmega nadając, ustawia tą linię w stan niski. SPI działa, program się wykonuje, ale niestety układ MCP na każdy rozkaz odpowiada bajtami FF (czyli właściwie nie odpowiada). Nie mam już pomysłu co jest nie tak. Oto kawałek kodu obsługujący transmisję:
CBI(PORTB,2);
SPDR = 0xa0; //na ten bajt, MCP powinien odpowiedzieć dwoma bajtami ze statusem while(!(SPSR & (1<<SPIF))); CBI(SPSR,SPIF);
SBI(PORTB,2);
SPDR = 0x00; while(!(SPSR & (1<<SPIF))); CBI(SPSR,SPIF); msg[0]=SPDR;
SPDR=0x00; while((SPSR & 1<<SPIF)==0); CBI(SPSR,SPIF); msg[1]=SPDR;
USART_Transmit(msg[0]); USART_Transmit(msg[1]);
SPI inicjalizuję poprzez: void SPI_Init(void) { /* Enable SPI, Master, set clock rate fck/128 */ SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0); }
Porty atmegi ustawiam na samym początku: DDRB = 0xef;//0b1110 1111 PORTB = 0x04;//0b0000 0100 DDRC = 0xff; PORTC = 0x00; DDRD = 0xff; PORTD = 0x00;
Ktoś wie gdzie szukać błędu? Wszystkie układy mają zasilanie, a do oscyloskopu niestety nie mam dostępu...
Z góry dzięki za wszelką pomoc!