ENC28J60 Ethernet

A low-cost 10 Mbps Ethernet module built on Microchip's ENC28J60 MAC and PHY, with the TCP/IP stack run by the microcontroller.

  • Supply voltage3.1 V to 3.6 V (3.3 V typical)
  • Absolute maximumVDD 3.6 V; RESET, CS, SCK and SI up to 6.0 V; SO, INT, CLKOUT VDD + 0.3 V
  • Current160 mA typical, 180 mA maximum transmitting; 120 mA active; 1.2 mA in sleep
  • Input levelsSCK, CS, SI, RESET read high from 2.25 V to 5.5 V
ENC28J60 Ethernet, A low-cost 10 Mbps Ethernet module built on Microchip's ENC28J60 MAC and PHY, with the TCP/IP stack run by the microcontroller.
In short

The ENC28J60 module is a 10Base-T Ethernet interface on SPI: Microchip's chip runs from 3.1 V to 3.6 V, talks SPI at up to 20 MHz and buffers packets in 8 KB of RAM (Microchip ENC28J60 DS39662E, p. 1). It draws 160 mA typical and 180 mA maximum while transmitting (p. 80), so it needs its own 3.3 V supply on an Uno. Its CS, SCK, SI and RESET inputs are 5 V tolerant (p. 7); the EthernetENC library runs the TCP/IP stack on the microcontroller.

Unlike the W5500, the ENC28J60 is only the bottom of a network stack: a 10 Mbps Ethernet MAC and PHY with an 8 KB packet buffer (Microchip ENC28J60 DS39662E, p. 1). The microcontroller runs IP, TCP, UDP and DHCP in software, which is why it needs a library such as EthernetENC (the modern successor to UIPEthernet) and why it uses more flash and RAM than a W5500 does.

The common blue module carries the chip, a 25 MHz crystal and a HanRun RJ45 jack with built-in magnetics, and breaks out a 2 × 5 header printed CLKOUT, INT, WOL, SO, SI, SCK, CS, RESET, VCC and GND. VCC is the chip's 3.3 V supply directly, with no regulator, and the chip's absolute maximum on VDD is 3.6 V (p. 79).

Current is the planning point: 120 mA while active and up to 180 mA while transmitting (p. 80), more than the 3.3 V pins of many boards deliver comfortably. Microchip made the SPI inputs 5 V tolerant for 5 V hosts, but notes that a 5 V controller may be out of specification reading the chip's 3.3 V outputs and suggests a level translator on SO (p. 7).

ENC28J60 Ethernet pinout

tinkered.ai/components/enc28j60-ethernetENC28J60 EthernetCLKOUTClock outputINTInterrupt (active low)WOLWake-on-LANSOSPI MISOSISPI MOSISCKSPI SCKCSSPI CS (active low)RESETReset (active low)VCC3.3 V supplyGNDGround
PinFunctionType
CLKOUTClock outputoutput
INTInterrupt (active low)3.3 Voutput
WOLWake-on-LANoutput
SOSPI MISO3.3 Voutput
SISPI MOSI5 V tolerantinput
SCKSPI SCK5 V tolerantinput
CSSPI CS (active low)5 V tolerantinput
RESETReset (active low)5 V tolerantinput
VCC3.3 V supply3.1 V to 3.6 V, 180 mApower in
GNDGroundpower in

How to wire the ENC28J60 Ethernet

Pin by pin, for the board you have.

ENC28J60 EthernetArduino UnoNote
VCC3.3 V regulator output (AMS1117-3.3 module fed from 5V)The Uno's own 3.3V pin gives 50 mA; the module needs up to 180 mA.
GNDGND (shared with the regulator)
SOD12
SID11
SCKD13
CSD10
  • SO drives about 3.3 V into the Uno, which Microchip notes may fall short of a 5 V controller's input specification (DS39662E, p. 7). It usually works; a 74HCT125 buffer powered from 5 V makes it dependable.
Design this circuit on an Arduino Uno

ENC28J60 Ethernet code

Every example here compiles for its board.

Libraries: jandrassy/EthernetENC
// ENC28J60 Ethernet on Arduino Uno: wiring and a free simulation at https://www.tinkered.ai/components/enc28j60-ethernet
// ENC28J60 module on an Arduino Uno: CS D10, SPI D11/D12/D13. Gets an address by DHCP, then fetches a page.
#include <SPI.h>
#include <EthernetENC.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x11 }; // unique on your network
EthernetClient client;
bool requested = false;

void setup() {
  Serial.begin(115200);
  Ethernet.init(10); // CS pin
  Serial.println(F("Requesting an address by DHCP..."));
  if (Ethernet.begin(mac) == 0) {
    if (Ethernet.hardwareStatus() == EthernetNoHardware) Serial.println(F("ENC28J60 not found: check wiring and 3.3 V supply"));
    else if (Ethernet.linkStatus() == LinkOFF) Serial.println(F("No link: check the cable"));
    else Serial.println(F("DHCP failed"));
    while (true) {}
  }
  Serial.print(F("IP address: "));
  Serial.println(Ethernet.localIP());
}

void loop() {
  Ethernet.maintain(); // EthernetENC processes incoming packets here
  if (!requested) {
    requested = true;
    if (client.connect("example.com", 80)) {
      client.println(F("GET / HTTP/1.1"));
      client.println(F("Host: example.com"));
      client.println(F("Connection: close"));
      client.println();
    } else {
      Serial.println(F("Connection failed"));
    }
  }
  while (client.available()) Serial.write(client.read());
  if (requested && client && !client.connected()) {
    client.stop();
    Serial.println(F("\nDone"));
  }
}
Compiled for arduino:avr:uno on 2026-10-30

