This is a driver code for the PCA9632 is an I2C-bus controlled 4-bit LED driver optimized for Red/Green/Blue/Amber (RGBA) color mixing applications. In Individual brightness control mode, each LED output has its own 8-bit resolution (256 steps) fixed frequency Individual PWM controller that operates at 1.5625 kHz with a duty cycle that is adjustable from 0 % to 99.6 % to allow the LED to be set to a specific brightness value. This library including device class and "LedPwmOut class API" for ease of use.

Dependencies:   CompLedDvr

Dependents:   PCA9632_Hello

Please refer to the component page for details

The PCA9632 is an I²C-bus controlled 4-bit LED driver optimized for Red/Green/Blue/Amber (RGBA) color mixing applications.

High-level API is available

A high-level API that can be used as the "PwmOut" of bed-SDK is available.
This API enables to make instances of each LED output pins and control PWM duty cycle by assignment.
For detail information, refer API document of LedPwmOut Class class which is included in PCA962xA class library.

#include "mbed.h"
#include "PCA9632.h"

PCA9632     led_cntlr( p28, p27, 0xC4 );  //  SDA, SCL, Slave_address(option)
LedPwmOut   led( led_cntlr, L0 );

int main()
{
    while( 1 ) {
        for( float p = 0.0f; p < 1.0f; p += 0.1f ) {
            led     = p;
            wait( 0.1 );
        }
    }
}
Committer:
nxp_ip
Date:
Wed Mar 04 04:12:53 2015 +0000
Revision:
0:da1fe3fe7093
Child:
2:3574bf73abf5
Initial version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nxp_ip 0:da1fe3fe7093 1 /** PCA9632 PWM control LED driver
nxp_ip 0:da1fe3fe7093 2 *
nxp_ip 0:da1fe3fe7093 3 * An operation sample of PCA9632 16-channel Fm+ I2C-bus 100mA/40V LED driver.
nxp_ip 0:da1fe3fe7093 4 * mbed accesses the PCA9632 registers through I2C.
nxp_ip 0:da1fe3fe7093 5 *
nxp_ip 0:da1fe3fe7093 6 * @author Akifumi (Tedd) OKANO, NXP Semiconductors
nxp_ip 0:da1fe3fe7093 7 * @version 0.5
nxp_ip 0:da1fe3fe7093 8 * @date 4-Mar-2015
nxp_ip 0:da1fe3fe7093 9 *
nxp_ip 0:da1fe3fe7093 10 * Released under the Apache 2 license
nxp_ip 0:da1fe3fe7093 11 *
nxp_ip 0:da1fe3fe7093 12 * About PCA9632:
nxp_ip 0:da1fe3fe7093 13 * http://www.nxp.com/products/lighting_driver_and_controller_ics/i2c_led_display_control/series/PCA9632.html
nxp_ip 0:da1fe3fe7093 14 */
nxp_ip 0:da1fe3fe7093 15
nxp_ip 0:da1fe3fe7093 16 #ifndef MBED_PCA9632
nxp_ip 0:da1fe3fe7093 17 #define MBED_PCA9632
nxp_ip 0:da1fe3fe7093 18
nxp_ip 0:da1fe3fe7093 19 #include "mbed.h"
nxp_ip 0:da1fe3fe7093 20 #include "CompLedDvr.h"
nxp_ip 0:da1fe3fe7093 21 #include "LedPwmOut.h"
nxp_ip 0:da1fe3fe7093 22
nxp_ip 0:da1fe3fe7093 23 #define ALLPORTS 0xFF
nxp_ip 0:da1fe3fe7093 24
nxp_ip 0:da1fe3fe7093 25
nxp_ip 0:da1fe3fe7093 26 /** PCA9632 class
nxp_ip 0:da1fe3fe7093 27 *
nxp_ip 0:da1fe3fe7093 28 * @class PCA9632
nxp_ip 0:da1fe3fe7093 29 *
nxp_ip 0:da1fe3fe7093 30 * This is a driver code for the PCA9632 is an I2C-bus controlled 4-bit LED driver
nxp_ip 0:da1fe3fe7093 31 * optimized for Red/Green/Blue/Amber (RGBA) color mixing applications. In Individual
nxp_ip 0:da1fe3fe7093 32 * brightness control mode, each LED output has its own 8-bit resolution (256 steps)
nxp_ip 0:da1fe3fe7093 33 * fixed frequency Individual PWM controller that operates at 1.5625 kHz with a duty
nxp_ip 0:da1fe3fe7093 34 * cycle that is adjustable from 0 % to 99.6 % to allow the LED to be set to a specific
nxp_ip 0:da1fe3fe7093 35 * brightness value.
nxp_ip 0:da1fe3fe7093 36 * This class provides interface for PCA9632 operation and accessing its registers.
nxp_ip 0:da1fe3fe7093 37 * Detail information is available on next URL.
nxp_ip 0:da1fe3fe7093 38 * http://www.jp.nxp.com/products/interface_and_connectivity/i2c/i2c_led_display_control/series/PCA9632.html
nxp_ip 0:da1fe3fe7093 39 *
nxp_ip 0:da1fe3fe7093 40 * Example:
nxp_ip 0:da1fe3fe7093 41 * @code
nxp_ip 0:da1fe3fe7093 42 * #include "mbed.h"
nxp_ip 0:da1fe3fe7093 43 * #include "PCA9632.h"
nxp_ip 0:da1fe3fe7093 44 *
nxp_ip 0:da1fe3fe7093 45 * PCA9632 led_cntlr( p28, p27, 0xC4 ); // SDA, SCL, Slave_address(option)
nxp_ip 0:da1fe3fe7093 46 * LedPwmOut led( led_cntlr, L0 ); // for LED0 pin
nxp_ip 0:da1fe3fe7093 47 *
nxp_ip 0:da1fe3fe7093 48 * int main()
nxp_ip 0:da1fe3fe7093 49 * {
nxp_ip 0:da1fe3fe7093 50 * //
nxp_ip 0:da1fe3fe7093 51 * // Here are two types of PWM control samples
nxp_ip 0:da1fe3fe7093 52 * // (User can choose one of those interface to set the PWM.)
nxp_ip 0:da1fe3fe7093 53 * //
nxp_ip 0:da1fe3fe7093 54 * // 1st sample is using LedPwmOut API.
nxp_ip 0:da1fe3fe7093 55 * // It provides similar interface like PwmOut of mbed-SDK
nxp_ip 0:da1fe3fe7093 56 * //
nxp_ip 0:da1fe3fe7093 57 * // 2nd sample is using PCA9632 class function.
nxp_ip 0:da1fe3fe7093 58 * // the 'pwm()' function takes LED channel number and duty-ratio value
nxp_ip 0:da1fe3fe7093 59 * //
nxp_ip 0:da1fe3fe7093 60 *
nxp_ip 0:da1fe3fe7093 61 * while ( 1 ) {
nxp_ip 0:da1fe3fe7093 62 *
nxp_ip 0:da1fe3fe7093 63 * //
nxp_ip 0:da1fe3fe7093 64 * // 1st sample is using LedPwmOut API.
nxp_ip 0:da1fe3fe7093 65 * // PWM control via LedPwmOut
nxp_ip 0:da1fe3fe7093 66 * //
nxp_ip 0:da1fe3fe7093 67 * for ( int i = 0; i < 3; i++ ) {
nxp_ip 0:da1fe3fe7093 68 * for( float p = 0.0f; p < 1.0f; p += 0.1f ) {
nxp_ip 0:da1fe3fe7093 69 * led = p; // Controls LED0 pin
nxp_ip 0:da1fe3fe7093 70 * wait( 0.1 );
nxp_ip 0:da1fe3fe7093 71 * }
nxp_ip 0:da1fe3fe7093 72 * }
nxp_ip 0:da1fe3fe7093 73 *
nxp_ip 0:da1fe3fe7093 74 * //
nxp_ip 0:da1fe3fe7093 75 * // 2nd sample is using PCA9632 class function.
nxp_ip 0:da1fe3fe7093 76 * // PWM control by device class function call
nxp_ip 0:da1fe3fe7093 77 * //
nxp_ip 0:da1fe3fe7093 78 * for ( int i = 0; i < 3; i++ ) {
nxp_ip 0:da1fe3fe7093 79 * for( float p = 0.0f; p < 1.0f; p += 0.1f ) {
nxp_ip 0:da1fe3fe7093 80 * led_cntlr.pwm( 1, p ); // Controls LED1 pin
nxp_ip 0:da1fe3fe7093 81 * wait( 0.1 );
nxp_ip 0:da1fe3fe7093 82 * }
nxp_ip 0:da1fe3fe7093 83 * }
nxp_ip 0:da1fe3fe7093 84 * }
nxp_ip 0:da1fe3fe7093 85 * }
nxp_ip 0:da1fe3fe7093 86 * @endcode
nxp_ip 0:da1fe3fe7093 87 */
nxp_ip 0:da1fe3fe7093 88 class PCA9632 : public CompLedDvr
nxp_ip 0:da1fe3fe7093 89 {
nxp_ip 0:da1fe3fe7093 90 public:
nxp_ip 0:da1fe3fe7093 91
nxp_ip 0:da1fe3fe7093 92 /** Name of the PCA9632 registers */
nxp_ip 0:da1fe3fe7093 93 enum command_reg {
nxp_ip 0:da1fe3fe7093 94 MODE1, MODE2,
nxp_ip 0:da1fe3fe7093 95 PWM0, PWM1, PWM2, PWM3,
nxp_ip 0:da1fe3fe7093 96 GRPPWM, GRPFREQ,
nxp_ip 0:da1fe3fe7093 97 LEDOUT,
nxp_ip 0:da1fe3fe7093 98 SUBADR1, SUBADR2, SUBADR3, ALLCALLADR,
nxp_ip 0:da1fe3fe7093 99
nxp_ip 0:da1fe3fe7093 100 REGISTER_START = MODE1,
nxp_ip 0:da1fe3fe7093 101 PWM_REGISTER_START = PWM0,
nxp_ip 0:da1fe3fe7093 102 };
nxp_ip 0:da1fe3fe7093 103
nxp_ip 0:da1fe3fe7093 104 /** Difinition of the number of LED pins */
nxp_ip 0:da1fe3fe7093 105 enum {
nxp_ip 0:da1fe3fe7093 106 N_OF_PORTS = 4
nxp_ip 0:da1fe3fe7093 107 };
nxp_ip 0:da1fe3fe7093 108
nxp_ip 0:da1fe3fe7093 109 /** Create a PCA9632 instance connected to specified I2C pins with specified address
nxp_ip 0:da1fe3fe7093 110 *
nxp_ip 0:da1fe3fe7093 111 * @param i2c_sda I2C-bus SDA pin
nxp_ip 0:da1fe3fe7093 112 * @param i2c_sda I2C-bus SCL pin
nxp_ip 0:da1fe3fe7093 113 * @param i2c_address I2C-bus address (default: 0xC4)
nxp_ip 0:da1fe3fe7093 114 */
nxp_ip 0:da1fe3fe7093 115 PCA9632( PinName i2c_sda, PinName i2c_scl, char i2c_address = DEFAULT_I2C_ADDR );
nxp_ip 0:da1fe3fe7093 116
nxp_ip 0:da1fe3fe7093 117 /** Create a PCA9632 instance connected to specified I2C pins with specified address
nxp_ip 0:da1fe3fe7093 118 *
nxp_ip 0:da1fe3fe7093 119 * @param i2c_obj I2C object (instance)
nxp_ip 0:da1fe3fe7093 120 * @param i2c_address I2C-bus address (default: 0xC4)
nxp_ip 0:da1fe3fe7093 121 */
nxp_ip 0:da1fe3fe7093 122 PCA9632( I2C &i2c_obj, char i2c_address = DEFAULT_I2C_ADDR );
nxp_ip 0:da1fe3fe7093 123
nxp_ip 0:da1fe3fe7093 124 /** Destractor
nxp_ip 0:da1fe3fe7093 125 */
nxp_ip 0:da1fe3fe7093 126 virtual ~PCA9632();
nxp_ip 0:da1fe3fe7093 127
nxp_ip 0:da1fe3fe7093 128 /** Performs Software reset via I2C bus
nxp_ip 0:da1fe3fe7093 129 */
nxp_ip 0:da1fe3fe7093 130 void reset( void );
nxp_ip 0:da1fe3fe7093 131
nxp_ip 0:da1fe3fe7093 132 /** Set the output duty-cycle, specified as a percentage (float)
nxp_ip 0:da1fe3fe7093 133 *
nxp_ip 0:da1fe3fe7093 134 * @param port Selecting output port
nxp_ip 0:da1fe3fe7093 135 * 'ALLPORTS' can be used to set all port duty-cycle same value.
nxp_ip 0:da1fe3fe7093 136 * @param v A floating-point value representing the output duty-cycle,
nxp_ip 0:da1fe3fe7093 137 * specified as a percentage. The value should lie between
nxp_ip 0:da1fe3fe7093 138 * 0.0f (representing on 0%) and 1.0f (representing on 99.6%).
nxp_ip 0:da1fe3fe7093 139 * Values outside this range will have undefined behavior.
nxp_ip 0:da1fe3fe7093 140 */
nxp_ip 0:da1fe3fe7093 141 virtual void pwm( int port, float v );
nxp_ip 0:da1fe3fe7093 142
nxp_ip 0:da1fe3fe7093 143 /** Set all output port duty-cycle, specified as a percentage (array of float)
nxp_ip 0:da1fe3fe7093 144 *
nxp_ip 0:da1fe3fe7093 145 * @param vp Aray to floating-point values representing the output duty-cycle,
nxp_ip 0:da1fe3fe7093 146 * specified as a percentage. The value should lie between
nxp_ip 0:da1fe3fe7093 147 * 0.0f (representing on 0%) and 1.0f (representing on 99.6%).
nxp_ip 0:da1fe3fe7093 148 *
nxp_ip 0:da1fe3fe7093 149 * @note
nxp_ip 0:da1fe3fe7093 150 * The aray should have length of 4
nxp_ip 0:da1fe3fe7093 151 */
nxp_ip 0:da1fe3fe7093 152 void pwm( float *vp );
nxp_ip 0:da1fe3fe7093 153
nxp_ip 0:da1fe3fe7093 154 /** Register write (single byte) : Low level access to device register
nxp_ip 0:da1fe3fe7093 155 *
nxp_ip 0:da1fe3fe7093 156 * @param reg_addr Register address
nxp_ip 0:da1fe3fe7093 157 * @param data Value for setting into the register
nxp_ip 0:da1fe3fe7093 158 */
nxp_ip 0:da1fe3fe7093 159 void write( char reg_addr, char data );
nxp_ip 0:da1fe3fe7093 160
nxp_ip 0:da1fe3fe7093 161 /** Register write (multiple bytes) : Low level access to device register
nxp_ip 0:da1fe3fe7093 162 *
nxp_ip 0:da1fe3fe7093 163 * @param data Pointer to an array. First 1 byte should be the writing start register address
nxp_ip 0:da1fe3fe7093 164 * @param length Length of data
nxp_ip 0:da1fe3fe7093 165 */
nxp_ip 0:da1fe3fe7093 166 void write( char *data, int length );
nxp_ip 0:da1fe3fe7093 167
nxp_ip 0:da1fe3fe7093 168 /** Register read (single byte) : Low level access to device register
nxp_ip 0:da1fe3fe7093 169 *
nxp_ip 0:da1fe3fe7093 170 * @param reg_addr Register address
nxp_ip 0:da1fe3fe7093 171 * @return Read value from register
nxp_ip 0:da1fe3fe7093 172 */
nxp_ip 0:da1fe3fe7093 173 char read( char reg_addr );
nxp_ip 0:da1fe3fe7093 174
nxp_ip 0:da1fe3fe7093 175 /** Register write (multiple bytes) : Low level access to device register
nxp_ip 0:da1fe3fe7093 176 *
nxp_ip 0:da1fe3fe7093 177 * @param reg_addr Register address
nxp_ip 0:da1fe3fe7093 178 * @param data Pointer to an array. The values are stored in this array.
nxp_ip 0:da1fe3fe7093 179 * @param length Length of data
nxp_ip 0:da1fe3fe7093 180 */
nxp_ip 0:da1fe3fe7093 181
nxp_ip 0:da1fe3fe7093 182 void read( char reg_addr, char *data, int length );
nxp_ip 0:da1fe3fe7093 183
nxp_ip 0:da1fe3fe7093 184 protected:
nxp_ip 0:da1fe3fe7093 185 enum {
nxp_ip 0:da1fe3fe7093 186 DEFAULT_I2C_ADDR = 0xC4,
nxp_ip 0:da1fe3fe7093 187 AUTO_INCREMENT = 0x80,
nxp_ip 0:da1fe3fe7093 188 PWMALL = 0xFF
nxp_ip 0:da1fe3fe7093 189 };
nxp_ip 0:da1fe3fe7093 190
nxp_ip 0:da1fe3fe7093 191 private:
nxp_ip 0:da1fe3fe7093 192 void initialize( void );
nxp_ip 0:da1fe3fe7093 193
nxp_ip 0:da1fe3fe7093 194 I2C *i2c_p;
nxp_ip 0:da1fe3fe7093 195 I2C &i2c;
nxp_ip 0:da1fe3fe7093 196 char address; // I2C slave address
nxp_ip 0:da1fe3fe7093 197 }
nxp_ip 0:da1fe3fe7093 198 ;
nxp_ip 0:da1fe3fe7093 199
nxp_ip 0:da1fe3fe7093 200 #endif // MBED_PCA9632