diff --git a/src/Adafruit_MCP23X17.cpp b/src/Adafruit_MCP23X17.cpp index 1479845..7423837 100644 --- a/src/Adafruit_MCP23X17.cpp +++ b/src/Adafruit_MCP23X17.cpp @@ -97,4 +97,33 @@ void Adafruit_MCP23X17::enableAddrPins() { GPIONoAddr.write((1 << 3), 1); // Bit3: HAEN, devices with A2 = 0 GPIOAddr.write((1 << 3), 1); // Devices with A2 = 1 (if any) +} + +/**************************************************************************/ +/*! + @brief Get pin states captured at time of interrupt on Port A. + @returns Mutli-bit value representing pin states. +*/ +/**************************************************************************/ +uint8_t Adafruit_MCP23X17::getCapturedInterruptA() { + uint8_t intcap; + + Adafruit_BusIO_Register INTCAPA(i2c_dev, spi_dev, MCP23XXX_SPIREG, + getRegister(MCP23XXX_INTCAP, 0)); + INTCAPA.read(&intcap); + return intcap; +} + +/**************************************************************************/ +/*! + @brief Get pin states captured at time of interrupt on Port B. + @returns Mutli-bit value representing pin states. +*/ +/**************************************************************************/ +uint8_t Adafruit_MCP23X17::getCapturedInterruptB() { + uint8_t intcap; + Adafruit_BusIO_Register INTCAPB(i2c_dev, spi_dev, MCP23XXX_SPIREG, + getRegister(MCP23XXX_INTCAP, 1)); + INTCAPB.read(&intcap); + return intcap; } \ No newline at end of file diff --git a/src/Adafruit_MCP23X17.h b/src/Adafruit_MCP23X17.h index 49f35ac..4e33724 100644 --- a/src/Adafruit_MCP23X17.h +++ b/src/Adafruit_MCP23X17.h @@ -23,6 +23,8 @@ class Adafruit_MCP23X17 : public Adafruit_MCP23XXX { uint16_t readGPIOAB(); void writeGPIOAB(uint16_t value); void enableAddrPins(); + uint8_t getCapturedInterruptA(); + uint8_t getCapturedInterruptB(); }; #endif \ No newline at end of file diff --git a/src/Adafruit_MCP23X18.cpp b/src/Adafruit_MCP23X18.cpp new file mode 100644 index 0000000..d8accf4 --- /dev/null +++ b/src/Adafruit_MCP23X18.cpp @@ -0,0 +1,32 @@ +/*! + * @file Adafruit_MCP23X18.cpp + */ + +#include "Adafruit_MCP23X18.h" + +/**************************************************************************/ +/*! + @brief default ctor. +*/ +/**************************************************************************/ +Adafruit_MCP23X18::Adafruit_MCP23X18() { pinCount = 16; } + +/**************************************************************************/ +/*! + @brief Configures the specified pin to behave either as an input or an + output. + @param pin the Arduino pin number to set the mode of + @param mode INPUT, OUTPUT, or INPUT_PULLUP +*/ +/**************************************************************************/ +void Adafruit_MCP23X18::pinMode(uint8_t pin, uint8_t mode) { + Adafruit_BusIO_Register IODIR(i2c_dev, spi_dev, MCP23XXX_SPIREG, + getRegister(MCP23XXX_IODIR, MCP_PORT(pin))); + Adafruit_BusIO_Register GPPU(i2c_dev, spi_dev, MCP23XXX_SPIREG, + getRegister(MCP23XXX_GPPU, MCP_PORT(pin))); + Adafruit_BusIO_RegisterBits dir_bit(&IODIR, 1, pin % 8); + Adafruit_BusIO_RegisterBits pullup_bit(&GPPU, 1, pin % 8); + + dir_bit.write((mode == OUTPUT) ? 0 : 1); + pullup_bit.write((mode == INPUT_PULLUP || mode == OUTPUT_PULLUP) ? 1 : 0); +} \ No newline at end of file diff --git a/src/Adafruit_MCP23X18.h b/src/Adafruit_MCP23X18.h new file mode 100644 index 0000000..8cd97b1 --- /dev/null +++ b/src/Adafruit_MCP23X18.h @@ -0,0 +1,24 @@ +/*! + * @file Adafruit_MCP23X18.h + */ + +#ifndef __ADAFRUIT_MCP23X18_H__ +#define __ADAFRUIT_MCP23X18_H__ + +#include "Adafruit_MCP23X17.h" + +#define OUTPUT_PULLUP 4 //!< Additional define for Output with Pullup + +/**************************************************************************/ +/*! + @brief Class for MCP23018 I2C and MCP23S18 SPI variants. +*/ +/**************************************************************************/ +class Adafruit_MCP23X18 : public Adafruit_MCP23X17 { +public: + Adafruit_MCP23X18(); + + void pinMode(uint8_t pin, uint8_t mode); +}; + +#endif