Atmega8, MCP2510 i komunikacja SPI - problem

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!

Reply to
TRS
Loading thread data ...

  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.

Reply to
Adam Wysocki

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 :/

Reply to
TRS

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

Reply to
TRS

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.