This lib allows control of VISHAY VCNL4000 distance/ambient light sensor via I2C bus.
VCNL4000.cpp@0:1720792a6e28, 2012-02-14 (annotated)
- Committer:
- bengo
- Date:
- Tue Feb 14 10:55:19 2012 +0000
- Revision:
- 0:1720792a6e28
This is first beta
Who changed what in which revision?
User | Revision | Line number | New 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 |