This lib allows control of VISHAY VCNL4000 distance/ambient light sensor via I2C bus.

Dependents:   Major_dHome

Committer:
bengo
Date:
Tue Feb 14 10:55:19 2012 +0000
Revision:
0:1720792a6e28
This is first beta

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bengo 0:1720792a6e28 1 #include "VCNL4000.h"
bengo 0:1720792a6e28 2
bengo 0:1720792a6e28 3 const int VCNL4000::VCNL4000address = 0x13;
bengo 0:1720792a6e28 4 const int VCNL4000::VCNL4000regAddr = 0x80;
bengo 0:1720792a6e28 5 const int VCNL4000::Command = 0x0;
bengo 0:1720792a6e28 6 const int VCNL4000::ProdIdRevision = 0x1;
bengo 0:1720792a6e28 7 const int VCNL4000::IRLedCurrent = 0x3;
bengo 0:1720792a6e28 8 const int VCNL4000::AmbientLightParam = 0x4;
bengo 0:1720792a6e28 9 const int VCNL4000::AmbientLightMsb = 0x5;
bengo 0:1720792a6e28 10 const int VCNL4000::AmbientLightLsb = 0x6;
bengo 0:1720792a6e28 11 const int VCNL4000::ProximityMsb = 0x7;
bengo 0:1720792a6e28 12 const int VCNL4000::ProximityLsb = 0x8;
bengo 0:1720792a6e28 13 const int VCNL4000::ProximitySigFreq = 0x9;
bengo 0:1720792a6e28 14 const int VCNL4000::ProxymityModulationTime = 0xa;
bengo 0:1720792a6e28 15
bengo 0:1720792a6e28 16 // ---------------------------------------------------
bengo 0:1720792a6e28 17 VCNL4000::VCNL4000( PinName sda, PinName scl ) : _i2c( sda, scl ) {
bengo 0:1720792a6e28 18
bengo 0:1720792a6e28 19 int prodId = getProductId();
bengo 0:1720792a6e28 20 int prodRev = getProductRevision();
bengo 0:1720792a6e28 21
bengo 0:1720792a6e28 22 if( prodId == 1 && prodRev == 1 ) {
bengo 0:1720792a6e28 23 _status = 0;
bengo 0:1720792a6e28 24 }
bengo 0:1720792a6e28 25 else {
bengo 0:1720792a6e28 26 _status = 1;
bengo 0:1720792a6e28 27 }
bengo 0:1720792a6e28 28 }
bengo 0:1720792a6e28 29
bengo 0:1720792a6e28 30 // ---------------------------------------------------
bengo 0:1720792a6e28 31 VCNL4000::~VCNL4000( void ) {
bengo 0:1720792a6e28 32 }
bengo 0:1720792a6e28 33
bengo 0:1720792a6e28 34 // ---------------------------------------------------
bengo 0:1720792a6e28 35 int VCNL4000::registerRead( int reg ) {
bengo 0:1720792a6e28 36
bengo 0:1720792a6e28 37 _bytes[0] = ( reg & 0xff );
bengo 0:1720792a6e28 38 _status = _i2c.write( ( VCNL4000address << 1 ), _bytes, 1 );
bengo 0:1720792a6e28 39 if( _status == 0 ) {
bengo 0:1720792a6e28 40 _status = _i2c.read( ( ( VCNL4000address << 1 ) + 1 ), _bytes, 1 );
bengo 0:1720792a6e28 41 return( _bytes[0] );
bengo 0:1720792a6e28 42 }
bengo 0:1720792a6e28 43 return( 0 );
bengo 0:1720792a6e28 44 }
bengo 0:1720792a6e28 45
bengo 0:1720792a6e28 46 // ---------------------------------------------------
bengo 0:1720792a6e28 47 void VCNL4000::registerWrite( int reg, unsigned char data ) {
bengo 0:1720792a6e28 48
bengo 0:1720792a6e28 49 _bytes[0] = reg & 0xff;
bengo 0:1720792a6e28 50 _bytes[1] = data & 0xff;
bengo 0:1720792a6e28 51 _status = _i2c.write( VCNL4000address << 1, _bytes, 2 );
bengo 0:1720792a6e28 52
bengo 0:1720792a6e28 53 }
bengo 0:1720792a6e28 54
bengo 0:1720792a6e28 55 // ---------------------------------------------------
bengo 0:1720792a6e28 56 int VCNL4000::getProximity( void ) {
bengo 0:1720792a6e28 57
bengo 0:1720792a6e28 58 startProximityMeasurement();
bengo 0:1720792a6e28 59 while( !proximityDataReady() ) {
bengo 0:1720792a6e28 60 wait(0.1);
bengo 0:1720792a6e28 61 }
bengo 0:1720792a6e28 62 _data = registerRead( VCNL4000regAddr + ProximityMsb ) << 8;
bengo 0:1720792a6e28 63 int status = _status;
bengo 0:1720792a6e28 64 _data += registerRead( VCNL4000regAddr + ProximityLsb );
bengo 0:1720792a6e28 65 _status = _status | status;
bengo 0:1720792a6e28 66 return( _data );
bengo 0:1720792a6e28 67 }
bengo 0:1720792a6e28 68
bengo 0:1720792a6e28 69 // ---------------------------------------------------
bengo 0:1720792a6e28 70 int VCNL4000::getAmbientLight( void ) {
bengo 0:1720792a6e28 71 startAmbientLightMeasurement();
bengo 0:1720792a6e28 72 while( !ambientLightDataReady() ) {
bengo 0:1720792a6e28 73 wait(0.1);
bengo 0:1720792a6e28 74 }
bengo 0:1720792a6e28 75 _data = registerRead( VCNL4000regAddr + AmbientLightMsb ) << 8;
bengo 0:1720792a6e28 76 int status = _status;
bengo 0:1720792a6e28 77 _data += registerRead( VCNL4000regAddr + AmbientLightLsb );
bengo 0:1720792a6e28 78 _status = _status | status;
bengo 0:1720792a6e28 79 return( _data );
bengo 0:1720792a6e28 80 }
bengo 0:1720792a6e28 81
bengo 0:1720792a6e28 82 // ---------------------------------------------------
bengo 0:1720792a6e28 83 int VCNL4000::getProductId( void ) {
bengo 0:1720792a6e28 84 return( ( registerRead( VCNL4000regAddr + ProdIdRevision ) & 0xf0 ) >> 4 );
bengo 0:1720792a6e28 85 }
bengo 0:1720792a6e28 86
bengo 0:1720792a6e28 87 // ---------------------------------------------------
bengo 0:1720792a6e28 88 int VCNL4000::getProductRevision( void ) {
bengo 0:1720792a6e28 89 return( registerRead( VCNL4000regAddr + ProdIdRevision ) & 0x0f ) ;
bengo 0:1720792a6e28 90 }
bengo 0:1720792a6e28 91
bengo 0:1720792a6e28 92 // ---------------------------------------------------
bengo 0:1720792a6e28 93 bool VCNL4000::proximityDataReady( void ) {
bengo 0:1720792a6e28 94 return( ( registerRead( VCNL4000regAddr + Command ) & 0x20 ) >> 5 );
bengo 0:1720792a6e28 95 }
bengo 0:1720792a6e28 96
bengo 0:1720792a6e28 97 // ---------------------------------------------------
bengo 0:1720792a6e28 98 bool VCNL4000::ambientLightDataReady( void ) {
bengo 0:1720792a6e28 99 return( ( registerRead( VCNL4000regAddr + Command ) & 0x40 ) >> 6 );
bengo 0:1720792a6e28 100 }
bengo 0:1720792a6e28 101
bengo 0:1720792a6e28 102 // ---------------------------------------------------
bengo 0:1720792a6e28 103 void VCNL4000::startProximityMeasurement( void ) {
bengo 0:1720792a6e28 104 _data = registerRead( VCNL4000regAddr + Command );
bengo 0:1720792a6e28 105 if( _status == 0 ) {
bengo 0:1720792a6e28 106 _data = _data | 0x08;
bengo 0:1720792a6e28 107 registerWrite( VCNL4000regAddr + Command, _data );
bengo 0:1720792a6e28 108 }
bengo 0:1720792a6e28 109 }
bengo 0:1720792a6e28 110
bengo 0:1720792a6e28 111 // ---------------------------------------------------
bengo 0:1720792a6e28 112 void VCNL4000::startAmbientLightMeasurement( void ) {
bengo 0:1720792a6e28 113 _data = registerRead( VCNL4000regAddr + Command );
bengo 0:1720792a6e28 114 if( _status == 0 ) {
bengo 0:1720792a6e28 115 _data = _data | 0x10;
bengo 0:1720792a6e28 116 registerWrite( VCNL4000regAddr + Command, _data );
bengo 0:1720792a6e28 117 }
bengo 0:1720792a6e28 118 }
bengo 0:1720792a6e28 119
bengo 0:1720792a6e28 120 // ---------------------------------------------------
bengo 0:1720792a6e28 121 void VCNL4000::setIRLedCurrent( int milliAmps ) {
bengo 0:1720792a6e28 122 milliAmps /= 10;
bengo 0:1720792a6e28 123 if( milliAmps > 20 ) {
bengo 0:1720792a6e28 124 _status = 1;
bengo 0:1720792a6e28 125 return;
bengo 0:1720792a6e28 126 }
bengo 0:1720792a6e28 127 _data = registerRead( VCNL4000regAddr + IRLedCurrent );
bengo 0:1720792a6e28 128 if( _status == 0 ) {
bengo 0:1720792a6e28 129 _data = ( _data & 0xc0 ) | milliAmps;
bengo 0:1720792a6e28 130 registerWrite( VCNL4000regAddr + IRLedCurrent, _data );
bengo 0:1720792a6e28 131 }
bengo 0:1720792a6e28 132 }
bengo 0:1720792a6e28 133
bengo 0:1720792a6e28 134 // ---------------------------------------------------
bengo 0:1720792a6e28 135 void VCNL4000::enableALContinuousConversionMode( void ) {
bengo 0:1720792a6e28 136 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 137 if( _status == 0 ) {
bengo 0:1720792a6e28 138 _data = _data | 0x80;
bengo 0:1720792a6e28 139 registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
bengo 0:1720792a6e28 140 }
bengo 0:1720792a6e28 141 }
bengo 0:1720792a6e28 142
bengo 0:1720792a6e28 143 // ---------------------------------------------------
bengo 0:1720792a6e28 144 void VCNL4000::disableALContinuousConversionMode( void ) {
bengo 0:1720792a6e28 145 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 146 if( _status == 0 ) {
bengo 0:1720792a6e28 147 _data = _data & 0x7f;
bengo 0:1720792a6e28 148 registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
bengo 0:1720792a6e28 149 }
bengo 0:1720792a6e28 150 }
bengo 0:1720792a6e28 151
bengo 0:1720792a6e28 152 // ---------------------------------------------------
bengo 0:1720792a6e28 153 bool VCNL4000::isALContinuousConversionMode( void ) {
bengo 0:1720792a6e28 154 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 155 if( ( ( _data >> 7 ) & 1 ) == 1 ) {
bengo 0:1720792a6e28 156 return( true );
bengo 0:1720792a6e28 157 }
bengo 0:1720792a6e28 158 else {
bengo 0:1720792a6e28 159 return( false );
bengo 0:1720792a6e28 160 }
bengo 0:1720792a6e28 161 }
bengo 0:1720792a6e28 162
bengo 0:1720792a6e28 163 // ---------------------------------------------------
bengo 0:1720792a6e28 164 void VCNL4000::enableALAutoOffsetCompensation( void ) {
bengo 0:1720792a6e28 165 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 166 if( _status == 0 ) {
bengo 0:1720792a6e28 167 _data = _data | 0x08;
bengo 0:1720792a6e28 168 registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
bengo 0:1720792a6e28 169 }
bengo 0:1720792a6e28 170 }
bengo 0:1720792a6e28 171
bengo 0:1720792a6e28 172 // ---------------------------------------------------
bengo 0:1720792a6e28 173 void VCNL4000::disableALAutoOffsetCompensation( void ) {
bengo 0:1720792a6e28 174 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 175 if( _status == 0 ) {
bengo 0:1720792a6e28 176 _data = _data & 0xf7;
bengo 0:1720792a6e28 177 registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
bengo 0:1720792a6e28 178 }
bengo 0:1720792a6e28 179 }
bengo 0:1720792a6e28 180
bengo 0:1720792a6e28 181 // ---------------------------------------------------
bengo 0:1720792a6e28 182 bool VCNL4000::iseALAutoOffsetCompensation( void ) {
bengo 0:1720792a6e28 183 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 184 if( ( ( _data >> 3 ) & 1 ) == 1 ) {
bengo 0:1720792a6e28 185 return( true );
bengo 0:1720792a6e28 186 }
bengo 0:1720792a6e28 187 else {
bengo 0:1720792a6e28 188 return( false );
bengo 0:1720792a6e28 189 }
bengo 0:1720792a6e28 190 }
bengo 0:1720792a6e28 191
bengo 0:1720792a6e28 192 // ---------------------------------------------------
bengo 0:1720792a6e28 193 void VCNL4000::setALAveragingFunction( int measurements ) {
bengo 0:1720792a6e28 194 if( measurements > 7 ) {
bengo 0:1720792a6e28 195 _status = 1;
bengo 0:1720792a6e28 196 return;
bengo 0:1720792a6e28 197 }
bengo 0:1720792a6e28 198 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 199 if( _status == 0 ) {
bengo 0:1720792a6e28 200 _data = ( _data & 0xf8 ) | measurements;
bengo 0:1720792a6e28 201 registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
bengo 0:1720792a6e28 202 }
bengo 0:1720792a6e28 203 }
bengo 0:1720792a6e28 204
bengo 0:1720792a6e28 205 // ---------------------------------------------------
bengo 0:1720792a6e28 206 int VCNL4000::gettALAveragingFunction( void ) {
bengo 0:1720792a6e28 207 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 208 if( _status == 0 ) {
bengo 0:1720792a6e28 209 return( _data & 0xf );
bengo 0:1720792a6e28 210 }
bengo 0:1720792a6e28 211 else {
bengo 0:1720792a6e28 212 return( 0 );
bengo 0:1720792a6e28 213 }
bengo 0:1720792a6e28 214 }
bengo 0:1720792a6e28 215
bengo 0:1720792a6e28 216 // ---------------------------------------------------
bengo 0:1720792a6e28 217 void VCNL4000::setProximityMeasurementSigFreq( int frequency ) {
bengo 0:1720792a6e28 218 if( frequency > 3 ) {
bengo 0:1720792a6e28 219 _status = 1;
bengo 0:1720792a6e28 220 return;
bengo 0:1720792a6e28 221 }
bengo 0:1720792a6e28 222 _data = registerRead( VCNL4000regAddr + ProximitySigFreq );
bengo 0:1720792a6e28 223 if( _status == 0 ) {
bengo 0:1720792a6e28 224 _data = ( _data & 0xfc ) | frequency;
bengo 0:1720792a6e28 225 registerWrite( VCNL4000regAddr + ProximitySigFreq, _data );
bengo 0:1720792a6e28 226 }
bengo 0:1720792a6e28 227 }
bengo 0:1720792a6e28 228
bengo 0:1720792a6e28 229 // ---------------------------------------------------
bengo 0:1720792a6e28 230 int VCNL4000::getProximityMeasurementSigFreq( void ) {
bengo 0:1720792a6e28 231 _data = registerRead( VCNL4000regAddr + ProximitySigFreq );
bengo 0:1720792a6e28 232 if( _status == 0 ) {
bengo 0:1720792a6e28 233 return( _data & 0x3 );
bengo 0:1720792a6e28 234 }
bengo 0:1720792a6e28 235 else {
bengo 0:1720792a6e28 236 return( 0 );
bengo 0:1720792a6e28 237 }
bengo 0:1720792a6e28 238 }
bengo 0:1720792a6e28 239
bengo 0:1720792a6e28 240 // ---------------------------------------------------
bengo 0:1720792a6e28 241 void VCNL4000::setProxiModulatorDelayTime( int delayTime ) {
bengo 0:1720792a6e28 242 if( delayTime > 7 ) {
bengo 0:1720792a6e28 243 _status = 1;
bengo 0:1720792a6e28 244 return;
bengo 0:1720792a6e28 245 }
bengo 0:1720792a6e28 246 _data = registerRead( VCNL4000regAddr + ProxymityModulationTime );
bengo 0:1720792a6e28 247 if( _status == 0 ) {
bengo 0:1720792a6e28 248 _data = ( _data & 0x1f ) | ( delayTime << 5 );
bengo 0:1720792a6e28 249 registerWrite( VCNL4000regAddr + ProxymityModulationTime, _data );
bengo 0:1720792a6e28 250 }
bengo 0:1720792a6e28 251 }
bengo 0:1720792a6e28 252
bengo 0:1720792a6e28 253 // ---------------------------------------------------
bengo 0:1720792a6e28 254 int VCNL4000::getProxiModulatorDelayTime( void ) {
bengo 0:1720792a6e28 255 _data = registerRead( VCNL4000regAddr + ProxymityModulationTime );
bengo 0:1720792a6e28 256 if( _status == 0 ) {
bengo 0:1720792a6e28 257 return( ( _data >> 5 ) & 0x7 );
bengo 0:1720792a6e28 258 }
bengo 0:1720792a6e28 259 else {
bengo 0:1720792a6e28 260 return( 0 );
bengo 0:1720792a6e28 261 }
bengo 0:1720792a6e28 262 }
bengo 0:1720792a6e28 263
bengo 0:1720792a6e28 264 // ---------------------------------------------------
bengo 0:1720792a6e28 265 void VCNL4000::setProxiModulatorDeadTime( int deadTime ) {
bengo 0:1720792a6e28 266 if( deadTime > 7 ) {
bengo 0:1720792a6e28 267 _status = 1;
bengo 0:1720792a6e28 268 return;
bengo 0:1720792a6e28 269 }
bengo 0:1720792a6e28 270 _data = registerRead( VCNL4000regAddr + ProxymityModulationTime );
bengo 0:1720792a6e28 271 if( _status == 0 ) {
bengo 0:1720792a6e28 272 _data = ( _data & 0x07 ) | deadTime;
bengo 0:1720792a6e28 273 registerWrite( VCNL4000regAddr + ProxymityModulationTime, _data );
bengo 0:1720792a6e28 274 }
bengo 0:1720792a6e28 275 }
bengo 0:1720792a6e28 276
bengo 0:1720792a6e28 277 // ---------------------------------------------------
bengo 0:1720792a6e28 278 int VCNL4000::getProxiModulatorDeadTime( void ) {
bengo 0:1720792a6e28 279 _data = registerRead( VCNL4000regAddr + ProxymityModulationTime );
bengo 0:1720792a6e28 280 if( _status == 0 ) {
bengo 0:1720792a6e28 281 return( _data & 0x7 );
bengo 0:1720792a6e28 282 }
bengo 0:1720792a6e28 283 else {
bengo 0:1720792a6e28 284 return( 0 );
bengo 0:1720792a6e28 285 }
bengo 0:1720792a6e28 286 }
bengo 0:1720792a6e28 287
bengo 0:1720792a6e28 288 // ---------------------------------------------------
bengo 0:1720792a6e28 289