Before you wire it

Do
  • Feed VCC from a 3.3 V supply good for at least 180 mA, the chip's maximum while transmitting (Microchip DS39662E, p. 80).
  • Call Ethernet.maintain() often: EthernetENC processes incoming packets inside it.
  • Call Ethernet.init(csPin) before Ethernet.begin() when CS is not on pin 10.
  • Give each board on the network its own MAC address.
Don’t
  • Never connect VCC to 5 V: the chip's absolute maximum is 3.6 V (p. 79).
  • Never power it from an Uno's 3.3V pin, which supplies 50 mA.
  • Never expect 100 Mbps: the ENC28J60 is a 10Base-T device (p. 1), and switches negotiate it down to 10 Mbps.
  • CS, SCK, SI and RESET accept up to 5.5 V as a valid high (p. 80), so a 5 V board can drive them directly.
  • Microchip's I/O section suggests a unidirectional level translator, such as a 74HCT buffer, on SO (and INT, if used) when the host runs at 5 V (p. 7).
  • The chip gets warm: at 120 mA to 180 mA from 3.3 V it dissipates around half a watt, which is normal.
  • The jack's LEDs are driven by the chip and show link and activity, a quick check that power and cable are fine before debugging code.
  • EthernetENC's API matches Arduino's Ethernet library, so web client and server examples port by changing the include to EthernetENC.h.

Specifications

Supply voltage
3.1 V to 3.6 V (3.3 V typical)Microchip ENC28J60 DS39662E, p. 1
Absolute maximum
VDD 3.6 V; RESET, CS, SCK and SI up to 6.0 V; SO, INT, CLKOUT VDD + 0.3 VMicrochip ENC28J60 DS39662E, p. 79
Current
160 mA typical, 180 mA maximum transmitting; 120 mA active; 1.2 mA in sleepMicrochip ENC28J60 DS39662E, p. 80
Input levels
SCK, CS, SI, RESET read high from 2.25 V to 5.5 VMicrochip ENC28J60 DS39662E, p. 80
Output levels
SO and INT high at VDD - 0.7 V or more at 4 mAMicrochip ENC28J60 DS39662E, p. 80
SPI clock
Up to 20 MHzMicrochip ENC28J60 DS39662E, p. 1
Ethernet
One 10Base-T port (10 Mbps), integrated MAC and PHYMicrochip ENC28J60 DS39662E, p. 1
Packet buffer
8 KB dual-port SRAM for transmit and receiveMicrochip ENC28J60 DS39662E, p. 1

From the Microchip ENC28J60 Data Sheet DS39662E, published by Microchip Technology.

Common mistakes

  1. Feeding it from the Uno's 3.3V pin

    The ENC28J60 draws 120 mA active and up to 180 mA while transmitting (Microchip DS39662E, p. 80). The Uno's 3.3V pin gives 50 mA, so DHCP fails or the link drops. Use a separate 3.3 V regulator with a shared ground.

  2. Using the W5100 Ethernet library

    Arduino's Ethernet library drives WIZnet chips only. The ENC28J60 needs a software stack such as EthernetENC or UIPEthernet; with the wrong library begin() always reports no hardware.

  3. Not calling Ethernet.maintain()

    EthernetENC handles received packets inside maintain(). A loop that blocks with long delays makes connections time out even though DHCP worked.

  4. Running out of RAM on an Uno

    The software TCP/IP stack takes a large share of the Uno's 2 KB. Keep strings in flash with F(), avoid large buffers, and consider the W5500, which keeps the stack in hardware.

ENC28J60 Ethernet questions

Is the ENC28J60 5 V tolerant?

Its CS, SCK, SI and RESET inputs are, up to 6.0 V absolute maximum (Microchip DS39662E, p. 79). Its supply is not: VCC must be 3.1 V to 3.6 V (p. 1). Its SO output is 3.3 V, which most 5 V boards read, though Microchip recommends a level translator for full specification (p. 7).

Which library should I use for the ENC28J60?

EthernetENC (jandrassy/EthernetENC), the maintained successor of UIPEthernet. Its API mirrors Arduino's Ethernet library, so the usual EthernetClient and EthernetServer examples work after changing the include.

How much current does the ENC28J60 module need?

120 mA active and 160 mA typical, 180 mA maximum while transmitting at 3.3 V (p. 80). Plan for a 3.3 V supply of at least 200 mA.

ENC28J60 or W5500?

The ENC28J60 is cheaper but runs only 10 Mbps and leaves TCP/IP to the microcontroller. The W5500 does TCP/IP in hardware at 10/100 Mbps with 8 sockets, so it suits RAM-limited boards like the Uno much better.

Does the ENC28J60 work with an ESP32 or Pico?

Yes: power it from the board's 3.3 V pin, wire the SPI lines directly and call Ethernet.init() with your CS pin. Both cores also offer native ENC28J60 drivers for their own network stacks.

Build something with the ENC28J60 Ethernet

  • LAN temperature logger

    Post readings to a local server every minute over a wired link.

    Build this
  • Ethernet doorbell notifier

    A button press sends a UDP message to a PC on the network.

    Build this
For AI assistants

This page as plain Markdown, for ChatGPT, Claude or your own agent. /components/enc28j60-ethernet.md

What will you build with it?