Class which provides functions to control a TAOS TCS3472 Color Light-to-Digital Converter with IR Filter via I2C.

Dependents:   Chipin_Main Test_Color LAB_10_control FINAL_PROJECT ... more

Committer:
karlmaxwell67
Date:
Wed Mar 19 18:48:12 2014 +0000
Revision:
2:38d5187a4e7b
Parent:
1:70d7d9f1af01
Child:
3:6a89ac4a1979
Added functions setIntegrationTime, enableWait, disableWait, enableInterrupt, disableInterrupt and setWaitTime.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
karlmaxwell67 1:70d7d9f1af01 1 #include "TCS3472_I2C.h"
karlmaxwell67 1:70d7d9f1af01 2
karlmaxwell67 1:70d7d9f1af01 3 TCS3472_I2C::TCS3472_I2C( PinName sda, PinName scl ) : i2c_( sda, scl ){
karlmaxwell67 1:70d7d9f1af01 4 i2c_.frequency(400000);
karlmaxwell67 1:70d7d9f1af01 5 enableRGBC();
karlmaxwell67 1:70d7d9f1af01 6 }
karlmaxwell67 1:70d7d9f1af01 7
karlmaxwell67 1:70d7d9f1af01 8 int TCS3472_I2C::writeSingleRegister( char address, char data ){
karlmaxwell67 1:70d7d9f1af01 9 char tx[2] = { address | 160, data }; //0d160 = 0b10100000
karlmaxwell67 1:70d7d9f1af01 10 int ack = i2c_.write( SLAVE_ADDRESS << 1 , tx, 2 );
karlmaxwell67 1:70d7d9f1af01 11 return ack;
karlmaxwell67 1:70d7d9f1af01 12 }
karlmaxwell67 1:70d7d9f1af01 13
karlmaxwell67 1:70d7d9f1af01 14 char TCS3472_I2C::readSingleRegister( char address ){
karlmaxwell67 1:70d7d9f1af01 15 char output = 255;
karlmaxwell67 1:70d7d9f1af01 16 char command = address | 160; //0d160 = 0b10100000
karlmaxwell67 1:70d7d9f1af01 17 i2c_.write( SLAVE_ADDRESS << 1, &command, 1, true );
karlmaxwell67 1:70d7d9f1af01 18 i2c_.read( SLAVE_ADDRESS << 1, &output, 1 );
karlmaxwell67 1:70d7d9f1af01 19 return output;
karlmaxwell67 1:70d7d9f1af01 20 }
karlmaxwell67 1:70d7d9f1af01 21
karlmaxwell67 1:70d7d9f1af01 22 int TCS3472_I2C::readMultipleRegisters( char address, char* output, int quantity ){
karlmaxwell67 1:70d7d9f1af01 23 char command = address | 160; //0d160 = 0b10100000
karlmaxwell67 1:70d7d9f1af01 24 i2c_.write( SLAVE_ADDRESS << 1, &command, 1, true );
karlmaxwell67 1:70d7d9f1af01 25 int ack = i2c_.read( SLAVE_ADDRESS << 1, output, quantity );
karlmaxwell67 1:70d7d9f1af01 26 return ack;
karlmaxwell67 1:70d7d9f1af01 27 }
karlmaxwell67 1:70d7d9f1af01 28
karlmaxwell67 1:70d7d9f1af01 29 int TCS3472_I2C::enableRGBC(){
karlmaxwell67 1:70d7d9f1af01 30 int ack = writeSingleRegister( ENABLE_REGISTER, 3 );
karlmaxwell67 1:70d7d9f1af01 31 return ack;
karlmaxwell67 1:70d7d9f1af01 32 }
karlmaxwell67 1:70d7d9f1af01 33
karlmaxwell67 1:70d7d9f1af01 34 char TCS3472_I2C::readEnableRegister(){
karlmaxwell67 1:70d7d9f1af01 35 return readSingleRegister( ENABLE_REGISTER );
karlmaxwell67 1:70d7d9f1af01 36 }
karlmaxwell67 0:453a43c8bf2b 37
karlmaxwell67 1:70d7d9f1af01 38 int TCS3472_I2C::getAllColours( int* readings ){
karlmaxwell67 1:70d7d9f1af01 39 char buffer[8] = { 0 };
karlmaxwell67 1:70d7d9f1af01 40
karlmaxwell67 1:70d7d9f1af01 41 readMultipleRegisters( CDATA, buffer, 8 );
karlmaxwell67 1:70d7d9f1af01 42
karlmaxwell67 1:70d7d9f1af01 43 readings[0] = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 44 readings[1] = (int)buffer[3] << 8 | (int)buffer[2];
karlmaxwell67 1:70d7d9f1af01 45 readings[2] = (int)buffer[5] << 8 | (int)buffer[4];
karlmaxwell67 1:70d7d9f1af01 46 readings[3] = (int)buffer[7] << 8 | (int)buffer[6];
karlmaxwell67 0:453a43c8bf2b 47
karlmaxwell67 1:70d7d9f1af01 48 return 0;
karlmaxwell67 1:70d7d9f1af01 49 }
karlmaxwell67 1:70d7d9f1af01 50
karlmaxwell67 1:70d7d9f1af01 51 int TCS3472_I2C::getClearData(){
karlmaxwell67 1:70d7d9f1af01 52 char buffer[2] = { 0 };
karlmaxwell67 1:70d7d9f1af01 53 readMultipleRegisters( CDATA, buffer, 2 );
karlmaxwell67 1:70d7d9f1af01 54 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 55 return reading;
karlmaxwell67 1:70d7d9f1af01 56 }
karlmaxwell67 1:70d7d9f1af01 57
karlmaxwell67 1:70d7d9f1af01 58 int TCS3472_I2C::getRedData(){
karlmaxwell67 1:70d7d9f1af01 59 char buffer[2] = { 0 };
karlmaxwell67 1:70d7d9f1af01 60 readMultipleRegisters( RDATA, buffer, 2 );
karlmaxwell67 1:70d7d9f1af01 61 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 62 return reading;
karlmaxwell67 1:70d7d9f1af01 63 }
karlmaxwell67 1:70d7d9f1af01 64
karlmaxwell67 1:70d7d9f1af01 65 int TCS3472_I2C::getGreenData(){
karlmaxwell67 1:70d7d9f1af01 66 char buffer[2] = { 0 };
karlmaxwell67 1:70d7d9f1af01 67 readMultipleRegisters( GDATA, buffer, 2 );
karlmaxwell67 1:70d7d9f1af01 68 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 69 return reading;
karlmaxwell67 1:70d7d9f1af01 70 }
karlmaxwell67 1:70d7d9f1af01 71
karlmaxwell67 1:70d7d9f1af01 72 int TCS3472_I2C::getBlueData(){
karlmaxwell67 1:70d7d9f1af01 73 char buffer[2] = { 0 };
karlmaxwell67 1:70d7d9f1af01 74 readMultipleRegisters( BDATA, buffer, 2 );
karlmaxwell67 1:70d7d9f1af01 75 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 76 return reading;
karlmaxwell67 2:38d5187a4e7b 77 }
karlmaxwell67 2:38d5187a4e7b 78
karlmaxwell67 2:38d5187a4e7b 79 int TCS3472_I2C::setIntegrationTime( const float itime ){
karlmaxwell67 2:38d5187a4e7b 80 char atime = 256 - itime / 2.4;
karlmaxwell67 2:38d5187a4e7b 81 int ack = writeSingleRegister( ATIME, atime );
karlmaxwell67 2:38d5187a4e7b 82 return ack;
karlmaxwell67 2:38d5187a4e7b 83 }
karlmaxwell67 2:38d5187a4e7b 84
karlmaxwell67 2:38d5187a4e7b 85 int TCS3472_I2C::enableWait(){
karlmaxwell67 2:38d5187a4e7b 86 char enable_old = readSingleRegister( ENABLE_REGISTER );
karlmaxwell67 2:38d5187a4e7b 87 char enable_new = enable_old | 8; // sets WEN (bit 4) to 1
karlmaxwell67 2:38d5187a4e7b 88 int ack = writeSingleRegister( ENABLE_REGISTER, enable_new );
karlmaxwell67 2:38d5187a4e7b 89 return ack;
karlmaxwell67 2:38d5187a4e7b 90 }
karlmaxwell67 2:38d5187a4e7b 91
karlmaxwell67 2:38d5187a4e7b 92 int TCS3472_I2C::disableWait(){
karlmaxwell67 2:38d5187a4e7b 93 char enable_old = readSingleRegister( ENABLE_REGISTER );
karlmaxwell67 2:38d5187a4e7b 94 char enable_new = enable_old & 247; // sets WEN (bit 4) to 0
karlmaxwell67 2:38d5187a4e7b 95 int ack = writeSingleRegister( ENABLE_REGISTER, enable_new );
karlmaxwell67 2:38d5187a4e7b 96 return ack;
karlmaxwell67 2:38d5187a4e7b 97 }
karlmaxwell67 2:38d5187a4e7b 98
karlmaxwell67 2:38d5187a4e7b 99 int TCS3472_I2C::enableInterrupt(){
karlmaxwell67 2:38d5187a4e7b 100 char enable_old = readSingleRegister( ENABLE_REGISTER );
karlmaxwell67 2:38d5187a4e7b 101 char enable_new = enable_old | 16; // sets AIEN (bit 5) to 1
karlmaxwell67 2:38d5187a4e7b 102 int ack = writeSingleRegister( ENABLE_REGISTER, enable_new );
karlmaxwell67 2:38d5187a4e7b 103 return ack;
karlmaxwell67 2:38d5187a4e7b 104 }
karlmaxwell67 2:38d5187a4e7b 105
karlmaxwell67 2:38d5187a4e7b 106 int TCS3472_I2C::disableInterrupt(){
karlmaxwell67 2:38d5187a4e7b 107 char enable_old = readSingleRegister( ENABLE_REGISTER );
karlmaxwell67 2:38d5187a4e7b 108 char enable_new = enable_old & 239; // sets AIEN (bit 5) to 0
karlmaxwell67 2:38d5187a4e7b 109 int ack = writeSingleRegister( ENABLE_REGISTER, enable_new );
karlmaxwell67 2:38d5187a4e7b 110 return ack;
karlmaxwell67 2:38d5187a4e7b 111 }
karlmaxwell67 2:38d5187a4e7b 112
karlmaxwell67 2:38d5187a4e7b 113 int TCS3472_I2C::setWaitTime( const float time ){
karlmaxwell67 2:38d5187a4e7b 114 int ack = 1;
karlmaxwell67 2:38d5187a4e7b 115 char wtime = 0;
karlmaxwell67 2:38d5187a4e7b 116 if ( time >= 2.4 && time <= 614.4 ){
karlmaxwell67 2:38d5187a4e7b 117 ack = writeSingleRegister( CONFIGURATION_REGISTER, 0 ); // sets WLONG to 0
karlmaxwell67 2:38d5187a4e7b 118 wtime = 256 - time / 2.4;
karlmaxwell67 2:38d5187a4e7b 119 }
karlmaxwell67 2:38d5187a4e7b 120 else if ( time > 614.4 && time <= 7400 ){
karlmaxwell67 2:38d5187a4e7b 121 ack = writeSingleRegister( CONFIGURATION_REGISTER, 2 ); // sets WLONG to 1
karlmaxwell67 2:38d5187a4e7b 122 wtime = 256 - ( time / 12 ) / 2.4;
karlmaxwell67 2:38d5187a4e7b 123 }
karlmaxwell67 2:38d5187a4e7b 124 ack = ack || writeSingleRegister( WTIME, wtime );
karlmaxwell67 2:38d5187a4e7b 125 return ack;
karlmaxwell67 0:453a43c8bf2b 126 }