InetrfaceProducts NXP / PCAL955x

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

Revision:
0:6c9a51a50eea
Child:
1:fd7cfa821b6a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCAL9555/PCAL9555.h	Sat Mar 07 12:56:05 2015 +0000
@@ -0,0 +1,305 @@
+/** PCA(L)9555 16-bit I2C-bus GPIO expander
+ *
+ *  An operation sample of PCA(L)9555, PCA9535 and PCA9539.
+ *  mbed accesses the PCAL9555 registers through I2C.
+ *
+ *  @class   PCAL9555
+ *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
+ *  @version 0.5
+ *  @date    07-Mar-2015
+ *
+ *  Released under the Apache 2 license
+ *
+ *  About PCAL9555:
+ *    http://www.nxp.com/products/interface_and_connectivity/i2c/i2c_general_purpose_i_o/series/PCAL9555A.html
+ */
+
+#ifndef     MBED_PCAL9555
+#define     MBED_PCAL9555
+
+#include    "mbed.h"
+#include    "PCAL955x.h"
+#include    "CompGpioExpAPI.h"
+
+/** PCAL9555 class
+ *
+ *  This is a driver code for the Low-voltage 16-bit I2C-bus GPIO with Agile I/O.
+ *  This class provides interface for PCAL9555 operation.
+ *  Detail information is available on next URL.
+ *    http://www.nxp.com/products/interface_and_connectivity/i2c/i2c_general_purpose_i_o/series/PCAL9555A.html
+ *  
+ *  PCAL9555 library's basic IO operation is compatible to PCA9555, PCA9535 and PCA9539.
+ *  This library can be used for those GPIO expander chips also.
+ *  
+ *  Example:
+ *  @code
+ *  #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++ );
+ *      }
+ *  }
+ *  @endcode
+ *
+ *  GpioDigitalInOut, GpioDigitalOut, GpioDigitalIn,
+ *  GpioBusInOut, GpioBusOut and GpioBusIn API class are available also.
+ *  For those API details, please find those class library page.
+ *  The GpioDigital* and GpioBus* APIs can be used as next sample code.
+ *
+ *  @code
+ *  #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 );
+ *      }
+ *  }
+ *  @endcode
+ */
+
+class PCAL9555 : 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                                   */
+        X1_0,           /**< P1_0 pin                                   */
+        X1_1,           /**< P1_1 pin                                   */
+        X1_2,           /**< P1_2 pin                                   */
+        X1_3,           /**< P1_3 pin                                   */
+        X1_4,           /**< P1_4 pin                                   */
+        X1_5,           /**< P1_5 pin                                   */
+        X1_6,           /**< P1_6 pin                                   */
+        X1_7,           /**< P1_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                                   */
+        X8  = X1_0,     /**< P1_0 pin                                   */
+        X9  = X1_1,     /**< P1_1 pin                                   */
+        X10 = X1_2,     /**< P1_2 pin                                   */
+        X11 = X1_3,     /**< P1_3 pin                                   */
+        X12 = X1_4,     /**< P1_4 pin                                   */
+        X13 = X1_5,     /**< P1_5 pin                                   */
+        X14 = X1_6,     /**< P1_6 pin                                   */
+        X15 = X1_7,     /**< P1_7 pin                                   */
+
+        X_NC = ~0x0L    /**< for when the pin is left no-connection     */
+    } GpioPinName;
+#endif
+public:
+    /** Name of the PCAL9555 registers */
+    enum command_reg {
+        InputPort0              = 0x00,
+        InputPort1,
+        OutoutPort0,
+        OutoutPort1,
+        PolarityInversionPort0,
+        PolarityInversionPort1,
+        ConfigurationPort0,
+        ConfigurationPort1,
+        OutputDriveStrength0_0  = 0x40,
+        OutputDriveStrength0_1,
+        OutputDriveStrength1_0,
+        OutputDriveStrength1_1,
+        InputLatch0,
+        InputLatch1,
+        PullUpPullDowmEnable0,
+        PullUpPullDowmEnable1,
+        PullUpPullDowmSelection0,
+        PullUpPullDowmSelection1,
+        InterruptMask0,
+        InterruptMask1,
+        InterruptStatus0,
+        InterruptStatus1,
+        OutputPortConfiguration = 0x4F,
+    };
+
+    /** Create a PCAL9555 instance connected to specified I2C pins with specified address
+     *
+     * @param i2c_sda       I2C-bus SDA pin
+     * @param i2c_sda       I2C-bus SCL pin
+     * @param i2c_address   I2C-bus address (default: 0x40)
+     */
+    PCAL9555( PinName i2c_sda, PinName i2c_scl, char i2c_address = PCAL955x::DEFAULT_I2C_ADDR );
+
+    /** Create a PCAL9555 instance connected to specified I2C pins with specified address
+     *
+     * @param i2c_obj       I2C object (instance)
+     * @param i2c_address   I2C-bus address (default: 0x40)
+     */
+    PCAL9555( I2C &i2c_obj, char i2c_address = PCAL955x::DEFAULT_I2C_ADDR );
+
+    /** Destractor
+     */
+    virtual         ~PCAL9555();
+
+    /** Returns the number of I/O pins
+     *
+     *  @returns
+     *    The number of I/O pins
+     */
+    virtual int     number_of_pins( void );
+
+#if DOXYGEN_ONLY
+
+    /** Set output port bits
+     *
+     *  @param bit_pattern  16-bit output pattern for port1 and port0.
+     *
+     *  @note
+     *    The data for pins, given as integer.
+     *    The 16-bit MSB goes to P1_7 pin and LSB goes to P0_0 pin.
+     *    Data will not come out from the pin if it is configured as input.
+     *
+     *  @see configure()
+     */
+    void            write( int bit_pattern );
+
+    /** Read pin states
+     *
+     *  @return
+     *    16-bit pattern from port1 and port0.
+     *
+     *  @note
+     *    The data from pins, given as integer.
+     *    The 16-bit port data comes from IO pins, P1_7 as MSB, P0_0 as LSB.
+     *    Data cannot be read if the port is configured as output.
+     *
+     *  @see configure()
+     */
+    int             read( void );
+
+    /** Polarity setting
+     *
+     *  @param bit_pattern  16-bit polarity setting pattern for port1 and port0.
+     *    If the bit is set to '1', the state will be inverted.
+     *    (Default state is all '0')
+     *
+     *  @see configure()
+     */
+    void            polarity( int bit_pattern );
+
+    /** Set IO congiguration
+     *
+     *  @param bit_pattern  16-bit IO direction setting pattern for port1 and port0.
+     *
+     *  @note
+     *    The data for pins, given as integer.
+     *    The 16-bit MSB goes to P1_7 pin and LSB goes to P0_0 pin.
+     *    If the bit is set to '1', the pin will be input.
+     *
+     *  @see write()
+     *  @see read()
+     */
+    void            configure( int bit_pattern );
+
+    /** Set interrupt mask
+     *
+     *  @param bit_pattern  16-bit interrupt mask
+     *
+     *  @see interrupt_status()
+     */
+    void            interrupt_mask( int bit_pattern );
+
+    /** Read interrupt status
+     *
+     *  @return
+     *    16-bit data from interrupt status registers
+     *
+     *  @see interrupt_status()
+     */
+    int             interrupt_status( void );
+
+    /** A shorthand for read()
+     */
+    operator int( void );
+
+#endif
+
+    /** Write 16-bit data into registers
+     *
+     *  @param reg_index    Direst access to registers.
+     *    The registers can be referenced by regiser index
+     *  @param data  16-bit data. Data will be written into two 8-bit registers
+     */
+    virtual void    reg_index_write( char register_index, int data );
+
+    /** Read 16-bit data from registers
+     *
+     *  @param reg_index    Direst access to registers.
+     *    The registers can be referenced by regiser index
+     *
+     *  @return
+     *    16-bit data from two registers.
+     *    The register which has lower address will be upper 8-bit data.
+     */
+    virtual int     reg_index_read( char register_index );
+
+    /** A shorthand for write()
+     */
+    PCAL9555&       operator= ( int bit_pattern );
+    PCAL9555&       operator= ( PCAL9555& rhs );
+
+private:
+    /** Register index name */
+    enum RegisterIndex {
+        InputPort               = InputPort0,
+        OutoutPort              = OutoutPort0,
+        PolarityInversionPort   = PolarityInversionPort0,
+        ConfigurationPort       = ConfigurationPort0,
+        OutputDriveStrength0    = OutputDriveStrength0_0,
+        OutputDriveStrength1    = OutputDriveStrength1_0,
+        InputLatch              = InputLatch0,
+        PullUpPullDowmEnable    = PullUpPullDowmEnable0,
+        PullUpPullDowmSelection = PullUpPullDowmSelection0,
+        InterruptMask           = InterruptMask0,
+        InterruptStatus         = InterruptStatus0
+    };
+
+    static const char   regmap[];
+    const int           n_of_pins;
+}
+;
+
+#endif  //  MBED_PCAL9555