PCA9955A test program

Dependencies:   mbed

main.cpp

Committer:
okano
Date:
2014-07-18
Revision:
3:dbe7902d4335
Parent:
2:ead3652b6fd2
Child:
4:507e37f8008d

File content as of revision 3:dbe7902d4335:

#include "mbed.h"

I2C i2c( p28, p27 );    //  SDA, SCL

#define     SLAVE_ADDR              0x02

#define     AUTO_INCREMENT          0x80
#define     REGISTER_START          0x00
#define     LEDOUT_REGISTER_START   0x02
#define     PWM_REGISTER_START      0x08
#define     IREF_REGISTER_START     0x18
#define     PWMALL_REGISTER_ADDR    0x44
#define     IREFALL_REGISTER_ADDR   0x45

void register_write( char addr, char data );
void manual_control( void );


int main()
{
    char    init_data0[]    = { AUTO_INCREMENT | REGISTER_START, 0x00, 0x25, 0xAA, 0xAA, 0xAA, 0xAA };
    char    init_data1[]    = { IREFALL_REGISTER_ADDR, 0x10 };

    i2c.write( SLAVE_ADDR, init_data0, sizeof( init_data0 ) );
    i2c.write( SLAVE_ADDR, init_data1, sizeof( init_data1 ) );

    for ( int i = 0; i < 256; i++ ) {
        register_write( PWMALL_REGISTER_ADDR, i );
        wait( 0.01 );
    }


#if 1

    while(1) {
        manual_control();
    }

#endif

}

void register_write( char addr, char data )
{
    char    d[ 2 ];

    d[ 0 ]   = addr;
    d[ 1 ]   = data;
    i2c.write( SLAVE_ADDR, d, 2 );
}



Serial      pc(USBTX, USBRX);    // tx, rx

void manual_control( void )
{
    static char     duty    = 0xFF;
    static char     freq    = 0x00;

    if ( pc.readable() ) {
        switch ( pc.getc() ) {
            case 'b' :
                printf( "  [b] : blink on\r\n" );
                register_write( 1, 0x25 );
                register_write( LEDOUT_REGISTER_START, 0xFF );
                register_write( LEDOUT_REGISTER_START + 2, 0xFF );
                break;
            case 'd' :
                printf( "  [d] : blink off\r\n" );
                register_write( 1, 0x05 );
                register_write( LEDOUT_REGISTER_START, 0xFF );
                register_write( LEDOUT_REGISTER_START + 2, 0xFF );
                break;
            case 'x' :
                duty    = (duty == 0xFF) ? 0xFF : duty + 1;
                register_write( 0x06, duty );
                break;
            case 'z' :
                duty    = (duty == 0x00) ? 0x00 : duty - 1;
                register_write( 0x06, duty );
                break;
            case '.' :
                freq    = (freq == 0xFF) ? 0xFF : freq + 1;
                register_write( 0x07, freq );
                break;
            case ',' :
                freq    = (freq == 0x00) ? 0x00 : freq - 1;
                register_write( 0x07, freq );
                break;
        }
        printf( "  GRPPWM=0x%02X, GRPFREQ=0x%02X (period=%.3f)\r", duty, freq, (float)(freq + 1)/15.26 );
    }
}