uint8_t W5100Class::init(void) { static bool initialized = false; uint8_t i; if (initialized) return 1; // Many Ethernet shields have a CAT811 or similar reset chip // connected to W5100 or W5200 chips. The W5200 will not work at // all, and may even drive its MISO pin, until given an active low // reset pulse! The CAT811 has a 240 ms typical pulse length, and // a 400 ms worst case maximum pulse length. MAX811 has a worst // case maximum 560 ms pulse length. This delay is meant to wait // until the reset pulse is ended. If your hardware has a shorter // reset time, this can be edited or removed. delay(560); //Serial.println("w5100 init"); SPI.begin(); initSS(); resetSS(); SPI.beginTransaction(SPI_ETHERNET_SETTINGS); // Attempt W5200 detection first, because W5200 does not properly // reset its SPI state when CS goes high (inactive). Communication // from detecting the other chips can leave the W5200 in a state // where it won't recover, unless given a reset pulse. if (isW5200()) { CH_BASE_MSB = 0x40; #ifdef ETHERNET_LARGE_BUFFERS #if MAX_SOCK_NUM <= 1 SSIZE = 16384; #elif MAX_SOCK_NUM <= 2 SSIZE = 8192; #elif MAX_SOCK_NUM <= 4 SSIZE = 4096; #else SSIZE = 2048; #endif SMASK = SSIZE - 1; #endif for (i=0; i<MAX_SOCK_NUM; i++) { writeSnRX_SIZE(i, SSIZE >> 10); writeSnTX_SIZE(i, SSIZE >> 10); } for (; i<8; i++) { writeSnRX_SIZE(i, 0); writeSnTX_SIZE(i, 0); } // Try W5500 next. Wiznet finally seems to have implemented // SPI well with this chip. It appears to be very resilient, // so try it after the fragile W5200 } else if (isW5500()) {
uint8_t W5100Class::init(void) { uint16_t TXBUF_BASE, RXBUF_BASE; uint8_t i; delay(200); //Serial.println("w5100 init"); #ifdef USE_SPIFIFO SPIFIFO.begin(W5200_SS_PIN, SPI_CLOCK_12MHz); // W5100 is 14 MHz max #else SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV2); initSS(); #endif if (isW5100()) { CH_BASE = 0x0400; SSIZE = 2048; SMASK = 0x07FF; TXBUF_BASE = 0x4000; RXBUF_BASE = 0x6000; writeTMSR(0x55); writeRMSR(0x55); } else if (isW5200()) { #ifdef USE_SPIFIFO //SPIFIFO.begin(W5200_SS_PIN, SPI_CLOCK_24MHz); // W5200 is 33 MHz max #endif CH_BASE = 0x4000; SSIZE = 4096; SMASK = 0x0FFF; TXBUF_BASE = 0x8000; RXBUF_BASE = 0xC000; for (i=0; i<MAX_SOCK_NUM; i++) { writeSnRX_SIZE(i, SSIZE >> 10); writeSnTX_SIZE(i, SSIZE >> 10); } for (; i<8; i++) { writeSnRX_SIZE(i, 0); writeSnTX_SIZE(i, 0); } } else {