gfdgd
Fork of PCA995xA by
Diff: PCA9956A/PCA9956A.h
- Revision:
- 0:a624e2eeccac
- Child:
- 1:3522be54a4f5
--- /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