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.
Please refer to the component page for details
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 ); } } }
Diff: PCA9632.cpp
- Revision:
- 0:da1fe3fe7093
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PCA9632.cpp Wed Mar 04 04:12:53 2015 +0000 @@ -0,0 +1,101 @@ +#include "mbed.h" +#include "PCA9632.h" + +PCA9632::PCA9632( PinName i2c_sda, PinName i2c_scl, char i2c_address ) + : i2c_p( new I2C( i2c_sda, i2c_scl ) ), i2c( *i2c_p ), address( i2c_address ) +{ + initialize(); +} + +PCA9632::PCA9632( I2C &i2c_, char i2c_address ) + : i2c_p( NULL ), i2c( i2c_ ), address( i2c_address ) +{ + initialize(); +} + +PCA9632::~PCA9632() +{ + if ( NULL != i2c_p ) + delete i2c_p; +} + +void PCA9632::initialize( void ) +{ + char init_array0[] = { + AUTO_INCREMENT | REGISTER_START, // Command + 0x01, 0x00, // MODE1, MODE2 + }; + char init_array1[] = { + AUTO_INCREMENT | LEDOUT, // Command + 0xAA, // LEDOUT + }; + + write( init_array0, sizeof( init_array0 ) ); + write( init_array1, sizeof( init_array1 ) ); +} + +void PCA9632::reset( void ) +{ + char va[] = { 0xA5, 0x5A }; + i2c.write( 0x06, va, sizeof( va ) ); +} + +void PCA9632::pwm( int port, float v ) +{ + char reg_addr; + + if ( port < N_OF_PORTS ) { + reg_addr = PWM_REGISTER_START + port; + write( reg_addr, (char)(v * 255.0) ); + } else { + float va[ N_OF_PORTS ]; + + for ( int i = 0; i < N_OF_PORTS; i++ ) + va[ i ] = v; + + pwm( va ); + } +} + +void PCA9632::pwm( float *vp ) +{ + char data[ N_OF_PORTS + 1 ]; + + *data = PWM_REGISTER_START; + + for ( int i = 1; i <= N_OF_PORTS; i++ ) + data[ i ] = (char)(*vp++ * 255.0); + + write( data, sizeof( data ) ); +} + +void PCA9632::write( char *data, int length ) +{ + *data |= AUTO_INCREMENT; + i2c.write( address, data, length ); +} + +void PCA9632::write( char reg_addr, char data ) +{ + char c[2]; + + c[0] = reg_addr; + c[1] = data; + + i2c.write( address, c, 2 ); +} + +void PCA9632::read( char reg_addr, char *data, int length ) +{ + reg_addr |= 0x80; + i2c.write( address, (char *)(®_addr), 1, true ); + i2c.read( address, data, length ); +} + +char PCA9632::read( char reg_addr ) +{ + i2c.write( address, (char *)(®_addr), 1, true ); + i2c.read( address, (char *)(®_addr), 1 ); + + return ( reg_addr ); +}