Overview

The ENC28J60 is a standalone 10BASE-T Ethernet controller manufactured by Microchip Technology. Packaged as a 28-pin IC or a compact PCB breakout module equipped with an integrated HR911105A RJ45 MagJack connector (with internal isolation magnetics and status LEDs), it enables microcontrollers to connect to wired LAN networks over an SPI interface.

Integrating a fully compliant IEEE 802.3 MAC (Media Access Control) layer, 10 Mbps physical layer transceiver (PHY), programmable hardware packet filtering, and an 8 KB dual-port RAM transmit/receive buffer, the ENC28J60 is a classic hardware solution for adding wired Ethernet connectivity to Arduino Uno, ESP32, STM32, and Raspberry Pi Zero projects.

Quick reference

Operating voltage (VCC)3.3 V to 5.0 V DC (breakout module with 3.3V LDO)
IC supply voltage (VDD)3.1 V to 3.6 V DC (3.3 V nominal)
Ethernet standardIEEE 802.3 10BASE-T (10 Mbps half/full duplex)
InterfaceSPI (up to 20 MHz)
Internal packet buffer8 KB dual-port SRAM (transmit and receive FIFO)
I/O tolerance5V tolerant SPI inputs (CS, SCK, SI)
ConnectorRJ45 MagJack with built-in isolation transformer & status LEDs
Operating current160 mA160\text{ mA} typical transmit / 2 μA2\ \mu\text{A} standby

Pinout

Standard 10-pin or 12-pin double-row 0.1" (2.54 mm) breakout module header:

PinNameTypeDescription
1VCC / 3.3VPowerPower supply input (+3.3 V to +5.0 V DC)
2GNDPowerGround reference (0 V)
3CS / SSDigital InputActive-Low SPI Chip Select
4SCK / CLKDigital InputSPI Serial Clock
5SI / MOSIDigital InputSPI Serial Data Input
6SO / MISODigital OutputSPI Serial Data Output
7WOLDigital OutputWake-On-LAN signal output (optional)
8INTDigital OutputActive-Low interrupt output pin
9RST / RESETDigital InputActive-Low hardware reset pin
10CLKOUTDigital OutputProgrammable clock output pin (default 6.25 MHz)

Specifications

ParameterSymbolMinTypMaxUnitConditions
Supply Voltage (Module)VCCV_{CC}3.33.3 / 5.05.5VPower rail with 3.3V LDO
Transmit CurrentItxI_{tx}160180mA10BASE-T active transmission
Receive CurrentIrxI_{rx}120140mAReceiving Ethernet packets
SPI Clock FrequencyfSPIf_{SPI}01420MHzSPI Mode 0,0 (CPOL=0,CPHA=0CPOL=0, CPHA=0)
SRAM Buffer MemoryRAMRAM8192BytesConfigurable Rx/Tx buffer split
Transmission SpeedSpeedSpeed10Mbps10BASE-T Ethernet

Software Architecture & Software TCP/IP Stack

Unlike the WIZnet W5500 (which features a hardware-implemented TCP/IP stack on chip), the ENC28J60 handles only Layer 1 (PHY) and Layer 2 (MAC) Ethernet frames in hardware:

  • Ethernet Packet Buffering: Incoming Ethernet frames are stored in the 8 KB internal SRAM buffer.
  • Software TCP/IP Stack: The host microcontroller (Arduino/ESP32) must run a software TCP/IP stack—such as UIP, EtherCard, or EthernetENC—to process IP, ARP, ICMP (ping), UDP, and TCP packets.

Wiring

ENC28J60 PinArduino UnoESP32Notes
VCC / 3.3V3.3V / 5V3.3VRequires up to 180 mA current
GNDGNDGNDSystem ground
SCKDigital D13GPIO 18SPI Clock
SO (MISO)Digital D12GPIO 19SPI MISO
SI (MOSI)Digital D11GPIO 23SPI MOSI
CSDigital D10GPIO 5SPI Chip Select
RESETDigital D8GPIO 16Hardware Reset (optional)
Warning

High Current Supply Hazard:

  • The ENC28J60 draws up to 180 mA during Ethernet frame transmission. Connecting VCC to weak 3.3V regulator pins (such as the 3.3V pin on old FTDI USB-to-serial adapters or early Arduino boards) causes voltage dips and connection resets. Always connect to a high-current 3.3V rail capable of 250 mA\ge 250\text{ mA}.

Example (Arduino EthernetENC Web Server)

cpp
#include <SPI.h>
#include <EthernetENC.h>

// MAC address for controller
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 177);

EthernetServer server(80);

void setup() {
  Serial.begin(9600);
  
  // Initialize Ethernet with Chip Select pin 10
  Ethernet.init(10);
  Ethernet.begin(mac, ip);

  server.begin();
  Serial.print("ENC28J60 Web Server online at IP: ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  EthernetClient client = server.available();
  if (client) {
    Serial.println("New HTTP client connected");
    boolean currentLineIsBlank = true;

    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n' && currentLineIsBlank) {
          // Send HTTP response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html><h1>VoltDocs ENC28J60 Ethernet Server</h1></html>");
          break;
        }
        if (c == '\n') {
          currentLineIsBlank = true;
        } else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}

Common mistakes

  • Powering from weak 3.3V sources: Under-powering the module causes network dropouts or inability to establish a link with network switches.
  • Conflating ENC28J60 and W5500 libraries: ENC28J60 requires libraries like EthernetENC or EtherCard; standard W5500 Ethernet.h libraries will fail to initialize the chip.

Notes

  • ENC28J60 vs W5500: ENC28J60 is 10 Mbps and requires a software TCP/IP stack; W5500 is 100 Mbps and implements a full hardware TCP/IP stack offloading MCU RAM.

Assets & downloads