The PCAL9555, PCAL9554 series is a low-voltage 16-bit/8-bit General Purpose Input/Output (GPIO) expander with interrupt. This conponent library is compatible to basic operation os GPIO expanders: PCAL9555, PCA9555, PCA9535, PCA9539, PCAL9554, PCA9554 and PCA9538. On addition to this, this library is including mbed-SDK-style APIs. APIs that similar to DigitaiInOut, DigitalOut, DigitalIn, BusInOUt, BusOut and BusIn are available.

Dependents:   PCAL9555_Hello OM13082-JoyStick OM13082_LED OM13082-test ... more

What is this?

This conponent library is compatible to basic operation os GPIO expanders: PCAL9555, PCA9555, PCA9535, PCA9539, PCAL9554, PCA9554 and PCA9538 .

On addition to this, this library is including mbed-SDK-style APIs. APIs that similar to DigitaiInOut, DigitalOut, DigitalIn, BusInOut, BusOut and BusIn are available.

How to use?

Wiring

/media/uploads/nxp_ip/gpio16.png
Wiring between mbed and 16-bit GPIO expander

/media/uploads/nxp_ip/gpio08.png
Wiring between mbed and 8-bit GPIO expander

Very basic register level I/O bit operation

PCAL9555 and PCAL9554 are class libraries for those compatible GPIO expander chips.
Those class libraries provides interface for bit operation of its I/O port.
For 16-bit GPIO expanders, the input/output access and its direction setting can be done by 16-bit data. For 8-bit GPIO expanders, those can be done by 8-bit data.

  #include    "mbed.h"
  #include    "PCAL9555.h"
 
  PCAL9555    gpio( p28, p27, 0xE8 );     //  using PCA9539
 
  int main() {
      gpio.configure( 0xFFFF );           //  Set all pins: input
      printf( "  0x%04X\r\n", (int)gpio );//  Print pins state
 
      gpio.configure( 0x0000 );           //  Set all pins: output
      int count   = 0;
      while(1) {
          gpio.write( count++ );
      }
  }


High level APIs

To use the GPIO expanders more simple, this library is including mbed-SDK-style APIs.
APIs that similar to DigitaiInOut, DigitalOut, DigitalIn, BusInOut, BusOut and BusIn are available.

GpioDigitalOut, GpioDigitaiInOut, GpioDigitalIn

Next code shows sample of DigitalOut equivalent API GpioDigitalOut usage.
A pin on the PCAL9555 is defined as pin and its state is changed by assignment.
(For single pin operation, GpioDigitaiInOut and GpioDigitalIn are available also.)

  #include "mbed.h"
  #include "PCAL9555.h"
  
  PCAL9555        gpio_exp( p28, p27, 0xE8 );    //  SDA, SCL, Slave_address(option)
  GpioDigitalOut  pin( gpio_exp, X0_0 );
   
  int main() {
      while( 1 ) {
          pin = 1;
          wait( 0.2 );
          pin = 0;
          wait( 0.2 );
      }
  }


GpioBusOut, GpioBusInOut, GpioBusIn

BusOut equivalent API GpioBusOut is available too.
In next code, pins are grouped as mypins to manage the output as bus output.
(Same as GpioDigitalInOut and GpioDigitalIn APIs, GpioBusInOut and GpioBusIn are available also.)

  #include "mbed.h"
  #include "PCAL9555.h"
  
  PCAL9555    gpio_exp( p28, p27, 0xE8 );    //  SDA, SCL, Slave_address(option)
  GpioBusOut  mypins( gpio_exp, X0_0, X0_1, X0_2, X0_3 );
   
  int main() {
      while( 1 ) {
          for( int i = 0; i < 16; i++ ) {
              mypins  = i;
              wait( 0.25 );
          }
      }
  }


The high level APIs can be used in combination

Those high level APIs can be used in combination.
Each pins can be managed by instances.

  #include    "mbed.h"
  #include    "PCAL9555.h"
 
  PCAL9555        gpio( p28, p27, 0xE8 );     //  using PCA9539
 
  //  The GPIO pins are grouped in some groups and operated as bus I/O
  GpioBusIn       bus_in( gpio, X0_0, X0_1, X0_2, X0_3 );
  GpioBusOut      bus_out( gpio, X0_4, X0_5, X0_6 );
  GpioBusInOut    bus_io( gpio, X1_7, X1_6, X1_5, X1_4, X1_3, X1_2, X1_1, X1_0 );
  GpioDigitalOut  myled( gpio, X0_7 );
 
  int main() {
      bus_io.input();
      printf( "I/O = 0x%02X\r\n", (int)bus_io );
      printf( "In  = 0x%01X\r\n", (int)bus_in );
 
      bus_io.output();
 
      int count   = 0;
      while(1) {
          bus_out = count;
          bus_io  = count;
          myled   = count & 0x1;
          count++;
          wait( 0.1 );
      }
  }
Revision:
1:fd7cfa821b6a
Parent:
0:6c9a51a50eea
--- a/PCAL9554/PCAL9554.h	Sat Mar 07 12:56:05 2015 +0000
+++ b/PCAL9554/PCAL9554.h	Thu Mar 19 02:21:57 2015 +0000
@@ -5,8 +5,8 @@
  *
  *  @class   PCAL9554
  *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
