Remarks

Mcp23017
Status Status badge: working
Source code GitHub
Datasheet(s) GitHub
NuGet package NuGet Gallery for Meadow.Foundation.ICs.IOExpanders.Mcp23xxx

Code Example

Mcp23017 mcp;

public override Task Initialize()
{
    IDigitalInputPort interruptPort = Device.CreateDigitalInputPort(Device.Pins.D00, InterruptMode.EdgeRising);
    IDigitalOutputPort resetPort = Device.CreateDigitalOutputPort(Device.Pins.D01);

    mcp = new Mcp23017(Device.CreateI2cBus(), 0x20, interruptPort, resetPort);

    return base.Initialize();
}

public override Task Run()
{
    while (true)
    {
        TestBulkDigitalOutputPortWrites(20);
        TestDigitalOutputPorts(2);
    }
}

void TestDigitalOutputPorts(int loopCount)
{
    var out00 = mcp.CreateDigitalOutputPort(mcp.Pins.GPA0);
    var out01 = mcp.CreateDigitalOutputPort(mcp.Pins.GPA1);
    var out02 = mcp.CreateDigitalOutputPort(mcp.Pins.GPA2);
    var out03 = mcp.CreateDigitalOutputPort(mcp.Pins.GPA3);
    var out04 = mcp.CreateDigitalOutputPort(mcp.Pins.GPA4);
    var out05 = mcp.CreateDigitalOutputPort(mcp.Pins.GPA5);
    var out06 = mcp.CreateDigitalOutputPort(mcp.Pins.GPA6);
    var out07 = mcp.CreateDigitalOutputPort(mcp.Pins.GPA7);

    var outputPorts = new List<IDigitalOutputPort>() 
    {
        out00, out01, out02, out03, out04, out05, out06, out07
    };

    foreach (var outputPort in outputPorts)
    {
        outputPort.State = true;
    }

    for(int l = 0; l < loopCount; l++) 
    {
        // loop through all the outputs
        for (int i = 0; i < outputPorts.Count; i++) 
        {
            // turn them all off
            foreach (var outputPort in outputPorts) 
            {
                outputPort.State = false; 
            }

            // turn on just one
            outputPorts[i].State = true;
            Thread.Sleep(250);
        }
    }

    // cleanup
    for (int i = 0; i < outputPorts.Count; i++) 
    {
        outputPorts[i].Dispose();
    }
}

void TestBulkDigitalOutputPortWrites(int loopCount)
{
    byte mask = 0x0;

    for (int l = 0; l < loopCount; l++) 
    {
        for (int i = 0; i < 8; i++) 
        {
            mcp.WriteToPorts(mask);
            mask = (byte)(1 << i);
            Thread.Sleep(5);
        }
    }
}

Sample project(s) available on GitHub

Wiring Example

To wire a Mcp23017 to your Meadow board, connect the following:

Mcp23017 Meadow Pin
GND GND
VCC 3V3
SCL D08 (SCL Pin)
SDA D07 (SDA Pin)
Characteristic Locus
Inheritance System.Object Mcp23xxx Mcp23x1x > Mcp23017
Inherited Members Mcp23x1x.Pins Mcp23x1x.NumberOfPins Mcp23x1x.IsValidPin(IPin) Mcp23x1x.GetPin(String) Mcp23xxx.GetAddressFromPins(Boolean, Boolean, Boolean) Mcp23xxx.InputChanged Mcp23xxx._lock Mcp23xxx.ResetMcp() Mcp23xxx.Initialize() Mcp23xxx.CreateDigitalOutputPort(IPin, Boolean, OutputType) Mcp23xxx.CreateDigitalInputPort(IPin) Mcp23xxx.CreateDigitalInputPort(IPin, InterruptMode, ResistorMode) Mcp23xxx.CreateDigitalInputPort(IPin, InterruptMode, ResistorMode, TimeSpan) Mcp23xxx.CreateDigitalInputPort(IPin, InterruptMode, ResistorMode, TimeSpan, TimeSpan) Mcp23xxx.SetPortDirection(IPin, PortDirectionType) Mcp23xxx.WriteToPort(IPin, Boolean) Mcp23xxx.ReadPort(IPin) Mcp23xxx.WriteToPorts(Byte) Mcp23xxx.ReadFromPorts(Mcp23xxx.PortBank) Mcp23xxx.ResetPin(IPin)
Namespace Meadow.Foundation.ICs.IOExpanders
Assembly Mcp23xxx.dll

Syntax

public class Mcp23017 : Mcp23x1x

Constructors

Mcp23017(II2cBus, Byte, IDigitalInputPort, IDigitalOutputPort)

Creates an Mcp23017 object

Declaration
public Mcp23017(II2cBus i2cBus, byte address = null, IDigitalInputPort interruptPort = null, IDigitalOutputPort resetPort = null)

Parameters

Type Name Description
II2cBus i2cBus

The I2C bus

System.Byte address

The I2C address

IDigitalInputPort interruptPort

The interrupt port

IDigitalOutputPort resetPort

Optional Meadow output port used to reset the mcp expander