Remarks

MCP23008
Status Not Working
Source code GitHub
NuGet package Not Published

The MCP23008 chip is an 8-bit (8 port) digital I/O expander chip that uses I2C to communicate. It can be used to add additional digital input and output ports to Meadow and can be combined with up to eight MCP23008 chips in total, providing 64 additional ports.

MCP23008 is a ubiquitous chip in the hardware world and is the typical interface chip for common I2C LCD backpacks, with the 74595 chip being the typical interface chip for SPI LCD backpacks.

NOTE This is a pre-release driver, and interrupts have not been implemented yet.

MCP Chip Family

In addition to the MCP23008, the MCP family of chips includes; the MCP23017, which is a 16-bit version of the MCP23008, offering 16 digital ports in total, and the MCP23S08 and MCP23S017 which are SPI versions of the MCP23008 and MCP23017, respectively.

Chip Addressing

The I2C address of the chip is configurable via the address pins and is in the binary form of 0100[A2][A1][A0], where A2, A1, and A0 refer to the three address pins on the chip:

For example, if all address pins were tied to ground, then the address of the chip would be 0100000 in binary, or 0x20 in hex, and 32 in decimal.

The I2C addresses can then be as follows, where 0 represents an address pin connected to ground, and 1 represents an address pin connected to 3.3V:

address header A2 A1 A0 Resulting Hex Address Resulting Decimal Address
0100 0 0 0 0x20 32
0100 0 0 1 0x21 33
0100 0 1 0 0x22 34
0100 0 1 1 0x23 35
0100 1 0 0 0x24 36
0100 1 0 1 0x25 37
0100 1 1 0 0x26 38
0100 1 1 1 0x27 39

Because there are 8 address possibilities, it's possible to put 8 MCP23008 chips on a single I2C bus.

To make this simpler, when instantiating an MCP23008 object, there is a constructor overload that takes the address pin configurations instead of an address, so that Meadow.Foundation uses the appropriate address based on the pins, instead of requiring a pre-computed address.

Other Pins

In addition to the address pins, there are a number of other pins that must be connected up:

  • Not Reset - The RESET pin is actually a "Not Reset." The line above "Reset" means "not." So unless that pin is pulled high (3.3V), the chip will reset itself at random times and you'll get connection errors.
  • SCL and SDA - The SCL and SDA pins are the I2C clock and data pins and go to the SC and SD pins on the Meadow, respectively. Each of these should also generally be pulled high (3.3V) via a 4.7kΩ resistor. See the I2C guide for more information.
  • INT - The INT pin is for interrupt notifications, and is only necessary when using the GPIO pins in input mode and you want an event raised when the input value changes.
  • VSS and VDD - These go to ground and 3.3V power, respectively, and power the chip.

Wiring Example

Characteristic Locus
Inheritance System.Object > Mcp23008
Inherited Members System.Object.ToString() System.Object.Equals(System.Object) System.Object.Equals(System.Object, System.Object) System.Object.ReferenceEquals(System.Object, System.Object) System.Object.GetHashCode() System.Object.GetType() System.Object.MemberwiseClone()
Namespace Meadow.Foundation.ICs.IOExpanders
Assembly MCP23008.dll

Syntax

public class Mcp23008

Constructors

View Source

Mcp23008()

Declaration
protected Mcp23008()
View Source

Mcp23008(II2cBus, Byte)

Declaration
public Mcp23008(II2cBus i2cBus, byte address = 32)

Parameters

Type Name Description
II2cBus i2cBus
System.Byte address

Fields

View Source

_lock

object for using lock() to do thread synch

Declaration
protected object _lock

Field Value

Type Description
System.Object

Methods

View Source

ConfigureInputPort(Byte, Boolean, Boolean)

Declaration
public void ConfigureInputPort(byte pin, bool enablePullUp = false, bool enableInterrupt = true)

Parameters

Type Name Description
System.Byte pin
System.Boolean enablePullUp
System.Boolean enableInterrupt
View Source

CreateInputPort(IIODevice, IPin, Boolean)

Declaration
public IDigitalInputPort CreateInputPort(IIODevice device, IPin pin, bool enablePullUp = false)

Parameters

Type Name Description
IIODevice device
IPin pin
System.Boolean enablePullUp

Returns

Type Description
IDigitalInputPort
View Source

CreateOutputPort(Byte, Boolean)

Creates a new DigitalOutputPort using the specified pin and initial state.

Declaration
public DigitalOutputPort CreateOutputPort(byte pin, bool initialState)

Parameters

Type Name Description
System.Byte pin

The pin number to create the port on.

System.Boolean initialState

Whether the pin is initially high or low.

Returns

Type Description
DigitalOutputPort
View Source

Initialize()

Declaration
protected void Initialize()
View Source

IsValidPin(Byte)

Declaration
protected bool IsValidPin(byte pin)

Parameters

Type Name Description
System.Byte pin

Returns

Type Description
System.Boolean
View Source

ReadPort(Byte)

Declaration
public bool ReadPort(byte pin)

Parameters

Type Name Description
System.Byte pin

Returns

Type Description
System.Boolean
View Source

SetPortDirection(Byte, PortDirectionType)

Sets the direction of a particulare port.

Declaration
public void SetPortDirection(byte pin, PortDirectionType direction)

Parameters

Type Name Description
System.Byte pin
PortDirectionType direction
View Source

WriteToPort(Byte, Boolean)

Sets a particular pin's value. If that pin is not in output mode, this method will first set its mode to output.

Declaration
public void WriteToPort(byte pin, bool value)

Parameters

Type Name Description
System.Byte pin

The pin to write to.

System.Boolean value

The value to write. True for high, false for low.

View Source

WriteToPorts(Byte)

Outputs a byte value across all of the pins by writing directly to the output latch (OLAT) register.

Declaration
public void WriteToPorts(byte mask)

Parameters

Type Name Description
System.Byte mask

Events

View Source

InterruptRaised

Raised on Interrupt

Declaration
public event EventHandler InterruptRaised

Event Type

Type Description
System.EventHandler