Connect an ENC28J60 Ethernet module to an Arduino or a Raspberry Pi

Update 2017: As prices on the W5100 and W5500 modules and shields have also dropped considerably, choosing the W5100 or W5500 is often the better option. However, the W5100 modules can be a bit fiddly to use. Check out how to deal with some of the problems here.
Update 2018: The cheapest ENC28J60 board I now could find is 2.25 Euro, the cheapest W5500 is 2.70 euro.

With prices of ENC28J60 Ethernet modules coming down drastically with some as low as 4,60 euro, (even cheaper here much cheaper even here), buying one of these to connect barebones Arduino projects to the web becomes more and more attractive.  The ENC28J60 has astandard SPI interface. With the official ENC28J60 Ethershield and Ethercard, just sticking it in  the Arduino is easy and takes care of the proper connections, but with one of these modules, we need to make these connections ourselves. Though the Vcc is 3.3 Volt, the datasheet states the I/O  pins to be 5 V tolerant, which makes it easy to interface with the 5 Volt Arduino. The datasheet (blz. 10) shows that a level-shifter is recommended for the WOL (WakeOnLan), the interrupt and the chip’s MISO. However, this is a general recommendation, because  the manufacturer does not know to what MCU you plan to connect the ENC28J60. For use with the Arduino the levelshifter is not necessary. So we just can make the following hardware SPI connections:

ENC28J60 Arduino
CS D8 (or D10, read further) SS
VCC  Separate 3V3

Should you for any reason decide to use levelshifters, they need to be tri-state, to ensure proper SPI functioning when sharing the bus.

For the ENC28J60 chip/module, there are several Arduino libraries available: Ethershield (development has stopped) and Ethercard (the newest). There is also the UIPEthernet from Norbert Truchsess, that is compatible to the W5100 Ethernet library. To be clear:  the Ethernet library is for the WIZ5100 ethernetshield, using the UIPEthernet library makes (most of) the WIZ5100 based programs suitable for the ENC28J60.

(Update: The Ethershield Library is no longer compatible with the Arduino IDE as the “prog_char” deftype is deprecated. Although it is simple to modify the various library files, you need to ask yourself if that is worth the trouble, as there are more modern libraries. If you still want to do it:Replace prog_char with const char, and do the same for other prog_”datatype” typedefs. If there is a PROGMEM const char *string_table[] =, replace with PGM_P const string_table[]  PROGMEM =)

A note on the Chipselect CS
The use of the proper CS pin is depending on what library one uses for the ENC28J60.
there are defacto three libraries:

  • The Ethershield library uses pin 10 as a chipselect
  • The EtherCard library uses pin 8 as a chipselect
  • The UUPEthernet library uses pin 10 as a chipselect

The reason for this change from 10 to 8  is to be able to use the Ethercard together with an SD card.

If you buy a module, rather than a shield, it is very easy to determine what chipselect pin you want to use. If you use the older EtherShield library, use pin 10 as CS, if you use the somewhat newer Ethercard library, use  pin 8.

If for whatever reason you want to use the Ethercard library with pin 10, change the pin assignment in the library files ENC28J60.h (line 25 and 41 I believe)   and the EtherCard.h  (Line 134: uint8_t csPin = 8 ). (Depending on the version it can also be in line 154.)

Screenshot from 2013-10-01 17:15:11

It is also possible to add the declaration for pin 10 in the program itself like this:

ether.begin(sizeof Ethernet::buffer, mymac, 10)

This card works with a Mega2650 if you override the CS pin in the sketch. The pin mapping is –

ENC28J60 Mega2650
SO 50 (MISO)
SI 51 (MOSI)
SCK 52 (SCK)
CS 53 (SS)

In the sketch you need to override the begin with ether.begin(sizeof Ethernet::buffer, mymac, 53) (note the 53) because the default is for pin 8 on a UNO. If you use another pin for the CS you will need to manually set pin 53 as an output or SPI doesn’t work.

The RST and INT pin can be connected as follows but it is not strictly necessary

ENC28J60 UNO Mega
Vcc 3V3 3V3
INT 2 2
SCK D13 D52
SO 12 50
SI 11 51
CS 10 53

Similar info here

Good info here as well.
Much info on use of the ENC28J60 can be found in Luca Dentella’s blog

Adding the ENC28J60 to a Raspberry Pi

You may wonder why anybody would want to do that, but a good reason would be if you blow up your ethernetport on your Rapberry B or…… if you have a Raspberry Zero or Zero W. True, you could add WiFi to the first one via a USB dongle, sure, but if you want Ethernet, this is how you do it.


ENC28J60 Raspi BCM pins Raspi Physical pins
INT 25 22
SO 9 (MISO) 21
SCK 11 (SCLK) 23
SI 10 (MOSI) 19
CS 8 (CE0) 24

As there sometimes is confusion about the numbering of the pins I added the physical numbers of the pins as well as the BCM numbers

Obviously you connect ground to ground and the Vcc to a suitable source. If your ENC28J60 module has a 5Volt entrance (followed by a 3V3 regulator) you can connect it to the 5V pin of the raspberry.
If the module needs  3V3 on the Vcc, you could try and feed it from the 3v3 pin of the raspberry, but the current draw is a bit outside the specs of the raspberry. In that case it might be wise to add a small 3v3 LDO and feed it from the 5Volt line.

Once you have done that you need to enable SPI on the raspberry. You do that via the raspi-config utility or via Menu > Preferences > Raspberry Pi Configuration> Interfaces tab on the desktop. You could also just uncomment the line dtparam=spi=on in your /boot/config.txt file

Then add the following to your /boot/config.txt


reboot and then your Ethernet should work


Microphone pre-amp for microcontrollers


This microphone amplifier is based arond the TLC272 double opamp.
The first opamp is  used as an amplifier. The voltage offset on the positive input is set to half Vcc with R2 and R3. The Closedloop gain is set at 100 by R5 and R4. There is an AC coupling/high pass filter to the 2nd opamp by C4 and R6. The second opamp is used as comparator: R7 and R8 determine a level sensitivity of 71 mV (with 5 Volt Vcc).

SPL is the sound pressure level. There is also an audio output for the amplified microphone signal. As the audio signal is DC coupled, the signal will swing around 1/2 Vcc

Microphone pre-amp for Arduino
Note: In the picture you may see a TL072 chip rather than a TS272 (TLC272). That is because I briefly tried that one. The TL072 is a double opamp especially for audio purposes. My results with it however were not so convincing. Best use the TS272 (TLC272)