gfdgd

Dependencies:   CompLedDvrCC

Fork of PCA995xA by InetrfaceProducts NXP

Revision:
0:a624e2eeccac
Child:
1:3522be54a4f5
diff -r 000000000000 -r a624e2eeccac PCA9956A/PCA9956A.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCA9956A/PCA9956A.h	Wed Feb 25 06:42:41 2015 +0000
@@ -0,0 +1,196 @@
+/** 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