Blog

ENC28J60 Ethernet Module – Complete Guide

Ethernet Module

ENC28J60 Ethernet Module

Wired 10Base-T Networking via SPI

Before WiFi modules like the ESP8266 became cheap and ubiquitous, adding network connectivity to a microcontroller project usually meant wired Ethernet, and the ENC28J60 is the chip that made that affordable and accessible to hobbyists - a standalone Ethernet controller that handles the entire physical and data-link layer of 10Base-T networking in hardware, exposing a standard RJ45 jack on one side and a simple SPI interface on the other. Because the chip itself only implements the lower networking layers - getting raw Ethernet frames on and off the wire - the actual TCP/IP stack, handling IP addressing, TCP connections, and DHCP, runs as software on your microcontroller, most commonly through a library like UIPEthernet written specifically for this chip. The tradeoff for choosing wired Ethernet over WiFi is a genuinely more reliable, lower-latency, interference-free connection with no pairing or credentials to manage, at the cost of needing an actual Ethernet cable run to wherever the project lives.

10Base-T
Speed
SPI
Interface
RJ45
Connector

Key features

Wired Reliability

No WiFi interference, dropped associations, or credential management.

SPI Interface

Talks to any microcontroller over a standard 4-wire SPI connection.

Onboard MAC + PHY

Handles the full physical and data-link Ethernet layer in hardware.

Built-In RJ45 with Magnetics

Integrated transformer and status LEDs in the jack itself.

Low Power Option

Supports a software-controlled low-power standby mode.

Mature Library Support

Well-established Arduino libraries handle the low-level driver work.

Technical specifications

Supply Voltage 3.3V (check SPI 5V tolerance per board)
Interface SPI (up to 20MHz)
Ethernet Standard IEEE 802.3 10Base-T
Connector RJ45 with integrated magnetics
Buffer Memory 8KB onboard packet buffer
MAC Address User-assigned in software (not factory-burned)
Speed 10 Mbps (half/full duplex)
Power Modes Normal and low-power standby
Package Breakout module with RJ45 jack

Pinout

PinFunction
VCC / GND Power supply
SCK / SO / SI / CS SPI clock, MISO, MOSI, chip select
INT Interrupt output
RESET Reset input

Applications

Wired IoT sensor nodes Industrial and factory-floor networked controllers Home automation hubs needing a reliable wired link Simple embedded web servers Network-attached data loggers Projects in RF-noisy environments where WiFi is unreliable

What's in the box

1x ENC28J60 Ethernet module

Downloads

