Advertisement
Guest User

init

a guest
Mar 18th, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.65 KB | None | 0 0
  1. void enc28j60Init(uint8_t* macaddr)
  2. {
  3.     // initialize I/O
  4.         // ss as output:
  5.     pinMode(ENC28J60_CONTROL_CS, OUTPUT);
  6.     CSPASSIVE; // ss=0
  7.         // 
  8.     pinMode(SPI_MOSI, OUTPUT);
  9.    
  10.     pinMode(SPI_SCK, OUTPUT);
  11.    
  12.     pinMode(SPI_MISO, INPUT);
  13.    
  14.    
  15.     digitalWrite(SPI_MOSI, LOW);
  16.    
  17.     digitalWrite(SPI_SCK, LOW);
  18.    
  19.     /*DDRB  |= 1<<PB3 | 1<<PB5; // mosi, sck output
  20.     cbi(DDRB,PINB4); // MISO is input
  21.         //
  22.         cbi(PORTB,PB3); // MOSI low
  23.         cbi(PORTB,PB5); // SCK low
  24.   */
  25.     //
  26.     // initialize SPI interface
  27.     // master mode and Fosc/2 clock:
  28.         SPCR = (1<<SPE)|(1<<MSTR);
  29.         SPSR |= (1<<SPI2X);
  30.     // perform system reset
  31.     enc28j60WriteOp(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET);
  32.     delay(50);
  33.     // check CLKRDY bit to see if reset is complete
  34.         // The CLKRDY does not work. See Rev. B4 Silicon Errata point. Just wait.
  35.     //while(!(enc28j60Read(ESTAT) & ESTAT_CLKRDY));
  36.     // do bank 0 stuff
  37.     // initialize receive buffer
  38.     // 16-bit transfers, must write low byte first
  39.     // set receive buffer start address
  40.    
  41.     NextPacketPtr = RXSTART_INIT;
  42.         // Rx start
  43.     enc28j60Write(ERXSTL, RXSTART_INIT&0xFF);
  44.     enc28j60Write(ERXSTH, RXSTART_INIT>>8);
  45.     // set receive pointer address
  46.     enc28j60Write(ERXRDPTL, RXSTART_INIT&0xFF);
  47.     enc28j60Write(ERXRDPTH, RXSTART_INIT>>8);
  48.     // RX end
  49.     enc28j60Write(ERXNDL, RXSTOP_INIT&0xFF);
  50.     enc28j60Write(ERXNDH, RXSTOP_INIT>>8);
  51.     // TX start
  52.     enc28j60Write(ETXSTL, TXSTART_INIT&0xFF);
  53.     enc28j60Write(ETXSTH, TXSTART_INIT>>8);
  54.     // TX end
  55.     enc28j60Write(ETXNDL, TXSTOP_INIT&0xFF);
  56.     enc28j60Write(ETXNDH, TXSTOP_INIT>>8);
  57.     // do bank 1 stuff, packet filter:
  58.         // For broadcast packets we allow only ARP packtets
  59.         // All other packets should be unicast only for our mac (MAADR)
  60.         //
  61.         // The pattern to match on is therefore
  62.         // Type     ETH.DST
  63.         // ARP      BROADCAST
  64.         // 06 08 -- ff ff ff ff ff ff -> ip checksum for theses bytes=f7f9
  65.         // in binary these poitions are:11 0000 0011 1111
  66.         // This is hex 303F->EPMM0=0x3f,EPMM1=0x30
  67.     enc28j60Write(ERXFCON, ERXFCON_UCEN|ERXFCON_CRCEN|ERXFCON_PMEN);
  68.     enc28j60Write(EPMM0, 0x3f);
  69.     enc28j60Write(EPMM1, 0x30);
  70.     enc28j60Write(EPMCSL, 0xf9);
  71.     enc28j60Write(EPMCSH, 0xf7);
  72.         //
  73.         //
  74.     // do bank 2 stuff
  75.     // enable MAC receive
  76.     enc28j60Write(MACON1, MACON1_MARXEN|MACON1_TXPAUS|MACON1_RXPAUS);
  77.     // bring MAC out of reset
  78.     enc28j60Write(MACON2, 0x00);
  79.     // enable automatic padding to 60bytes and CRC operations
  80.     enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0|MACON3_TXCRCEN|MACON3_FRMLNEN);
  81.     // set inter-frame gap (non-back-to-back)
  82.     enc28j60Write(MAIPGL, 0x12);
  83.     enc28j60Write(MAIPGH, 0x0C);
  84.     // set inter-frame gap (back-to-back)
  85.     enc28j60Write(MABBIPG, 0x12);
  86.     // Set the maximum packet size which the controller will accept
  87.         // Do not send packets longer than MAX_FRAMELEN:
  88.     enc28j60Write(MAMXFLL, MAX_FRAMELEN&0xFF); 
  89.     enc28j60Write(MAMXFLH, MAX_FRAMELEN>>8);
  90.     // do bank 3 stuff
  91.         // write MAC address
  92.         // NOTE: MAC address in ENC28J60 is byte-backward
  93.         enc28j60Write(MAADR5, macaddr[0]);
  94.         enc28j60Write(MAADR4, macaddr[1]);
  95.         enc28j60Write(MAADR3, macaddr[2]);
  96.         enc28j60Write(MAADR2, macaddr[3]);
  97.         enc28j60Write(MAADR1, macaddr[4]);
  98.         enc28j60Write(MAADR0, macaddr[5]);
  99.     // no loopback of transmitted frames
  100.     enc28j60PhyWrite(PHCON2, PHCON2_HDLDIS);
  101.     // switch to bank 0
  102.     enc28j60SetBank(ECON1);
  103.     // enable interrutps
  104.     enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE);
  105.     // enable packet reception
  106.     enc28j60WriteOp(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement