Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Komunikacja po SPI

cavos
-
-
Posty: 1
Rejestracja: 15 mar 2012, o 17:19

Komunikacja po SPI

Postautor: cavos » 15 mar 2012, o 17:23

Witam, staram się złożyć układ odbiornika internetowych stacji radiowych lecz napotkałem problem w postaci braku komunikacji z podzespołami - próba przesłania czy odczytania nie udaje się. Przykładem może być próba odczytania rejestru stanu pamięci: oczekiwany stan to 0x41 a odczytany to 0xFF. Podobnie z enc28j60 - przy próbie odczytu EERVID wynikiem jest 0x03 (producent nic nie wspomina o takiej rewizji).
Połączenia na płytce sprawdzone niejednokrotnie multimetrem, zimnych lutów też nie stwierdzono. Próbowałem również zmieniać prędkości zegara SPI - ten sam efekt. Testowałem na dwóch różnych uC atmega. Zasilanie jest podłączone i dociera do odpowiednich pinów.

Kod programu:

Kod: Zaznacz cały

int main(void) { UINT8 a1[] = {0xCF, 0xf1}; UINT8 a2[] = {0xAA, 0xcc}; UINT16 ba = 0xC0F0; /* ports */ PORTA = B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7; DDRA = B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7; PORTB = 0x00; PORTB = B0 | B2 | B3 | B4 | B5 | B6 ; DDRB = 0x00; DDRB = B0 | B1 | B3 | B4 | B5 | B7; PORTC = B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7; DDRC = B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7; PORTD = B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7; DDRD = 0x00; DDRD = B0 | B1 | B7; /* watchdog */ wdt_enable(WDTO_4S); wdt_reset(); /* ~1 second timer */ TCNT1 = 0; TCCR1A = 0; TCCR1B = (1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10); OCR1A = (F_CPU/1024)-1; TIMSK1 |= (1<<OCIE1A); /* SPI */ SPCR = (1<<SPE)|(1<<MSTR); // SPSR |= (1<<SPI2X); ENC28J60_ENABLE(); PORTA = enc28j60_read(EREVID); ENC28J60_ENABLE(); //fifo_init(); //fifo_spi_write(FIFO_RDSR); //PORTA = fifo_spi_read(); //BUFFER_ENABLE(); sei(); /************************************************************************/ /* main loop */ /************************************************************************/ while(1) { wdt_reset(); if( run_timeservice ) { run_timeservice = 0x00; LED_TOGGLE(); } } }

Kod: Zaznacz cały

UINT8 enc28j60_read(UINT8 addr) { enc28j60_setBank(addr); return enc28j60_readOp(enc28j60_RCR, addr); } void enc28j60_setBank(UINT8 addr) { if ( enc28j60_bank != (addr & _BANK) ) { enc28j60_writeOp(enc28j60_BFC, ECON1, BSEL0 | BSEL1); enc28j60_writeOp(enc28j60_BFS, ECON1, (addr & _BANK) >> 5); } enc28j60_bank = (addr & _BANK); return; } void enc28j60_writeOp(UINT8 Op, UINT8 addr, UINT8 d) { ENC28J60_ENABLE(); SPDR = Op | ( addr & _ADDR ); /*command & address*/ wait_spi(); SPDR = d; /* data*/ wait_spi(); ENC28J60_DISABLE(); return; } UINT8 enc28j60_readOp(UINT8 Op, UINT8 addr) { ENC28J60_ENABLE(); SPDR = Op | ( addr & _ADDR ); wait_spi(); SPDR = 0xFF; wait_spi(); if(addr & _SPRD) /* if mac or mii*/ { SPDR = 0xFF; wait_spi(); } ENC28J60_DISABLE(); return SPDR; }

Kod: Zaznacz cały

typedef unsigned char UINT8; typedef unsigned short int UINT16; typedef unsigned int UINT32; #define wait_spi() while(!(SPSR & (1<<SPIF))) void spi_write(UINT8 b) { SPDR = b; wait_spi(); } UINT8 spi_read() { UINT8 b; b = 0xFF; SPDR = b; wait_spi(); return b; }

http://i40.tinypic.com/1zlyxqd.png <- pcb
http://i40.tinypic.com/qs74ia.png <- schemat
/*płytka jest wykonana na frezarce i wypełniona masą*

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 20 gości