InetrfaceProducts NXP / PCA962x

Dependencies:   CompLedDvr

Dependents:   PCA9626_Hello PCA9624_Hello PCA9622_Hello

PCA9626/PCA9626.h

Committer:
nxp_ip
Date:
2015-03-04
Revision:
3:40f83904f0a8
Parent:
1:6fcc4f604988
Child:
7:7ebf563f6e6c

File content as of revision 3:40f83904f0a8:

/** PCA9626 PWM control LED driver
 *
 *  An operation sample of PCA9626 24-channel Fm+ I2C-bus 100mA/40 V LED driver.
 *  mbed accesses the PCA9626 registers through I2C.
 *
 *  @class   PCA9626
 *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
 *  @version 0.6
 *  @date    04-Mar-2015
 *
 *  Released under the Apache 2 license License
 *
 *  About PCA9626:
 *    http://www.nxp.com/products/lighting_driver_and_controller_ics/i2c_led_display_control/series/PCA9626.html
 */

#ifndef     MBED_PCA9626
#define     MBED_PCA9626

#include    "mbed.h"
#include    "PCA962x.h"
#include    "CompLedDvrAPI.h"

/** PCA9626 class
 *
 *  This is a driver code for the PCA9626 24-channel Fm+ I2C-bus 100mA/40V PWM control LED driver.
 *  This class provides interface for PCA9626 operation and accessing its registers.
 *  Detail information is available on next URL.
 *    http://www.nxp.com/products/lighting_driver_and_controller_ics/i2c_led_display_control/series/PCA9626.html
 *
 *  Example:
 *  @code
 *  #include "mbed.h"
 *  
 *  #include "PCA9626.h"
 *  PCA9626    led_cntlr( p28, p27, 0x3E );    //  SDA, SCL, Slave_address(option)
 *  
 *  int main()
 *  {
 *      while(1) {
 *          for ( int port = 0; port < led_cntlr.number_of_ports(); port++ ) {
 *              for ( int i = 1; i <= 100; i++ ) {
 *                  led_cntlr.pwm(  port, (float)i / 100.0 );
 *                  wait( 0.01 );
 *              }
 *          }
 *          led_cntlr.pwm( ALLPORTS, 0.0 );
 *      }
 *  }
 *  @endcode
 */

class PCA9626 : public PCA962x
{
public:
    /** Name of the PCA9626 registers */
    enum command_reg {
        MODE1, MODE2,
        PWM0,   PWM1,   PWM2,   PWM3,  
        PWM4,   PWM5,   PWM6,   PWM7,
        PWM8,   PWM9,   PWM10,  PWM11, 
        PWM12,  PWM13,  PWM14,  PWM15,
        PWM16,  PWM17,  PWM18,  PWM19, 
        PWM20,  PWM21,  PWM22,  PWM23,
        GRPPWM, GRPFREQ, CHASE,
        LEDOUT0, LEDOUT1, LEDOUT2, LEDOUT3, LEDOUT4, LEDOUT5,
        SUBADR1, SUBADR2, SUBADR3, ALLCALLADR,

        REGISTER_START          = MODE1,
        LEDOUT_REGISTER_START   = LEDOUT0,
        PWM_REGISTER_START      = PWM0,
    };

    /** Create a PCA9629A 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: 0xC0)
     */
    PCA9626( PinName i2c_sda, PinName i2c_scl, char i2c_address = PCA962x::DEFAULT_I2C_ADDR );

    /** Create a PCA9629A instance connected to specified I2C pins with specified address
     *
     * @param i2c_obj       I2C object (instance)
     * @param i2c_address   I2C-bus address (default: 0xC0)
     */
    PCA9626( I2C &i2c_obj, char i2c_address = PCA962x::DEFAULT_I2C_ADDR );

    /** Destractor
     *
     */
    virtual         ~PCA9626();
    
    /** Returns the number of output ports
     *
     *  @returns
     *    The number of output ports
     */
     virtual int     number_of_ports( void );

#if DOXYGEN_ONLY
    /** Set the output duty-cycle, specified as a percentage (float)
     *
     * @param port  Selecting output port
     *    'ALLPORTS' can be used to set all port duty-cycle same value.
     * @param v     A floating-point value representing the output duty-cycle,
     *    specified as a percentage. The value should lie between
     *    0.0f (representing on 0%) and 1.0f (representing on 100%).
     *    Values outside this range will have undefined behavior.
     */
    void            pwm( int port, float v );
    
    /** Set all output port duty-cycle, specified as a percentage (array of float)
     *
     * @param vp    Aray to floating-point values representing the output duty-cycle,
     *    specified as a percentage. The value should lie between
     *    0.0f (representing on 0%) and 1.0f (representing on 100%).
     *
     *  @note
     *    The aray should have length of 24
     */
    void            pwm( float *vp );
    
    /** Register write (single byte) : Low level access to device register
     *
     * @param reg_addr  Register address
     * @param data      Value for setting into the register
     */    
    void            write( char reg_addr, char data );

    /** Register write (multiple bytes) : Low level access to device register
     *
     * @param data      Pointer to an array. First 1 byte should be the writing start register address
     * @param length    Length of data
     */    
    void            write( char *data, int length );

    /** Register read (single byte) : Low level access to device register
     *
     * @param reg_addr  Register address
     * @return          Read value from register
     */    
    char            read( char reg_addr );

    /** Register write (multiple bytes) : Low level access to device register
     *
     * @param reg_addr  Register address
     * @param data      Pointer to an array. The values are stored in this array.
     * @param length    Length of data
     */    
    void            read( char reg_addr, char *data, int length );
#endif

private:
    virtual void    initialize( void );
    virtual char    pwm_register_access( int port );

    const int       n_of_ports;
}
;

#endif  //  MBED_PCA9626