gfdgd

Dependencies:   CompLedDvrCC

Fork of PCA995xA by InetrfaceProducts NXP

PCA9956A/PCA9956A.h

Committer:
nxp_ip
Date:
2015-02-25
Revision:
0:a624e2eeccac
Child:
1:3522be54a4f5

File content as of revision 0:a624e2eeccac:

/** PCA9956A constant current LED driver
 *
 *  An operation sample of PCA9956A 24-channel Fm+ I2C-bus 57mA/20V constant current LED driver.
 *  mbed accesses the PCA9956A registers through I2C.
 *
 *  @class   PCA9956A
 *  @author  Akifumi (Tedd) OKANO, NXP Semiconductors
 *  @version 0.5
 *  @date    25-Feb-2015
 *
 *  Released under the Apache 2 license License
 *
 *  About PCA9956A:
 *    http://www.nxp.com/products/interface_and_connectivity/i2c/i2c_led_display_control/PCA9956ATW.html
 */

#ifndef     MBED_PCA9956A
#define     MBED_PCA9956A

#include    "mbed.h"
#include    "PCA995xA.h"

/** PCA9956A class
 *
 *  This is a driver code for the PCA9956A 24-channel Fm+ I2C-bus 57mA/20V constant current LED driver.
 *  This class provides interface for PCA9956A operation and accessing its registers.
 *  Detail information is available on next URL.
 *    http://www.nxp.com/products/interface_and_connectivity/i2c/i2c_led_display_control/PCA9956ATW.html
 *
 *  Example:
 *  @code
 *  #include "mbed.h"
 *  
 *  #include "PCA9956A.h"
 *  PCA9956A    led_cntlr( p28, p27, 0x02 );    //  SDA, SCL, Slave_address(option)
 *  
 *  int main()
 *  {
 *      led_cntlr.current( ALLPORTS, 1.0 ); //  Set all ports output current 100%
 *      
 *      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 PCA9956A : public PCA995xA
{
public:
    /** Name of the PCA9956A registers */
    enum command_reg {
        MODE1, MODE2,
        LEDOUT0, LEDOUT1, LEDOUT2, LEDOUT3, LEDOUT4, LEDOUT5,
        GRPPWM, GRPFREQ,
        PWM0,   PWM1,   PWM2,   PWM3,  
        PWM4,   PWM5,   PWM6,   PWM7,
        PWM8,   PWM9,   PWM10,  PWM11, 
        PWM12,  PWM13,  PWM14,  PWM15,
        PWM16,  PWM17,  PWM18,  PWM19, 
        PWM20,  PWM21,  PWM22,  PWM23,
        IREF0,  IREF1,  IREF2,  IREF3,  
        IREF4,  IREF5,  IREF6,  IREF7,
        IREF8,  IREF9,  IREF10, IREF11, 
        IREF12, IREF13, IREF14, IREF15,
        IREF16, IREF17, IREF18, IREF19, 
        IREF20, IREF21, IREF22, IREF23,
        OFFSET  = 0x3A,
        SUBADR1, SUBADR2, SUBADR3, ALLCALLADR,
        PWMALL, IREFALL,
        EFLAG0, EFLAG1, EFLAG2, EFLAG3, EFLAG4, EFLAG5,

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

    /** 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)
     */
    PCA9956A( PinName i2c_sda, PinName i2c_scl, char i2c_address = PCA995xA::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)
     */
    PCA9956A( I2C &i2c_obj, char i2c_address = PCA995xA::DEFAULT_I2C_ADDR );

    /** Destractor
     *
     */
    virtual         ~PCA9956A();
    
    /** 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 );
    
    /** Set the output current, 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 current,
     *    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            current( int port, float vp );

    /** Set all output port curent, specified as a percentage (array of float)
     *
     * @param vp    Aray to floating-point values representing the output current,
     *    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            current( 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:
    void            initialize( void );
    virtual char    pwm_register_access( int port );
    virtual char    current_register_access( int port );

    const int       n_of_ports;
}
;

#endif  //  MBED_PCA9956A