Skip to content

Commit 83677a6

Browse files
authored
Merge pull request #89 from caternuson/intcap
Add INTCAP support
2 parents 0e82c8d + 6f92c72 commit 83677a6

File tree

3 files changed

+54
-12
lines changed

3 files changed

+54
-12
lines changed

examples/mcp23xxx_interrupt/mcp23xxx_interrupt.ino

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ void loop() {
5555
if (!digitalRead(INT_PIN)) {
5656
Serial.print("Interrupt detected on pin: ");
5757
Serial.println(mcp.getLastInterruptPin());
58-
delay(250); // debounce
58+
Serial.print("Pin states at time of interrupt: 0b");
59+
Serial.println(mcp.getCapturedInterrupt(), 2);
60+
delay(250); // debounce
61+
// NOTE: If using DEFVAL, INT clears only if interrupt
62+
// condition does not exist.
63+
// See Fig 1-7 in datasheet.
64+
mcp.clearInterrupts(); // clear
5965
}
6066
}

src/Adafruit_MCP23XXX.cpp

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,25 @@ void Adafruit_MCP23XXX::disableInterruptPin(uint8_t pin) {
207207

208208
/**************************************************************************/
209209
/*!
210-
@brief Gets the last interrupt pin.
211-
@returns Pin that caused last interrupt.
210+
@brief Clear interrupts. NOTE:If using DEFVAL, INT clears only if interrupt
211+
condition does not exist. See Fig 1-7 in datasheet.
212+
*/
213+
/**************************************************************************/
214+
void Adafruit_MCP23XXX::clearInterrupts() {
215+
// reading INTCAP register(s) clears interrupts
216+
// just call this and ignore return
217+
getCapturedInterrupt();
218+
}
219+
220+
/**************************************************************************/
221+
/*!
222+
@brief Gets the pin that caused the latest interrupt, from INTF, without
223+
clearing any interrupt flags.
224+
@returns Pin that caused lastest interrupt.
212225
*/
213226
/**************************************************************************/
214227
uint8_t Adafruit_MCP23XXX::getLastInterruptPin() {
215-
uint8_t intpin = 255;
228+
uint8_t intpin = MCP23XXX_INT_ERR;
216229
uint8_t intf;
217230

218231
// Port A
@@ -227,7 +240,7 @@ uint8_t Adafruit_MCP23XXX::getLastInterruptPin() {
227240
}
228241

229242
// Port B and still not found?
230-
if ((pinCount > 8) && (intpin == 255)) {
243+
if ((pinCount > 8) && (intpin == MCP23XXX_INT_ERR)) {
231244
Adafruit_BusIO_Register INTFB(i2c_dev, spi_dev, MCP23XXX_SPIREG,
232245
getRegister(MCP23XXX_INTF, 1));
233246
INTFB.read(&intf);
@@ -239,15 +252,34 @@ uint8_t Adafruit_MCP23XXX::getLastInterruptPin() {
239252
}
240253
}
241254

242-
// clear if found
243-
if (intpin != 255) {
244-
Adafruit_BusIO_Register INTCAP(
245-
i2c_dev, spi_dev, MCP23XXX_SPIREG,
246-
getRegister(MCP23XXX_INTCAP, MCP_PORT(intpin)));
247-
INTCAP.read();
255+
return intpin;
256+
}
257+
258+
/**************************************************************************/
259+
/*!
260+
@brief Get pin states captured at time of interrupt.
261+
@returns Mutli-bit value representing pin states.
262+
*/
263+
/**************************************************************************/
264+
uint16_t Adafruit_MCP23XXX::getCapturedInterrupt() {
265+
uint16_t intcap;
266+
uint8_t intf;
267+
268+
// Port A
269+
Adafruit_BusIO_Register INTCAPA(i2c_dev, spi_dev, MCP23XXX_SPIREG,
270+
getRegister(MCP23XXX_INTCAP, 0));
271+
INTCAPA.read(&intf);
272+
intcap = intf;
273+
274+
// Port B ?
275+
if (pinCount > 8) {
276+
Adafruit_BusIO_Register INTCAPB(i2c_dev, spi_dev, MCP23XXX_SPIREG,
277+
getRegister(MCP23XXX_INTCAP, 1));
278+
INTCAPB.read(&intf);
279+
intcap |= (uint16_t)intf << 8;
248280
}
249281

250-
return intpin;
282+
return intcap;
251283
}
252284

253285
/**************************************************************************/

src/Adafruit_MCP23XXX.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
#define MCP_PORT(pin) ((pin < 8) ? 0 : 1) //!< Determine port from pin number
3232

33+
#define MCP23XXX_INT_ERR 255 //!< Interrupt error
34+
3335
/**************************************************************************/
3436
/*!
3537
@brief Base class for all MCP23XXX variants.
@@ -57,7 +59,9 @@ class Adafruit_MCP23XXX {
5759
void setupInterrupts(bool mirroring, bool openDrain, uint8_t polarity);
5860
void setupInterruptPin(uint8_t pin, uint8_t mode = CHANGE);
5961
void disableInterruptPin(uint8_t pin);
62+
void clearInterrupts();
6063
uint8_t getLastInterruptPin();
64+
uint16_t getCapturedInterrupt();
6165

6266
protected:
6367
Adafruit_I2CDevice *i2c_dev = NULL; ///< Pointer to I2C bus interface

0 commit comments

Comments
 (0)