Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void enc28j60Init(uint8_t* macaddr)
- {
- // initialize I/O
- // ss as output:
- pinMode(ENC28J60_CONTROL_CS, OUTPUT);
- CSPASSIVE; // ss=0
- //
- pinMode(SPI_MOSI, OUTPUT);
- pinMode(SPI_SCK, OUTPUT);
- pinMode(SPI_MISO, INPUT);
- digitalWrite(SPI_MOSI, LOW);
- digitalWrite(SPI_SCK, LOW);
- /*DDRB |= 1<<PB3 | 1<<PB5; // mosi, sck output
- cbi(DDRB,PINB4); // MISO is input
- //
- cbi(PORTB,PB3); // MOSI low
- cbi(PORTB,PB5); // SCK low
- */
- //
- // initialize SPI interface
- // master mode and Fosc/2 clock:
- SPCR = (1<<SPE)|(1<<MSTR);
- SPSR |= (1<<SPI2X);
- // perform system reset
- enc28j60WriteOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET);
- delay(50);
- // check CLKRDY bit to see if reset is complete
- // The CLKRDY does not work. See Rev. B4 Silicon Errata point. Just wait.
- //while(!(enc28j60Read(ESTAT) & ESTAT_CLKRDY));
- // do bank 0 stuff
- // initialize receive buffer
- // 16-bit transfers, must write low byte first
- // set receive buffer start address
- NextPacketPtr = RXSTART_INIT;
- // Rx start
- enc28j60Write(ERXSTL, RXSTART_INIT&0xFF);
- enc28j60Write(ERXSTH, RXSTART_INIT>>8);
- // set receive pointer address
- enc28j60Write(ERXRDPTL, RXSTART_INIT&0xFF);
- enc28j60Write(ERXRDPTH, RXSTART_INIT>>8);
- // RX end
- enc28j60Write(ERXNDL, RXSTOP_INIT&0xFF);
- enc28j60Write(ERXNDH, RXSTOP_INIT>>8);
- // TX start
- enc28j60Write(ETXSTL, TXSTART_INIT&0xFF);
- enc28j60Write(ETXSTH, TXSTART_INIT>>8);
- // TX end
- enc28j60Write(ETXNDL, TXSTOP_INIT&0xFF);
- enc28j60Write(ETXNDH, TXSTOP_INIT>>8);
- // do bank 1 stuff, packet filter:
- // For broadcast packets we allow only ARP packtets
- // All other packets should be unicast only for our mac (MAADR)
- //
- // The pattern to match on is therefore
- // Type ETH.DST
- // ARP BROADCAST
- // 06 08 -- ff ff ff ff ff ff -> ip checksum for theses bytes=f7f9
- // in binary these poitions are:11 0000 0011 1111
- // This is hex 303F->EPMM0=0x3f,EPMM1=0x30
- enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN);
- enc28j60Write(EPMM0, 0x3f);
- enc28j60Write(EPMM1, 0x30);
- enc28j60Write(EPMCSL, 0xf9);
- enc28j60Write(EPMCSH, 0xf7);
- //
- //
- // do bank 2 stuff
- // enable MAC receive
- enc28j60Write(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);
- // bring MAC out of reset
- enc28j60Write(MACON2, 0x00);
- // enable automatic padding to 60bytes and CRC operations
- enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN);
- // set inter-frame gap (non-back-to-back)
- enc28j60Write(MAIPGL, 0x12);
- enc28j60Write(MAIPGH, 0x0C);
- // set inter-frame gap (back-to-back)
- enc28j60Write(MABBIPG, 0x12);
- // Set the maximum packet size which the controller will accept
- // Do not send packets longer than MAX_FRAMELEN:
- enc28j60Write(MAMXFLL, MAX_FRAMELEN&0xFF);
- enc28j60Write(MAMXFLH, MAX_FRAMELEN>>8);
- // do bank 3 stuff
- // write MAC address
- // NOTE: MAC address in ENC28J60 is byte-backward
- enc28j60Write(MAADR5, macaddr[0]);
- enc28j60Write(MAADR4, macaddr[1]);
- enc28j60Write(MAADR3, macaddr[2]);
- enc28j60Write(MAADR2, macaddr[3]);
- enc28j60Write(MAADR1, macaddr[4]);
- enc28j60Write(MAADR0, macaddr[5]);
- // no loopback of transmitted frames
- enc28j60PhyWrite(PHCON2, PHCON2_HDLDIS);
- // switch to bank 0
- enc28j60SetBank(ECON1);
- // enable interrutps
- enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE);
- // enable packet reception
- enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement