InetrfaceProducts NXP / PCA962x

Dependencies:   CompLedDvr

Dependents:   PCA9626_Hello PCA9624_Hello PCA9622_Hello

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PCA962x.cpp Source File

PCA962x.cpp

00001 #include    "mbed.h"
00002 #include    "PCA962x.h"
00003 
00004 PCA962x::PCA962x( 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 }
00008 
00009 PCA962x::PCA962x( I2C &i2c_, char i2c_address )
00010     : i2c_p( NULL ), i2c( i2c_ ), address( i2c_address )
00011 {
00012 }
00013 
00014 PCA962x::~PCA962x()
00015 {
00016     if ( NULL != i2c_p )
00017         delete  i2c_p;
00018 }
00019 
00020 void PCA962x::reset( void )
00021 {
00022     char    va[]    = { 0xA5, 0x5A };
00023     i2c.write( 0x06, va, sizeof( va ) );
00024 }
00025 
00026 void PCA962x::pwm( int port, float v )
00027 {
00028     char    reg_addr;
00029 
00030     reg_addr    = pwm_register_access( port );
00031 
00032     if ( PWMALL == reg_addr ) {
00033         int     np  = number_of_ports();
00034         float   va[ np ];
00035         
00036         for ( int i = 0; i < np; i++ )
00037             va[ i ]  = v;
00038 
00039         pwm( va );
00040         
00041     } else {
00042         write( reg_addr, (char)(v * 255.0) );
00043     }
00044 }
00045 
00046 void PCA962x::pwm( float *vp )
00047 {
00048     int     n_of_ports  = number_of_ports();
00049     char    data[ n_of_ports + 1 ];
00050 
00051     *data    = pwm_register_access( 0 );
00052 
00053     for ( int i = 1; i <= n_of_ports; i++ )
00054         data[ i ]   = (char)(*vp++ * 255.0);
00055 
00056     write( data, sizeof( data ) );
00057 }
00058 
00059 void PCA962x::write( char *data, int length )
00060 {
00061     *data   |= AUTO_INCREMENT;
00062     i2c.write( address, data, length );
00063 }
00064 
00065 void PCA962x::write( char reg_addr, char data )
00066 {
00067     char    c[2];
00068 
00069     c[0]    = reg_addr;
00070     c[1]    = data;
00071 
00072     i2c.write( address, c, 2 );
00073 }
00074 
00075 void PCA962x::read( char reg_addr, char *data, int length )
00076 {
00077     reg_addr    |= 0x80;
00078     i2c.write( address, (char *)(&reg_addr), 1, true );
00079     i2c.read(  address, data, length );
00080 }
00081 
00082 char PCA962x::read( char reg_addr )
00083 {
00084     i2c.write( address, (char *)(&reg_addr), 1, true );
00085     i2c.read(  address, (char *)(&reg_addr), 1 );
00086 
00087     return ( reg_addr );
00088 }