Atmega8, MCP2510 i komunikacja SPI - problem

Sep 19, 2008 3 Replies

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!


  1. CS=0
  2. Wysyłasz "read status"
  3. CS=1

Może status powinieneś odczytać przed ponownym ustawieniem CS? Tak by wychodziło z punktu 11.5 datasheeta.

Adam Wysocki pisze:

Faktycznie, tego nie zauważyłem. Mea culpa! Tylko mimo iż CS utrzymuję w stanie LOW przez całą transmisję, to nadal dostaję w odpowiedzi 0xFF :/

Problem rozwiązany. Dla potomnych, przyczyną był zimny lut na rezystorze podciągającym pin RESET układu MCP2510 :/

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required