GY-63_MS5611/libraries/MCP23017_RT
2023-11-13 17:07:54 +01:00
..
.github 0.4.0 MCP23017 2023-02-04 11:37:40 +01:00
examples 0.3.1 MCP23017_RT 2022-09-28 11:19:03 +02:00
test 0.2.5 MCP23017_RT 2021-12-21 17:12:20 +01:00
.arduino-ci.yml 0.3.2 MCP23017_RT 2022-11-17 16:46:22 +01:00
CHANGELOG.md 0.4.2 MCP23017_RT 2023-11-13 17:07:54 +01:00
CMakeLists.txt 0.4.1 MCP23017_RT 2023-09-23 16:25:55 +02:00
keywords.txt 0.4.1 MCP23017_RT 2023-09-23 16:25:55 +02:00
library.json 0.4.2 MCP23017_RT 2023-11-13 17:07:54 +01:00
library.properties 0.4.2 MCP23017_RT 2023-11-13 17:07:54 +01:00
LICENSE 0.4.0 MCP23017 2023-02-04 11:37:40 +01:00
MCP23017.cpp 0.4.2 MCP23017_RT 2023-11-13 17:07:54 +01:00
MCP23017.h 0.4.2 MCP23017_RT 2023-11-13 17:07:54 +01:00
README.md 0.4.2 MCP23017_RT 2023-11-13 17:07:54 +01:00

Arduino CI Arduino-lint JSON check GitHub issues

License: MIT GitHub release PlatformIO Registry

MCP23017_RT

Arduino library for MCP23017 16 channel I2C port expander.

Description

This library gives easy control over the 16 pins of a (I2C) MCP23017 chip.

This IC is strongly related tot the MCP23S17 SPI port expander - https://github.com/RobTillaart/MCP23S17 Programming Interface is kept the same as much as possible.

Since 0.3.1 the digitalWrite(pin, value) is optimized. If a pin is not changed it will not be written again to save time.

REV D - June 2022

The I2C IO expander MCP23017 has changed according to the new data sheet. It is now a 14/16-bit IO expander. The pins GPA7 and GPB7 have lost their input mode, output mode still works. The chips look the same and did not change names. This implies it not possible to read 8 bits in parallel at the exact same moment any more. The REV D version now need reading both A and B register to get 8 bits parallel (with a minor delay).

Details see:

Note: the library has no provisions (yet) for detecting DEV D chips or handle them in a special way.

16 bit port expanders

8 bit port expanders

Interface

#include "MCP23017.h"

Constructor

  • MCP23017(uint8_t address, TwoWire *wire = &Wire) constructor, with default Wire interface.
    Can be overruled with Wire0..WireN.
  • bool begin() for UNO, returns true if successful.
  • bool begin(uint8_t sda, uint8_t scl) for ESP32, returns true if successful.
  • bool isConnected() returns true if connected, false otherwise.

Single pin interface

  • bool pinMode(uint8_t pin, uint8_t mode) pin = 0..15, mode = INPUT, OUTPUT. Returns true if successful.
  • bool digitalWrite(uint8_t pin, uint8_t value) pin = 0..15, value = LOW(0) HIGH (!0). Returns true if successful.
  • uint8_t digitalRead(uint8_t pin) pin = 0..15, returns LOW or HIGH, might set the lastError();
  • bool setPolarity(uint8_t pin, bool reversed) pin = 0..15, set reversed flag. Returns true if successful.
  • bool getPolarity(uint8_t pin, bool &reversed) pin = 0..15, reads reversed flag. Returns true if successful.
  • bool setPullup(uint8_t pin, bool pullup) pin = 0..15, set pull-up flag. Returns true if successful.
  • bool getPullup(uint8_t pin, bool &pullup) pin = 0..15, reads pull-up flag. Returns true if successful.

8 pins interface

  • bool pinMode8(uint8_t port, uint8_t value) port = 0..1, value = 0..255. Returns true if successful.
  • bool write8(uint8_t port, uint8_t value) port = 0..1, value = 0..255. Returns true if successful.
  • uint8_t read8(uint8_t port) port = 0..1, reads 8 pins into one byte.
  • bool setPolarity8(uint8_t port, uint8_t mask) port = 0..1, sets polarity for 8 channels at once. Returns true if successful.
  • bool getPolarity8(uint8_t port, uint8_t &mask) port = 0..1, reads polarity of 8 channels at once. Returns true if successful.
  • bool setPullup8(uint8_t port, uint8_t mask) port = 0..1, sets pull-up for 8 channels at once. Returns true if successful.
  • bool getPullup8(uint8_t port, uint8_t &mask) port = 0..1, reads pull-up for 8 channels at once. Returns true if successful.

16 pins interface

  • bool pinMode16(uint16_t value) value = 0..0xFFFF. Returns true if successful.
  • bool write16(uint16_t value) value = 0..0xFFFF. Returns true if successful.
  • uint16_t read16() reads 16 pins into an uint16_t.
  • bool setPolarity16(uint16_t mask) sets polarity for 16 channels. Returns true if successful.
  • bool getPolarity16(uint16_t &mask) reads polarity of 16 channels. Returns true if successful.
  • bool setPullup16(uint16_t mask) sets pull-up for 16 channels. Returns true if successful.
  • bool getPullup16(uint16_t &mask) reads pull-up for 16 channels. Returns true if successful.

Error codes

If one of the above functions return false, there might be an error.

  • int lastError() Above functions set an error flag that can be read with this function.
    Reading it will reset the flag to MCP23017_OK.
Description Value
MCP23017_OK 0x00
MCP23017_PIN_ERROR 0x81
MCP23017_I2C_ERROR 0x82
MCP23017_VALUE_ERROR 0x83
MCP23017_PORT_ERROR 0x84

Future

Must

  • Improve and extend documentation
  • add examples

Should

  • extend error codes
  • optimize code - squeeze footprint
  • investigate if REV D chips can be detected.

Could

  • initial value (16 bit?) as begin parameter (breaking change)
    • depends on input output pull-up etc
  • investigate auto address increment

Wont

Support

If you appreciate my libraries, you can support the development and maintenance. Improve the quality of the libraries by providing issues and Pull Requests, or donate through PayPal or GitHub sponsors.

Thank you,