Skip to content

add possibility to pass in a Wire instance #49

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Aug 11, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 38 additions & 35 deletions Adafruit_MCP23017.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,19 @@
#endif

// minihelper to keep Arduino backward compatibility
static inline void wiresend(uint8_t x) {
static inline void wiresend(uint8_t x, TwoWire *theWire) {
#if ARDUINO >= 100
Wire.write((uint8_t)x);
theWire->write((uint8_t)x);
#else
Wire.send(x);
theWire->send(x);
#endif
}

static inline uint8_t wirerecv(void) {
static inline uint8_t wirerecv(TwoWire *theWire) {
#if ARDUINO >= 100
return Wire.read();
return theWire->read();
#else
return Wire.receive();
return theWire->receive();
#endif
}

Expand All @@ -70,22 +70,22 @@ uint8_t Adafruit_MCP23017::regForPin(uint8_t pin, uint8_t portAaddr,
*/
uint8_t Adafruit_MCP23017::readRegister(uint8_t addr) {
// read the current GPINTEN
Wire.beginTransmission(MCP23017_ADDRESS | i2caddr);
wiresend(addr);
Wire.endTransmission();
Wire.requestFrom(MCP23017_ADDRESS | i2caddr, 1);
return wirerecv();
_wire->beginTransmission(MCP23017_ADDRESS | i2caddr);
wiresend(addr, _wire);
_wire->endTransmission();
_wire->requestFrom(MCP23017_ADDRESS | i2caddr, 1);
return wirerecv(_wire);
}

/**
* Writes a given register
*/
void Adafruit_MCP23017::writeRegister(uint8_t regAddr, uint8_t regValue) {
// Write the register
Wire.beginTransmission(MCP23017_ADDRESS | i2caddr);
wiresend(regAddr);
wiresend(regValue);
Wire.endTransmission();
_wire->beginTransmission(MCP23017_ADDRESS | i2caddr);
wiresend(regAddr, _wire);
wiresend(regValue, _wire);
_wire->endTransmission();
}

/**
Expand Down Expand Up @@ -113,14 +113,16 @@ void Adafruit_MCP23017::updateRegisterBit(uint8_t pin, uint8_t pValue,
* Initializes the MCP23017 given its HW selected address, see datasheet for
* Address selection.
* @param addr Selected address
* @param theWire the I2C object to use, defaults to &Wire
*/
void Adafruit_MCP23017::begin(uint8_t addr) {
void Adafruit_MCP23017::begin(uint8_t addr, TwoWire *theWire) {
if (addr > 7) {
addr = 7;
}
i2caddr = addr;
_wire = theWire;

Wire.begin();
_wire->begin();

// set defaults!
// all inputs on port A and B
Expand All @@ -131,8 +133,9 @@ void Adafruit_MCP23017::begin(uint8_t addr) {
/**
* Initializes the default MCP23017, with 000 for the configurable part of the
* address
* @param theWire the I2C object to use, defaults to &Wire
*/
void Adafruit_MCP23017::begin(void) { begin(0); }
void Adafruit_MCP23017::begin(TwoWire *theWire) { begin(0, theWire); }

/**
* Sets the pin mode to either INPUT or OUTPUT
Expand All @@ -152,13 +155,13 @@ uint16_t Adafruit_MCP23017::readGPIOAB() {
uint8_t a;

// read the current GPIO output latches
Wire.beginTransmission(MCP23017_ADDRESS | i2caddr);
wiresend(MCP23017_GPIOA);
Wire.endTransmission();
_wire->beginTransmission(MCP23017_ADDRESS | i2caddr);
wiresend(MCP23017_GPIOA, _wire);
_wire->endTransmission();

Wire.requestFrom(MCP23017_ADDRESS | i2caddr, 2);
a = wirerecv();
ba = wirerecv();
_wire->requestFrom(MCP23017_ADDRESS | i2caddr, 2);
a = wirerecv(_wire);
ba = wirerecv(_wire);
ba <<= 8;
ba |= a;

Expand All @@ -173,28 +176,28 @@ uint16_t Adafruit_MCP23017::readGPIOAB() {
uint8_t Adafruit_MCP23017::readGPIO(uint8_t b) {

// read the current GPIO output latches
Wire.beginTransmission(MCP23017_ADDRESS | i2caddr);
_wire->beginTransmission(MCP23017_ADDRESS | i2caddr);
if (b == 0)
wiresend(MCP23017_GPIOA);
wiresend(MCP23017_GPIOA, _wire);
else {
wiresend(MCP23017_GPIOB);
wiresend(MCP23017_GPIOB, _wire);
}
Wire.endTransmission();
_wire->endTransmission();

Wire.requestFrom(MCP23017_ADDRESS | i2caddr, 1);
return wirerecv();
_wire->requestFrom(MCP23017_ADDRESS | i2caddr, 1);
return wirerecv(_wire);
}

/**
* Writes all the pins in one go. This method is very useful if you are
* implementing a multiplexed matrix and want to get a decent refresh rate.
*/
void Adafruit_MCP23017::writeGPIOAB(uint16_t ba) {
Wire.beginTransmission(MCP23017_ADDRESS | i2caddr);
wiresend(MCP23017_GPIOA);
wiresend(ba & 0xFF);
wiresend(ba >> 8);
Wire.endTransmission();
_wire->beginTransmission(MCP23017_ADDRESS | i2caddr);
wiresend(MCP23017_GPIOA, _wire);
wiresend(ba & 0xFF, _wire);
wiresend(ba >> 8, _wire);
_wire->endTransmission();
}

/*!
Expand Down
5 changes: 3 additions & 2 deletions Adafruit_MCP23017.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
*/
class Adafruit_MCP23017 {
public:
void begin(uint8_t addr);
void begin(void);
void begin(uint8_t addr, TwoWire *theWire = &Wire);
void begin(TwoWire *theWire = &Wire);

void pinMode(uint8_t p, uint8_t d);
void digitalWrite(uint8_t p, uint8_t d);
Expand All @@ -42,6 +42,7 @@ class Adafruit_MCP23017 {

private:
uint8_t i2caddr;
TwoWire *_wire; //!< pointer to a TwoWire object

uint8_t bitForPin(uint8_t pin);
uint8_t regForPin(uint8_t pin, uint8_t portAaddr, uint8_t portBaddr);
Expand Down
17 changes: 17 additions & 0 deletions examples/custom_frequency/custom_frequency.ino
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#include <Wire.h>
#include "Adafruit_MCP23017.h"

// Sample for usage of two MCP23017 I/O expander with an ESP32
// public domain!

Adafruit_MCP23017 mcp;

void setup() {

Wire.setClock(1700000); // set frequency to 1.7mhz

mcp.begin(&Wire); // use default address 0
}

void loop() {
}