Search Results for

    Show / Hide Table of Contents

    Pca95x4 - I2C GPIO Expander

    The PCA95x4 provides 8 bits of General Purpose parallel Input/Output (GPIO) expansion for I2C-bus applications.

    Documentation

    • Philips I2C IO expanders application notes can be found here

    NXP

    • PCA9534 datasheet
    • PCA9534A datasheet
    • PCA9554/PCA9554A datasheet

    Texas Instruments

    • PCA9534 datasheet
    • PCA9534A datasheet
    • PCA9554 datasheet
    • PCA9554A datasheet

    Board

    Connection Diagram

    Usage

    Important: make sure you properly setup the I2C pins especially for ESP32 before creating the I2cDevice, make sure you install the nanoFramework.Hardware.ESP32 nuget:

    //////////////////////////////////////////////////////////////////////
    // when connecting to an ESP32 device, need to configure the I2C GPIOs
    // used for the bus
    Configuration.SetPinFunction(21, DeviceFunction.I2C1_DATA);
    Configuration.SetPinFunction(22, DeviceFunction.I2C1_CLOCK);
    

    For other devices like STM32, please make sure you're using the preset pins for the I2C bus you want to use.

    This example shows how to write value out to 8 LEDs using a PCA95x4 device and a MCU.

    I2cConnectionSettings i2cConnectionSettings = new(1, 0x38);
    I2cDevice i2cDevice = I2cDevice.Create(i2cConnectionSettings);
    pca95x4 = new Pca95x4(i2cDevice);
    

    Cycle output bits

    pca95x4.Write(Register.Configuration, 0x00);  // Make all outputs.
    pca95x4.Write(Register.OutputPort, 0xFF);  // Set all outputs.
    
    for (int bitNumber = 0; bitNumber < 8; bitNumber++)
    {
        pca95x4.WriteBit(Register.OutputPort, bitNumber, false);  // Clear output.
        Thread.Sleep(500);
        pca95x4.WriteBit(Register.OutputPort, bitNumber, true);  // Set output.
    }
    

    Read Input Port

    pca95x4.Write(Register.Configuration, 0xFF);  // Make all inputs.
    byte data = pca95x4.Read(Register.InputPort);
    Debug.WriteLine($"Input Port: 0x{data:X2}");
    

    Check Input Register Polarity Inversion

    pca95x4.Write(Register.Configuration, 0xFF);  // Make all inputs.
    byte data = pca95x4.Read(Register.InputPort);
    Debug.WriteLine($"Input Register: 0x{data:X2}");
    pca95x4.InvertInputRegisterPolarity(true);
    data = pca95x4.Read(Register.InputPort);
    Debug.WriteLine($"Input Register Polarity Inverted: 0x{data:X2}");
    pca95x4.InvertInputRegisterPolarity(false);
    data = pca95x4.Read(Register.InputPort);
    Debug.WriteLine($"Input Register: 0x{data:X2}");
    

    Binding Notes

    PCA9534/PCA9554 and PCA9534A/PCA9554A are identical except for a few differences.

    • The removal of the internal I/O pull-up resistor which greatly reduces power consumption when the I/Os are held LOW.
    • Each has a fixed I2C address. This allows for up to 16 of these devices (8 of each) on the same I2C bus.
    • Improve this Doc
    In This Article
    Back to top Copyright © 2023 nanoFramework Contributors
    Generated by DocFX