Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
PCA9632.cpp@0:da1fe3fe7093, 2015-03-04 (annotated)
- Committer:
- nxp_ip
- Date:
- Wed Mar 04 04:12:53 2015 +0000
- Revision:
- 0:da1fe3fe7093
Initial version
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| nxp_ip | 0:da1fe3fe7093 | 1 | #include "mbed.h" |
| nxp_ip | 0:da1fe3fe7093 | 2 | #include "PCA9632.h" |
| nxp_ip | 0:da1fe3fe7093 | 3 | |
| nxp_ip | 0:da1fe3fe7093 | 4 | PCA9632::PCA9632( PinName i2c_sda, PinName i2c_scl, char i2c_address ) |
| nxp_ip | 0:da1fe3fe7093 | 5 | : i2c_p( new I2C( i2c_sda, i2c_scl ) ), i2c( *i2c_p ), address( i2c_address ) |
| nxp_ip | 0:da1fe3fe7093 | 6 | { |
| nxp_ip | 0:da1fe3fe7093 | 7 | initialize(); |
| nxp_ip | 0:da1fe3fe7093 | 8 | } |
| nxp_ip | 0:da1fe3fe7093 | 9 | |
| nxp_ip | 0:da1fe3fe7093 | 10 | PCA9632::PCA9632( I2C &i2c_, char i2c_address ) |
| nxp_ip | 0:da1fe3fe7093 | 11 | : i2c_p( NULL ), i2c( i2c_ ), address( i2c_address ) |
| nxp_ip | 0:da1fe3fe7093 | 12 | { |
| nxp_ip | 0:da1fe3fe7093 | 13 | initialize(); |
| nxp_ip | 0:da1fe3fe7093 | 14 | } |
| nxp_ip | 0:da1fe3fe7093 | 15 | |
| nxp_ip | 0:da1fe3fe7093 | 16 | PCA9632::~PCA9632() |
| nxp_ip | 0:da1fe3fe7093 | 17 | { |
| nxp_ip | 0:da1fe3fe7093 | 18 | if ( NULL != i2c_p ) |
| nxp_ip | 0:da1fe3fe7093 | 19 | delete i2c_p; |
| nxp_ip | 0:da1fe3fe7093 | 20 | } |
| nxp_ip | 0:da1fe3fe7093 | 21 | |
| nxp_ip | 0:da1fe3fe7093 | 22 | void PCA9632::initialize( void ) |
| nxp_ip | 0:da1fe3fe7093 | 23 | { |
| nxp_ip | 0:da1fe3fe7093 | 24 | char init_array0[] = { |
| nxp_ip | 0:da1fe3fe7093 | 25 | AUTO_INCREMENT | REGISTER_START, // Command |
| nxp_ip | 0:da1fe3fe7093 | 26 | 0x01, 0x00, // MODE1, MODE2 |
| nxp_ip | 0:da1fe3fe7093 | 27 | }; |
| nxp_ip | 0:da1fe3fe7093 | 28 | char init_array1[] = { |
| nxp_ip | 0:da1fe3fe7093 | 29 | AUTO_INCREMENT | LEDOUT, // Command |
| nxp_ip | 0:da1fe3fe7093 | 30 | 0xAA, // LEDOUT |
| nxp_ip | 0:da1fe3fe7093 | 31 | }; |
| nxp_ip | 0:da1fe3fe7093 | 32 | |
| nxp_ip | 0:da1fe3fe7093 | 33 | write( init_array0, sizeof( init_array0 ) ); |
| nxp_ip | 0:da1fe3fe7093 | 34 | write( init_array1, sizeof( init_array1 ) ); |
| nxp_ip | 0:da1fe3fe7093 | 35 | } |
| nxp_ip | 0:da1fe3fe7093 | 36 | |
| nxp_ip | 0:da1fe3fe7093 | 37 | void PCA9632::reset( void ) |
| nxp_ip | 0:da1fe3fe7093 | 38 | { |
| nxp_ip | 0:da1fe3fe7093 | 39 | char va[] = { 0xA5, 0x5A }; |
| nxp_ip | 0:da1fe3fe7093 | 40 | i2c.write( 0x06, va, sizeof( va ) ); |
| nxp_ip | 0:da1fe3fe7093 | 41 | } |
| nxp_ip | 0:da1fe3fe7093 | 42 | |
| nxp_ip | 0:da1fe3fe7093 | 43 | void PCA9632::pwm( int port, float v ) |
| nxp_ip | 0:da1fe3fe7093 | 44 | { |
| nxp_ip | 0:da1fe3fe7093 | 45 | char reg_addr; |
| nxp_ip | 0:da1fe3fe7093 | 46 | |
| nxp_ip | 0:da1fe3fe7093 | 47 | if ( port < N_OF_PORTS ) { |
| nxp_ip | 0:da1fe3fe7093 | 48 | reg_addr = PWM_REGISTER_START + port; |
| nxp_ip | 0:da1fe3fe7093 | 49 | write( reg_addr, (char)(v * 255.0) ); |
| nxp_ip | 0:da1fe3fe7093 | 50 | } else { |
| nxp_ip | 0:da1fe3fe7093 | 51 | float va[ N_OF_PORTS ]; |
| nxp_ip | 0:da1fe3fe7093 | 52 | |
| nxp_ip | 0:da1fe3fe7093 | 53 | for ( int i = 0; i < N_OF_PORTS; i++ ) |
| nxp_ip | 0:da1fe3fe7093 | 54 | va[ i ] = v; |
| nxp_ip | 0:da1fe3fe7093 | 55 | |
| nxp_ip | 0:da1fe3fe7093 | 56 | pwm( va ); |
| nxp_ip | 0:da1fe3fe7093 | 57 | } |
| nxp_ip | 0:da1fe3fe7093 | 58 | } |
| nxp_ip | 0:da1fe3fe7093 | 59 | |
| nxp_ip | 0:da1fe3fe7093 | 60 | void PCA9632::pwm( float *vp ) |
| nxp_ip | 0:da1fe3fe7093 | 61 | { |
| nxp_ip | 0:da1fe3fe7093 | 62 | char data[ N_OF_PORTS + 1 ]; |
| nxp_ip | 0:da1fe3fe7093 | 63 | |
| nxp_ip | 0:da1fe3fe7093 | 64 | *data = PWM_REGISTER_START; |
| nxp_ip | 0:da1fe3fe7093 | 65 | |
| nxp_ip | 0:da1fe3fe7093 | 66 | for ( int i = 1; i <= N_OF_PORTS; i++ ) |
| nxp_ip | 0:da1fe3fe7093 | 67 | data[ i ] = (char)(*vp++ * 255.0); |
| nxp_ip | 0:da1fe3fe7093 | 68 | |
| nxp_ip | 0:da1fe3fe7093 | 69 | write( data, sizeof( data ) ); |
| nxp_ip | 0:da1fe3fe7093 | 70 | } |
| nxp_ip | 0:da1fe3fe7093 | 71 | |
| nxp_ip | 0:da1fe3fe7093 | 72 | void PCA9632::write( char *data, int length ) |
| nxp_ip | 0:da1fe3fe7093 | 73 | { |
| nxp_ip | 0:da1fe3fe7093 | 74 | *data |= AUTO_INCREMENT; |
| nxp_ip | 0:da1fe3fe7093 | 75 | i2c.write( address, data, length ); |
| nxp_ip | 0:da1fe3fe7093 | 76 | } |
| nxp_ip | 0:da1fe3fe7093 | 77 | |
| nxp_ip | 0:da1fe3fe7093 | 78 | void PCA9632::write( char reg_addr, char data ) |
| nxp_ip | 0:da1fe3fe7093 | 79 | { |
| nxp_ip | 0:da1fe3fe7093 | 80 | char c[2]; |
| nxp_ip | 0:da1fe3fe7093 | 81 | |
| nxp_ip | 0:da1fe3fe7093 | 82 | c[0] = reg_addr; |
| nxp_ip | 0:da1fe3fe7093 | 83 | c[1] = data; |
| nxp_ip | 0:da1fe3fe7093 | 84 | |
| nxp_ip | 0:da1fe3fe7093 | 85 | i2c.write( address, c, 2 ); |
| nxp_ip | 0:da1fe3fe7093 | 86 | } |
| nxp_ip | 0:da1fe3fe7093 | 87 | |
| nxp_ip | 0:da1fe3fe7093 | 88 | void PCA9632::read( char reg_addr, char *data, int length ) |
| nxp_ip | 0:da1fe3fe7093 | 89 | { |
| nxp_ip | 0:da1fe3fe7093 | 90 | reg_addr |= 0x80; |
| nxp_ip | 0:da1fe3fe7093 | 91 | i2c.write( address, (char *)(®_addr), 1, true ); |
| nxp_ip | 0:da1fe3fe7093 | 92 | i2c.read( address, data, length ); |
| nxp_ip | 0:da1fe3fe7093 | 93 | } |
| nxp_ip | 0:da1fe3fe7093 | 94 | |
| nxp_ip | 0:da1fe3fe7093 | 95 | char PCA9632::read( char reg_addr ) |
| nxp_ip | 0:da1fe3fe7093 | 96 | { |
| nxp_ip | 0:da1fe3fe7093 | 97 | i2c.write( address, (char *)(®_addr), 1, true ); |
| nxp_ip | 0:da1fe3fe7093 | 98 | i2c.read( address, (char *)(®_addr), 1 ); |
| nxp_ip | 0:da1fe3fe7093 | 99 | |
| nxp_ip | 0:da1fe3fe7093 | 100 | return ( reg_addr ); |
| nxp_ip | 0:da1fe3fe7093 | 101 | } |
PCA9632 : 4ch LED driver (voltage switch type)