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 );
      }
  }
Committer:
nxp_ip
Date:
Thu Mar 19 02:21:57 2015 +0000
Revision:
1:fd7cfa821b6a
Parent:
0:6c9a51a50eea
API document update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nxp_ip 0:6c9a51a50eea 1 /** PCAL955x GPIO with Agile I/O, interrupt and weak pull-up family
nxp_ip 0:6c9a51a50eea 2 *
nxp_ip 0:6c9a51a50eea 3 * Abstract class for PCAL955x family
nxp_ip 0:6c9a51a50eea 4 * No instance can be made from this class
nxp_ip 0:6c9a51a50eea 5 *
nxp_ip 0:6c9a51a50eea 6 * @class PCAL955x
nxp_ip 0:6c9a51a50eea 7 * @author Akifumi (Tedd) OKANO, NXP Semiconductors
nxp_ip 0:6c9a51a50eea 8 * @version 0.5
nxp_ip 0:6c9a51a50eea 9 * @date 07-Mar-2015
nxp_ip 0:6c9a51a50eea 10 *
nxp_ip 0:6c9a51a50eea 11 * Released under the Apache 2 license
nxp_ip 0:6c9a51a50eea 12 */
nxp_ip 0:6c9a51a50eea 13
nxp_ip 0:6c9a51a50eea 14 #ifndef MBED_PCAL955x
nxp_ip 0:6c9a51a50eea 15 #define MBED_PCAL955x
nxp_ip 0:6c9a51a50eea 16
nxp_ip 0:6c9a51a50eea 17 #include "mbed.h"
nxp_ip 0:6c9a51a50eea 18 #include "CompGpioExp.h"
nxp_ip 0:6c9a51a50eea 19
nxp_ip 0:6c9a51a50eea 20 /** Abstract class for PCAL955x family
nxp_ip 0:6c9a51a50eea 21 *
nxp_ip 0:6c9a51a50eea 22 * No instance can be made from this class
nxp_ip 0:6c9a51a50eea 23 */
nxp_ip 0:6c9a51a50eea 24 class PCAL955x : public CompGpioExp
nxp_ip 0:6c9a51a50eea 25 {
nxp_ip 0:6c9a51a50eea 26 public:
nxp_ip 0:6c9a51a50eea 27 enum register_index {
nxp_ip 0:6c9a51a50eea 28 INPUT,
nxp_ip 0:6c9a51a50eea 29 OUTPUT,
nxp_ip 0:6c9a51a50eea 30 POLARITY,
nxp_ip 0:6c9a51a50eea 31 CONFIG,
nxp_ip 0:6c9a51a50eea 32 ODS0,
nxp_ip 0:6c9a51a50eea 33 ODS1,
nxp_ip 0:6c9a51a50eea 34 IN_LATCH,
nxp_ip 0:6c9a51a50eea 35 PULL_EN,
nxp_ip 0:6c9a51a50eea 36 PULL_SEL,
nxp_ip 0:6c9a51a50eea 37 INT_MASK,
nxp_ip 0:6c9a51a50eea 38 INT_STAT,
nxp_ip 0:6c9a51a50eea 39 OPC
nxp_ip 0:6c9a51a50eea 40 };
nxp_ip 0:6c9a51a50eea 41
nxp_ip 0:6c9a51a50eea 42 PCAL955x( PinName i2c_sda, PinName i2c_scl, char i2c_address = DEFAULT_I2C_ADDR );
nxp_ip 0:6c9a51a50eea 43 PCAL955x( I2C &i2c_obj, char i2c_address = DEFAULT_I2C_ADDR );
nxp_ip 0:6c9a51a50eea 44 virtual ~PCAL955x();
nxp_ip 0:6c9a51a50eea 45
nxp_ip 0:6c9a51a50eea 46 virtual void write( int pin, int value );
nxp_ip 0:6c9a51a50eea 47 virtual int read( int pin );
nxp_ip 0:6c9a51a50eea 48 virtual void configure( int pin, int value );
nxp_ip 0:6c9a51a50eea 49 virtual int read( void );
nxp_ip 0:6c9a51a50eea 50 virtual void write_with_mask( int bitpattern, int mask_bits );
nxp_ip 0:6c9a51a50eea 51 virtual void configure_with_mask( int bitpattern, int mask_bits );
nxp_ip 0:6c9a51a50eea 52
nxp_ip 0:6c9a51a50eea 53 void write( int bit_pattern );
nxp_ip 0:6c9a51a50eea 54 void polarity( int bit_pattern );
nxp_ip 0:6c9a51a50eea 55 void configure( int bit_pattern );
nxp_ip 0:6c9a51a50eea 56
nxp_ip 0:6c9a51a50eea 57 void interrupt_mask( int bit_pattern );
nxp_ip 0:6c9a51a50eea 58 int interrupt_status( void );
nxp_ip 0:6c9a51a50eea 59
nxp_ip 0:6c9a51a50eea 60 virtual int number_of_pins( void ) = 0;
nxp_ip 0:6c9a51a50eea 61 virtual void reg_index_write( char reg_addr, int data ) = 0;
nxp_ip 0:6c9a51a50eea 62 virtual int reg_index_read( char reg_addr ) = 0;
nxp_ip 0:6c9a51a50eea 63 operator int( void );
nxp_ip 0:6c9a51a50eea 64
nxp_ip 0:6c9a51a50eea 65 protected:
nxp_ip 0:6c9a51a50eea 66 enum {
nxp_ip 0:6c9a51a50eea 67 DEFAULT_I2C_ADDR = 0x40,
nxp_ip 0:6c9a51a50eea 68 };
nxp_ip 0:6c9a51a50eea 69
nxp_ip 0:6c9a51a50eea 70 void bus_write( char *dp, int length );
nxp_ip 0:6c9a51a50eea 71 void bus_read( char reg_addr, char *dp, int length );
nxp_ip 0:6c9a51a50eea 72
nxp_ip 0:6c9a51a50eea 73 private:
nxp_ip 0:6c9a51a50eea 74 I2C *i2c_p;
nxp_ip 0:6c9a51a50eea 75 I2C &i2c;
nxp_ip 0:6c9a51a50eea 76 char address; // I2C slave address
nxp_ip 0:6c9a51a50eea 77 int pin_state;
nxp_ip 0:6c9a51a50eea 78 int pin_direction;
nxp_ip 0:6c9a51a50eea 79 }
nxp_ip 0:6c9a51a50eea 80 ;
nxp_ip 0:6c9a51a50eea 81
nxp_ip 0:6c9a51a50eea 82 #endif // MBED_PCAL955x
nxp_ip 0:6c9a51a50eea 83
nxp_ip 0:6c9a51a50eea 84