InetrfaceProducts NXP / PCA9632

Dependencies:   CompLedDvr

Dependents:   PCA9632_Hello

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PCA9632.cpp Source File

PCA9632.cpp

00001 #include    "mbed.h"
00002 #include    "PCA9632.h"
00003 
00004 PCA9632::PCA9632( PinName i2c_sda, PinName i2c_scl, char i2c_address )
00005     : i2c_p( new I2C( i2c_sda, i2c_scl ) ), i2c( *i2c_p ), address( i2c_address )
00006 {
00007     initialize();
00008 }
00009 
00010 PCA9632::PCA9632( I2C &i2c_, char i2c_address )
00011     : i2c_p( NULL ), i2c( i2c_ ), address( i2c_address )
00012 {
00013     initialize();
00014 }
00015 
00016 PCA9632::~PCA9632()
00017 {
00018     if ( NULL != i2c_p )
00019         delete  i2c_p;
00020 }
00021 
00022 void PCA9632::initialize( void )
00023 {
00024     char init_array0[] = {
00025         AUTO_INCREMENT | REGISTER_START,   //  Command
00026         0x01, 0x00,                        //  MODE1, MODE2
00027     };
00028     char init_array1[] = {
00029         AUTO_INCREMENT | LEDOUT,           //  Command
00030         0xAA,                              //  LEDOUT
00031     };
00032 
00033     write( init_array0, sizeof( init_array0 ) );
00034     write( init_array1, sizeof( init_array1 ) );
00035 }
00036 
00037 void PCA9632::reset( void )
00038 {
00039     char    va[]    = { 0xA5, 0x5A };
00040     i2c.write( 0x06, va, sizeof( va ) );
00041 }
00042 
00043 void PCA9632::pwm( int port, float v )
00044 {
00045     char    reg_addr;
00046 
00047     if ( port < N_OF_PORTS ) {
00048         reg_addr    = PWM_REGISTER_START + port;
00049         write( reg_addr, (char)(v * 255.0) );
00050     } else {
00051         float   va[ N_OF_PORTS ];
00052 
00053         for ( int i = 0; i < N_OF_PORTS; i++ )
00054             va[ i ]  = v;
00055 
00056         pwm( va );
00057     }
00058 }
00059 
00060 void PCA9632::pwm( float *vp )
00061 {
00062     char    data[ N_OF_PORTS + 1 ];
00063 
00064     *data    = PWM_REGISTER_START;
00065 
00066     for ( int i = 1; i <= N_OF_PORTS; i++ )
00067         data[ i ]   = (char)(*vp++ * 255.0);
00068 
00069     write( data, sizeof( data ) );
00070 }
00071 
00072 void PCA9632::write( char *data, int length )
00073 {
00074     *data   |= AUTO_INCREMENT;
00075     i2c.write( address, data, length );
00076 }
00077 
00078 void PCA9632::write( char reg_addr, char data )
00079 {
00080     char    c[2];
00081 
00082     c[0]    = reg_addr;
00083     c[1]    = data;
00084 
00085     i2c.write( address, c, 2 );
00086 }
00087 
00088 void PCA9632::read( char reg_addr, char *data, int length )
00089 {
00090     reg_addr    |= 0x80;
00091     i2c.write( address, (char *)(&reg_addr), 1, true );
00092     i2c.read(  address, data, length );
00093 }
00094 
00095 char PCA9632::read( char reg_addr )
00096 {
00097     i2c.write( address, (char *)(&reg_addr), 1, true );
00098     i2c.read(  address, (char *)(&reg_addr), 1 );
00099 
00100     return ( reg_addr );
00101 }