Added support for banked registers

Dependents:   Component_Test_Interface FalconWing MX_Spoile_Test Simple_Power_Distribution ... more

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]);
 }