- *  @version 0.5
- *  @date    07-Mar-2015
+ *  @version 0.6
+ *  @date    19-Mar-2015
  *
  *  Released under the Apache 2 license
  *
@@ -31,9 +31,12 @@
  *  
  *  PCAL9554 library's basic IO operation is compatible to PCA9554, PCA9538.
  *  This library can be used for those GPIO expander chips also.
+ *  Next sample code shows operation based on low-level-API (operated by just device instane)
  *  
  *  Example:
  *  @code
+ *  //  GPIO-expander operation sample using a device instance
+ *  
  *  #include    "mbed.h"
  *  #include    "PCAL9555.h"
  *
@@ -57,6 +60,8 @@
  *  The GpioDigital* and GpioBus* APIs can be used as next sample code.
  *
  *  @code
+ *  //  GPIO-expander operation sample using high-level-API
+ *
  *  #include    "mbed.h"
  *  #include    "PCAL9554.h"
  *
@@ -81,45 +86,52 @@
  */
 class PCAL9554 : public PCAL955x
 {
-#if DOXYGEN_ONLY
-    //* GPIO-Expander pin names */
-    typedef enum {
-        X0_0,           /**< P0_0 pin                                   */
-        X0_1,           /**< P0_1 pin                                   */
-        X0_2,           /**< P0_2 pin                                   */
-        X0_3,           /**< P0_3 pin                                   */
-        X0_4,           /**< P0_4 pin                                   */
-        X0_5,           /**< P0_5 pin                                   */
-        X0_6,           /**< P0_6 pin                                   */
-        X0_7,           /**< P0_7 pin                                   */
-        X0  = X0_0,     /**< P0_0 pin                                   */
-        X1  = X0_1,     /**< P0_1 pin                                   */
-        X2  = X0_2,     /**< P0_2 pin                                   */
-        X3  = X0_3,     /**< P0_3 pin                                   */
-        X4  = X0_4,     /**< P0_4 pin                                   */
-        X5  = X0_5,     /**< P0_5 pin                                   */
-        X6  = X0_6,     /**< P0_6 pin                                   */
-        X7  = X0_7,     /**< P0_7 pin                                   */
-        X_NC = ~0x0L    /**< for when the pin is left no-connection     */
-    } GpioPinName;
-#endif
+
 public:
     /** Name of the PCAL9554 registers */
     enum command_reg {
-        InputPort               = 0x00,
-        OutoutPort,
-        PolarityInversionPort,
-        ConfigurationPort,
-        OutputDriveStrength0    = 0x40,
-        OutputDriveStrength1,
-        InputLatch,
-        PullUpPullDowmEnable,
-        PullUpPullDowmSelection,
-        InterruptMask,
-        InterruptStatus,
-        OutputPortConfiguration = 0x4F,
+        InputPort               = 0x00, /**< InputPort register                 */
+        OutoutPort,                     /**< OutoutPort register                */
+        PolarityInversionPort,          /**< PolarityInversionPort register     */
+        ConfigurationPort,              /**< ConfigurationPort register         */
+        OutputDriveStrength0    = 0x40, /**< OutputDriveStrength0 register      */
+        OutputDriveStrength1,           /**< OutputDriveStrength1 register      */
+        InputLatch,                     /**< InputLatch register                */
+        PullUpPullDowmEnable,           /**< PullUpPullDowmEnable register      */
+        PullUpPullDowmSelection,        /**< PullUpPullDowmSelection register   */
+        InterruptMask,                  /**< InterruptMask register             */
+        InterruptStatus,                /**< InterruptStatus register           */
+        OutputPortConfiguration = 0x4F, /**< OutputPortConfiguration register   */
     };
 
+#if DOXYGEN_ONLY
+    /** GPIO-Expander pin names
+     *    for when the high-level APIs 
+     *    (GpioDigitalOut, GpioDigitalInOut, GpioDigitalIn, 
+     *    GpioBusOut, GpioBusInOut are GpioBusIn) are used
+     */
+    typedef enum {
+        X0_0,           /**< P0_0 pin */
+        X0_1,           /**< P0_1 pin */
+        X0_2,           /**< P0_2 pin */
+        X0_3,           /**< P0_3 pin */
+        X0_4,           /**< P0_4 pin */
+        X0_5,           /**< P0_5 pin */
+        X0_6,           /**< P0_6 pin */
+        X0_7,           /**< P0_7 pin */
+        X0  = X0_0,     /**< P0_0 pin */
+        X1  = X0_1,     /**< P0_1 pin */
+        X2  = X0_2,     /**< P0_2 pin */
+        X3  = X0_3,     /**< P0_3 pin */
+        X4  = X0_4,     /**< P0_4 pin */
+        X5  = X0_5,     /**< P0_5 pin */
+        X6  = X0_6,     /**< P0_6 pin */
+        X7  = X0_7,     /**< P0_7 pin */
+
+        X_NC = ~0x0L    /**< for when the pin is left no-connection */
+    } GpioPinName;
+#endif
+
     /** Create a PCAL9554 instance connected to specified I2C pins with specified address
      *
      * @param i2c_sda       I2C-bus SDA pin