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ą*