Datasheet (PDF) Arduino UIPEthernet Library Example Sketch
🔌
Pin Connections
1 Table
Pin Connections Table 1
BoardSensor PinConnection
ENC28J60VCC/GND/CS3.3V only / GND / board digital pin
📟
Ethernet Module (ENC28J60) For Arduino / Microcontroller
7 Examples • C/C++ | Boards: Arduino Uno, Arduino Nano, Arduino Mega, ESP32, ESP8266, STM32, Raspberry Pi Pico
Ethernet Module (ENC28J60) For Arduino / Microcontroller - Arduino Uno
Ethernet Module (ENC28J60) For Arduino / Microcontroller - Arduino Nano
Ethernet Module (ENC28J60) For Arduino / Microcontroller - Arduino Mega
Ethernet Module (ENC28J60) For Arduino / Microcontroller - ESP32
Ethernet Module (ENC28J60) For Arduino / Microcontroller - ESP8266
Ethernet Module (ENC28J60) For Arduino / Microcontroller - STM32
Ethernet Module (ENC28J60) For Arduino / Microcontroller - Raspberry Pi Pico
📄 File: ethernet_module_(enc28j60)_for_arduino_/_microcontroller_-_arduino_uno.inoArduino Uno
653 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// CS=10 on Arduino Uno (MOSI/MISO/SCK use the board's hardware SPI pins)
6#include <SPI.h>
7#include <UIPEthernet.h>
8
9byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
10EthernetServer server(80);
11
12void setup() {
13 Serial.begin(115200);
14 Ethernet.begin(mac);
15 server.begin();
16 Serial.print("IP: "); Serial.println(Ethernet.localIP());
17}
18
19void loop() {
20 EthernetClient client = server.available();
21 if (client) {
22 client.println("HTTP/1.1 200 OK");
23 client.println("Content-Type: text/plain");
24 client.println();
25 client.println("Hello from Ekostra!");
26 client.stop();
27 }
28}
📄 File: ethernet_module_(enc28j60)_for_arduino_/_microcontroller_-_arduino_nano.inoArduino Nano
654 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// CS=10 on Arduino Nano (MOSI/MISO/SCK use the board's hardware SPI pins)
6#include <SPI.h>
7#include <UIPEthernet.h>
8
9byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
10EthernetServer server(80);
11
12void setup() {
13 Serial.begin(115200);
14 Ethernet.begin(mac);
15 server.begin();
16 Serial.print("IP: "); Serial.println(Ethernet.localIP());
17}
18
19void loop() {
20 EthernetClient client = server.available();
21 if (client) {
22 client.println("HTTP/1.1 200 OK");
23 client.println("Content-Type: text/plain");
24 client.println();
25 client.println("Hello from Ekostra!");
26 client.stop();
27 }
28}
📄 File: ethernet_module_(enc28j60)_for_arduino_/_microcontroller_-_arduino_mega.inoArduino Mega
654 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// CS=53 on Arduino Mega (MOSI/MISO/SCK use the board's hardware SPI pins)
6#include <SPI.h>
7#include <UIPEthernet.h>
8
9byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
10EthernetServer server(80);
11
12void setup() {
13 Serial.begin(115200);
14 Ethernet.begin(mac);
15 server.begin();
16 Serial.print("IP: "); Serial.println(Ethernet.localIP());
17}
18
19void loop() {
20 EthernetClient client = server.available();
21 if (client) {
22 client.println("HTTP/1.1 200 OK");
23 client.println("Content-Type: text/plain");
24 client.println();
25 client.println("Hello from Ekostra!");
26 client.stop();
27 }
28}
📄 File: ethernet_module_(enc28j60)_for_arduino_/_microcontroller_-_esp32.inoESP32
646 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// CS=5 on ESP32 (MOSI/MISO/SCK use the board's hardware SPI pins)
6#include <SPI.h>
7#include <UIPEthernet.h>
8
9byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
10EthernetServer server(80);
11
12void setup() {
13 Serial.begin(115200);
14 Ethernet.begin(mac);
15 server.begin();
16 Serial.print("IP: "); Serial.println(Ethernet.localIP());
17}
18
19void loop() {
20 EthernetClient client = server.available();
21 if (client) {
22 client.println("HTTP/1.1 200 OK");
23 client.println("Content-Type: text/plain");
24 client.println();
25 client.println("Hello from Ekostra!");
26 client.stop();
27 }
28}
📄 File: ethernet_module_(enc28j60)_for_arduino_/_microcontroller_-_esp8266.inoESP8266
649 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// CS=D8 on ESP8266 (MOSI/MISO/SCK use the board's hardware SPI pins)
6#include <SPI.h>
7#include <UIPEthernet.h>
8
9byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
10EthernetServer server(80);
11
12void setup() {
13 Serial.begin(115200);
14 Ethernet.begin(mac);
15 server.begin();
16 Serial.print("IP: "); Serial.println(Ethernet.localIP());
17}
18
19void loop() {
20 EthernetClient client = server.available();
21 if (client) {
22 client.println("HTTP/1.1 200 OK");
23 client.println("Content-Type: text/plain");
24 client.println();
25 client.println("Hello from Ekostra!");
26 client.stop();
27 }
28}
📄 File: ethernet_module_(enc28j60)_for_arduino_/_microcontroller_-_stm32.inoSTM32
648 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// CS=PA4 on STM32 (MOSI/MISO/SCK use the board's hardware SPI pins)
6#include <SPI.h>
7#include <UIPEthernet.h>
8
9byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
10EthernetServer server(80);
11
12void setup() {
13 Serial.begin(115200);
14 Ethernet.begin(mac);
15 server.begin();
16 Serial.print("IP: "); Serial.println(Ethernet.localIP());
17}
18
19void loop() {
20 EthernetClient client = server.available();
21 if (client) {
22 client.println("HTTP/1.1 200 OK");
23 client.println("Content-Type: text/plain");
24 client.println();
25 client.println("Hello from Ekostra!");
26 client.stop();
27 }
28}
📄 File: ethernet_module_(enc28j60)_for_arduino_/_microcontroller_-_raspberry_pi_pico.inoRaspberry Pi Pico
659 characters
1//ekostra.com
2//electronics store in egypt
3//+201008896258
4
5// CS=17 on Raspberry Pi Pico (MOSI/MISO/SCK use the board's hardware SPI pins)
6#include <SPI.h>
7#include <UIPEthernet.h>
8
9byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
10EthernetServer server(80);
11
12void setup() {
13 Serial.begin(115200);
14 Ethernet.begin(mac);
15 server.begin();
16 Serial.print("IP: "); Serial.println(Ethernet.localIP());
17}
18
19void loop() {
20 EthernetClient client = server.available();
21 if (client) {
22 client.println("HTTP/1.1 200 OK");
23 client.println("Content-Type: text/plain");
24 client.println();
25 client.println("Hello from Ekostra!");
26 client.stop();
27 }
28}
SPI Ethernet controller - wired internet connectivity.
The classic Arduino ”Ethernet” library was written for Wiznet chips, not the ENC28J60 - use a library written specifically for this chip, such as UIPEthernet, which provides a compatible API but the correct low-level driver underneath. Many ENC28J60 breakouts run their logic at 3.3V and are not reliably 5V tolerant on the SPI lines, so check your specific board and use level shifting if pairing with a 5V Arduino Uno. And unlike most networked hardware, this chip has no factory-assigned MAC address - your code must define one, and if you have multiple boards on the same network, make sure each uses a unique MAC address to avoid IP conflicts.