Added support for banked registers
Dependents: Component_Test_Interface FalconWing MX_Spoile_Test Simple_Power_Distribution ... more
Diff: MCP23017.cpp
- Revision:
- 4:868db61f5f4e
- Parent:
- 3:72da9cd002bd
--- a/MCP23017.cpp Sun Aug 21 13:59:48 2011 +0000 +++ b/MCP23017.cpp Mon Feb 13 21:54:29 2012 +0000 @@ -6,6 +6,7 @@ * version 0.2 Initial Release * version 0.3 Cleaned up * version 0.4 Fixed problem with _read method +* version 0.5 Added support for 'Banked' access to registers */ #include "mbed.h" @@ -57,7 +58,10 @@ * @returns */ void MCP23017::_init() { - _write(IOCON, (IOCON_BYTE_MODE | IOCON_HAEN )); // Hardware addressing on, operations toggle between A and B registers + + _bankMode = NOT_BNK; // This may not be true after software reset without hardware reset !!! + + _write(IOCON_AB[_bankMode][PORT_A], (IOCON_BYTE_MODE | IOCON_HAEN )); // Hardware addressing on, no-autoincrement, 16 bit mode (operations toggle between A and B registers) } @@ -67,7 +71,7 @@ * @param char direction pin direction (0 = output, 1 = input) */ void MCP23017::direction(Port port, char direction) { - _write(port + IODIRA, direction); + _write(IODIR_AB[_bankMode][port], direction); } /** Set Pull-Up Resistors on specified MCP23017 Port @@ -76,40 +80,73 @@ * @param char offOrOn per pin (0 = off, 1 = on) */ void MCP23017::configurePullUps(Port port, char offOrOn) { - _write(port + GPPUA, offOrOn); + + _write(GPPU_AB[_bankMode][port], offOrOn); } +/** Configere the Banked or Non-Banked mode +* +* @param Bank bankMode +* @param char offOrOn per pin (0 = off, 1 = on) +*/ +void MCP23017::configureBanked(Bank bankMode) { + + if (bankMode == NOT_BNK) { + // Non-Banked sequential registers (default POR) + // Hardware addressing on, , no-autoincrement, 16 bit mode (operations do toggle between A and B registers) + _write(IOCON_AB[_bankMode][PORT_A], (IOCON_BYTE_MODE | IOCON_HAEN )); + _bankMode = NOT_BNK; + } + else { + // Banked registers + // Hardware addressing on, no-autoincrement, 8 bit mode + _write(IOCON_AB[_bankMode][PORT_A], (IOCON_BANK | IOCON_BYTE_MODE | IOCON_HAEN )); + _bankMode = BNK; + } +} + + void MCP23017::interruptEnable(Port port, char interruptsEnabledMask) { - _write(port + GPINTENA, interruptsEnabledMask); + + _write(GPINTEN_AB[_bankMode][port], interruptsEnabledMask); + } void MCP23017::mirrorInterrupts(bool mirror) { - char iocon = _read(IOCON); - if (mirror) { - iocon = iocon | INTERRUPT_MIRROR_BIT; - } else { - iocon = iocon & ~INTERRUPT_MIRROR_BIT; - } - _write(IOCON, iocon); + char iocon = _read(IOCON_AB[_bankMode][PORT_A]); + + if (mirror) { + iocon = iocon | INTERRUPT_MIRROR_BIT; + } + else { + iocon = iocon & ~INTERRUPT_MIRROR_BIT; + } + + _write(IOCON_AB[_bankMode][PORT_A], iocon); } void MCP23017::interruptPolarity(Polarity polarity) { - char iocon = _read(IOCON); + char iocon = _read(IOCON_AB[_bankMode][PORT_A]); + if (polarity == ACTIVE_LOW) { iocon = iocon & ~INTERRUPT_POLARITY_BIT; } else { iocon = iocon | INTERRUPT_POLARITY_BIT; } - _write(IOCON, iocon); + _write(IOCON_AB[_bankMode][PORT_A], iocon); } void MCP23017::defaultValue(Port port, char valuesToCompare) { - _write(port + DEFVALA, valuesToCompare); + + _write(DEFVAL_AB[_bankMode][port], valuesToCompare); + } void MCP23017::interruptControl(Port port, char interruptControlBits) { - _write(port + INTCONA, interruptControlBits); + + _write(INTCON_AB[_bankMode][port], interruptControlBits); + } /** Write to specified MCP23017 Port @@ -118,7 +155,7 @@ * @param char byte data to write */ void MCP23017::write(Port port, char byte) { - _write(port + OLATA, byte); + _write(OLAT_AB[_bankMode][port], byte); } /** Read from specified MCP23017 Port @@ -127,6 +164,6 @@ * @returns data from Port */ char MCP23017::read(Port port) { - return _read(port + GPIOA); + return _read(GPIO_AB[_bankMode][port]); }