will be read-only starting December 31st, 2018. For more info please look at this Forum Post

Mcp23s17 library for Arduino


A C++ object to control the Microchip MCP23S17 16-bit IO Exapander. For the Arduino Platform.

Mcp23s17 is a simple object which mimics the typical Arduino functions for digital reads, digital writes, to set output pins etc. To use, we just wire up the SPI bus and instantiate a new object. By default, the chip powers up with all pins configured as high-impedance inputs. This library may also work with other AVR microcontroller devices (again, after some tweaking). This library was tested on Arduino UNO.

Pretty much everything is explained within the example sketch file. Open Mcp23s17Example.pde in Arduino IDE and upload it to your microcontroller device. Check that all of the SPI interface pins are connected OK for your model. There will be some tweaking needed for the Arduino MEGA family of devices.



Download the latest version of the Mcp23s17 library from GitHub. Includes example .pde file.



  • 1.0 2011/03/26: Initial release


  • All 16 pins are read / written to at once
  • Generally fast SPI operation (up to 10Mhz)
  • Generic example (works with all 328P Arduinos)
  • Requires only very minor modifications for Arduino MEGA.
  • Can instantiate multiple Mcp23s17 objects, one for each connected device
  • Very simple public interface and very few configuration
  • Single-pin commands `obj.pinMode()`, `obj.digitalRead()`, `obj.digitalWrite()`
  • As this is 16-bit IO expander, then 16-bit addressing with uint16_t datatype
  • `obj.port()` to read or write to both ports at once.
  • No methods for the 2x 8-bit ports individually (not needed).


\* Other versions of Arduino Spi library (such as `SPI.h`) wont work / wernt tested.


  • Mcp23s17 Version 1 - By Dreamcat4.