For use with STM32L746RG . Class which provides functions to control a TAOS TCS3472 Color Light-to-Digital Converter with IR Filter via I2C.
Fork of TCS3472_I2C by
TCS3472_I2C.cpp@2:38d5187a4e7b, 2014-03-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |