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.
Dependents: openwear-lifelogger-example
Fork of TCS3472_I2C by
Revision 3:6a89ac4a1979, committed 2014-03-20
- Comitter:
- karlmaxwell67
- Date:
- Thu Mar 20 16:56:56 2014 +0000
- Parent:
- 2:38d5187a4e7b
- Child:
- 4:5d1f8d7d81ff
- Commit message:
- Added more functions to increase the functionality of the class.
Changed in this revision
| TCS3472_I2C.cpp | Show annotated file Show diff for this revision Revisions of this file |
| TCS3472_I2C.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/TCS3472_I2C.cpp Wed Mar 19 18:48:12 2014 +0000
+++ b/TCS3472_I2C.cpp Thu Mar 20 16:56:56 2014 +0000
@@ -1,40 +1,41 @@
#include "TCS3472_I2C.h"
-TCS3472_I2C::TCS3472_I2C( PinName sda, PinName scl ) : i2c_( sda, scl ){
- i2c_.frequency(400000);
- enableRGBC();
+TCS3472_I2C::TCS3472_I2C( PinName sda, PinName scl ) : i2c( sda, scl ){
+ i2c.frequency(400000);
+ enablePowerAndRGBC();
}
int TCS3472_I2C::writeSingleRegister( char address, char data ){
char tx[2] = { address | 160, data }; //0d160 = 0b10100000
- int ack = i2c_.write( SLAVE_ADDRESS << 1 , tx, 2 );
+ int ack = i2c.write( SLAVE_ADDRESS << 1, tx, 2 );
+ return ack;
+}
+
+int TCS3472_I2C::writeMultipleRegisters( char address, char* data, int quantity ){
+ char tx[ quantity + 1 ];
+ tx[0] = address | 160;
+ for ( int i = 1; i <= quantity; i++ ){
+ tx[ i ] = data[ i - 1 ];
+ }
+ int ack = i2c.write( SLAVE_ADDRESS << 1, tx, quantity + 1 );
return ack;
}
char TCS3472_I2C::readSingleRegister( char address ){
char output = 255;
char command = address | 160; //0d160 = 0b10100000
- i2c_.write( SLAVE_ADDRESS << 1, &command, 1, true );
- i2c_.read( SLAVE_ADDRESS << 1, &output, 1 );
+ i2c.write( SLAVE_ADDRESS << 1, &command, 1, true );
+ i2c.read( SLAVE_ADDRESS << 1, &output, 1 );
return output;
}
int TCS3472_I2C::readMultipleRegisters( char address, char* output, int quantity ){
char command = address | 160; //0d160 = 0b10100000
- i2c_.write( SLAVE_ADDRESS << 1, &command, 1, true );
- int ack = i2c_.read( SLAVE_ADDRESS << 1, output, quantity );
+ i2c.write( SLAVE_ADDRESS << 1, &command, 1, true );
+ int ack = i2c.read( SLAVE_ADDRESS << 1, output, quantity );
return ack;
}
-int TCS3472_I2C::enableRGBC(){
- int ack = writeSingleRegister( ENABLE_REGISTER, 3 );
- return ack;
-}
-
-char TCS3472_I2C::readEnableRegister(){
- return readSingleRegister( ENABLE_REGISTER );
-}
-
int TCS3472_I2C::getAllColours( int* readings ){
char buffer[8] = { 0 };
@@ -76,37 +77,79 @@
return reading;
}
-int TCS3472_I2C::setIntegrationTime( const float itime ){
- char atime = 256 - itime / 2.4;
- int ack = writeSingleRegister( ATIME, atime );
+int TCS3472_I2C::enablePower(){
+ char enable_old = readSingleRegister( ENABLE );
+ char enable_new = enable_old | 1; // sets PON (bit 0) to 1
+ int ack = writeSingleRegister( ENABLE, enable_new );
+ return ack;
+}
+
+int TCS3472_I2C::disablePower(){
+ char enable_old = readSingleRegister( ENABLE );
+ char enable_new = enable_old & 254; // sets PON (bit 0) to 0
+ int ack = writeSingleRegister( ENABLE, enable_new );
+ return ack;
+}
+
+int TCS3472_I2C::enableRGBC(){
+ char enable_old = readSingleRegister( ENABLE );
+ char enable_new = enable_old | 2; // sets AEN (bit 1) to 1
+ int ack = writeSingleRegister( ENABLE, enable_new );
+ return ack;
+}
+
+int TCS3472_I2C::disableRGBC(){
+ char enable_old = readSingleRegister( ENABLE );
+ char enable_new = enable_old & 253; // sets AEN (bit 1) to 0
+ int ack = writeSingleRegister( ENABLE, enable_new );
+ return ack;
+}
+
+int TCS3472_I2C::enablePowerAndRGBC(){
+ char enable_old = readSingleRegister( ENABLE );
+ char enable_new = enable_old | 3; // sets PON (bit 0) and AEN (bit 1) to 1
+ int ack = writeSingleRegister( ENABLE, enable_new );
+ return ack;
+}
+
+int TCS3472_I2C::disablePowerAndRGBC(){
+ char enable_old = readSingleRegister( ENABLE );
+ char enable_new = enable_old | 252; // sets PON (bit 0) and AEN (bit 1) to 0
+ int ack = writeSingleRegister( ENABLE, enable_new );
return ack;
}
int TCS3472_I2C::enableWait(){
- char enable_old = readSingleRegister( ENABLE_REGISTER );
+ char enable_old = readSingleRegister( ENABLE );
char enable_new = enable_old | 8; // sets WEN (bit 4) to 1
- int ack = writeSingleRegister( ENABLE_REGISTER, enable_new );
+ int ack = writeSingleRegister( ENABLE, enable_new );
return ack;
}
int TCS3472_I2C::disableWait(){
- char enable_old = readSingleRegister( ENABLE_REGISTER );
+ char enable_old = readSingleRegister( ENABLE );
char enable_new = enable_old & 247; // sets WEN (bit 4) to 0
- int ack = writeSingleRegister( ENABLE_REGISTER, enable_new );
+ int ack = writeSingleRegister( ENABLE, enable_new );
return ack;
}
int TCS3472_I2C::enableInterrupt(){
- char enable_old = readSingleRegister( ENABLE_REGISTER );
+ char enable_old = readSingleRegister( ENABLE );
char enable_new = enable_old | 16; // sets AIEN (bit 5) to 1
- int ack = writeSingleRegister( ENABLE_REGISTER, enable_new );
+ int ack = writeSingleRegister( ENABLE, enable_new );
return ack;
}
int TCS3472_I2C::disableInterrupt(){
- char enable_old = readSingleRegister( ENABLE_REGISTER );
+ char enable_old = readSingleRegister( ENABLE );
char enable_new = enable_old & 239; // sets AIEN (bit 5) to 0
- int ack = writeSingleRegister( ENABLE_REGISTER, enable_new );
+ int ack = writeSingleRegister( ENABLE, enable_new );
+ return ack;
+}
+
+int TCS3472_I2C::setIntegrationTime( const float itime ){
+ char atime = 256 - itime / 2.4;
+ int ack = writeSingleRegister( ATIME, atime );
return ack;
}
@@ -114,13 +157,232 @@
int ack = 1;
char wtime = 0;
if ( time >= 2.4 && time <= 614.4 ){
- ack = writeSingleRegister( CONFIGURATION_REGISTER, 0 ); // sets WLONG to 0
+ ack = writeSingleRegister( CONFIG, 0 ); // sets WLONG to 0
wtime = 256 - time / 2.4;
}
else if ( time > 614.4 && time <= 7400 ){
- ack = writeSingleRegister( CONFIGURATION_REGISTER, 2 ); // sets WLONG to 1
+ ack = writeSingleRegister( CONFIG, 2 ); // sets WLONG to 1
wtime = 256 - ( time / 12 ) / 2.4;
}
ack = ack || writeSingleRegister( WTIME, wtime );
return ack;
+}
+
+char TCS3472_I2C::readEnableRegister(){
+ return readSingleRegister( ENABLE );
+}
+
+int TCS3472_I2C::readLowInterruptThreshold(){
+ char buffer[2] = { 0 };
+ readMultipleRegisters( AILTL, buffer, 2 );
+ int reading = (int)buffer[1] << 8 | (int)buffer[0];
+ return reading;
+}
+
+int TCS3472_I2C::readHighInterruptThreshold(){
+ char buffer[2] = { 0 };
+ readMultipleRegisters( AIHTL, buffer, 2 );
+ int reading = (int)buffer[1] << 8 | (int)buffer[0];
+ return reading;
+}
+
+int TCS3472_I2C::setLowInterruptThreshold( const int threshold ){
+ char threshold_bytes[2];
+ threshold_bytes[0] = threshold; // take lowest 8 bits of threshold
+ threshold_bytes[1] = threshold >> 8; // take highest 8 bits of threshold
+ int ack = writeMultipleRegisters( AILTL, threshold_bytes, 2 );
+ return ack;
+}
+
+int TCS3472_I2C::setHighInterruptThreshold( const int threshold ){
+ char threshold_bytes[2];
+ threshold_bytes[0] = threshold;
+ threshold_bytes[1] = threshold >> 8;
+ int ack = writeMultipleRegisters( AIHTL, threshold_bytes, 2 );
+ return ack;
+}
+
+int TCS3472_I2C::readInterruptPersistence(){
+ char pers = readSingleRegister( PERS );
+ char persistence_bits = ( pers << 4 ) >> 4; // discard bits 4 to 7, keep only bits 0 to 3
+ int persistence = -1;
+ switch (persistence_bits){
+ case 0:
+ persistence = 0;
+ break;
+ case 1:
+ persistence = 1;
+ break;
+ case 2:
+ persistence = 2;
+ break;
+ case 3:
+ persistence = 3;
+ break;
+ case 4:
+ persistence = 5;
+ break;
+ case 5:
+ persistence = 10;
+ break;
+ case 6:
+ persistence = 15;
+ break;
+ case 7:
+ persistence = 20;
+ break;
+ case 8:
+ persistence = 25;
+ break;
+ case 9:
+ persistence = 30;
+ break;
+ case 10:
+ persistence = 35;
+ break;
+ case 11:
+ persistence = 40;
+ break;
+ case 12:
+ persistence = 45;
+ break;
+ case 13:
+ persistence = 50;
+ break;
+ case 14:
+ persistence = 55;
+ break;
+ case 15:
+ persistence = 60;
+ break;
+ default:
+ break;
+ }
+ return persistence;
+}
+
+int TCS3472_I2C::setInterruptPersistence( const int persistence ){
+ char pers_byte;
+ int ack = 0;
+ switch (persistence){
+ case 0:
+ pers_byte = 0;
+ break;
+ case 1:
+ pers_byte = 1;
+ break;
+ case 2:
+ pers_byte = 2;
+ break;
+ case 3:
+ pers_byte = 3;
+ break;
+ case 5:
+ pers_byte = 4;
+ break;
+ case 10:
+ pers_byte = 5;
+ break;
+ case 15:
+ pers_byte = 6;
+ break;
+ case 20:
+ pers_byte = 7;
+ break;
+ case 25:
+ pers_byte = 8;
+ break;
+ case 30:
+ pers_byte = 9;
+ break;
+ case 35:
+ pers_byte = 10;
+ break;
+ case 40:
+ pers_byte = 11;
+ break;
+ case 45:
+ pers_byte = 12;
+ break;
+ case 50:
+ pers_byte = 13;
+ break;
+ case 55:
+ pers_byte = 14;
+ break;
+ case 60:
+ pers_byte = 15;
+ break;
+ default:
+ ack = 2; // 2 used to indicate invalid entry
+ break;
+ }
+ if ( ack != 2 ){
+ ack = writeSingleRegister( PERS, pers_byte );
+ }
+ return ack;
+}
+
+int TCS3472_I2C::clearInterrupt(){
+ char tx = 230;
+ int ack = i2c.write( SLAVE_ADDRESS << 1, &tx, 1 );
+ return ack;
+}
+
+int TCS3472_I2C::readRGBCGain(){
+ char control = readSingleRegister( CONTROL );
+ char gain_bits = ( control << 6 ) >> 6; // discard bits 2 to 7, keep only bits 0 & 1
+ int gain;
+ switch (gain_bits) {
+ case 0:
+ gain = 1;
+ break;
+ case 1:
+ gain = 4;
+ break;
+ case 2:
+ gain = 16;
+ break;
+ case 3:
+ gain = 60;
+ break;
+ default:
+ gain = 0;
+ break;
+ }
+ return gain;
+}
+
+int TCS3472_I2C::setRGBCGain( const int gain ){
+ char control;
+ int ack = 0;
+ switch (gain){
+ case 1:
+ control = 0;
+ break;
+ case 4:
+ control = 1;
+ break;
+ case 16:
+ control = 2;
+ break;
+ case 60:
+ control = 3;
+ break;
+ default:
+ ack = 2; // 2 used to indicate invalid entry
+ break;
+ }
+ if ( ack != 2 ){
+ ack = writeSingleRegister( CONTROL, control );
+ }
+ return ack;
+}
+
+char TCS3472_I2C::getDeviceID(){
+ return readSingleRegister( ID );
+}
+
+char TCS3472_I2C::readStatusRegister(){
+ return readSingleRegister( STATUS );
}
\ No newline at end of file
--- a/TCS3472_I2C.h Wed Mar 19 18:48:12 2014 +0000
+++ b/TCS3472_I2C.h Thu Mar 20 16:56:56 2014 +0000
@@ -5,10 +5,16 @@
//Defines
#define SLAVE_ADDRESS 0x29
-#define ENABLE_REGISTER 0x00
+#define ENABLE 0x00
#define ATIME 0x01
#define WTIME 0x03
-#define CONFIGURATION_REGISTER 0x0D
+#define AILTL 0x04
+#define AIHTL 0x06
+#define PERS 0x0C
+#define CONFIG 0x0D
+#define CONTROL 0x0F
+#define ID 0x12
+#define STATUS 0x13
#define CDATA 0x14
#define RDATA 0x16
#define GDATA 0x18
@@ -23,20 +29,38 @@
int getRedData();
int getGreenData();
int getBlueData();
-
- int setIntegrationTime( const float itime ); // itime (in ms) should be in the range 2.4 - 614.4ms.
+
+ int enablePower();
+ int disablePower();
+ int enableRGBC();
+ int disableRGBC();
+ int enablePowerAndRGBC();
+ int disablePowerAndRGBC();
int enableWait();
int disableWait();
int enableInterrupt();
int disableInterrupt();
int setWaitTime( const float wtime ); // wtime (in ms) should be in the range 2.4 - 7400ms.
+ int setIntegrationTime( const float itime ); // itime (in ms) should be in the range 2.4 - 614.4ms.
+
+ char readEnableRegister();
+ int readLowInterruptThreshold();
+ int readHighInterruptThreshold();
+ int setLowInterruptThreshold( const int threshold );
+ int setHighInterruptThreshold( const int threshold );
+ int readInterruptPersistence();
+ int setInterruptPersistence( const int persistence ); // persistence must be 0, 1, 2, 3, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55 or 60
+ int clearInterrupt();
+ int readRGBCGain();
+ int setRGBCGain( const int gain ); // gain must be 1, 4, 16 or 60
+ char getDeviceID();
+ char readStatusRegister();
private:
- I2C i2c_;
+ I2C i2c;
- int enableRGBC();
- char readEnableRegister();
int writeSingleRegister( char address, char data );
+ int writeMultipleRegisters( char address, char* data, int quantity );
char readSingleRegister( char address );
int readMultipleRegisters( char address, char* output, int quantity );
};
