Adafruit_VCNL4010.cpp
1 // SPDX-FileCopyrightText: 2019 Anne Barela for Adafruit Industries 2 // 3 // SPDX-License-Identifier: MIT 4 5 #include "Arduino.h" 6 #include "Wire.h" 7 8 #include "Adafruit_VCNL4010.h" 9 10 bool Adafruit_VCNL4010::begin(uint8_t addr) { 11 _i2caddr = addr; 12 Wire.begin(); 13 14 uint8_t rev = read8(VCNL4010_PRODUCTID); 15 if ((rev & 0xF0) != 0x20) { 16 return false; 17 } 18 19 write8(VCNL4010_IRLED, 20); 20 uint8_t r = read8(VCNL4010_MODTIMING); 21 r &= ~(0b00011000); 22 r |= VCNL4010_390K625 << 3; 23 write8(VCNL4010_MODTIMING, r); 24 25 write8(VCNL4010_INTCONTROL, 0x08); 26 return true; 27 } 28 29 uint16_t Adafruit_VCNL4010::readProximity() { 30 uint8_t i = read8(VCNL4010_INTSTAT); 31 i &= ~0x80; 32 write8(VCNL4010_INTSTAT, i); 33 34 write8(VCNL4010_COMMAND, VCNL4010_MEASUREPROXIMITY); 35 while (1) { 36 //Serial.println(read8(VCNL4010_INTSTAT), HEX); 37 uint8_t result = read8(VCNL4010_COMMAND); 38 //Serial.print("Ready = 0x"); Serial.println(result, HEX); 39 if (result & VCNL4010_PROXIMITYREADY) { 40 return read16(VCNL4010_PROXIMITYDATA); 41 } 42 delay(1); 43 } 44 } 45 46 // Read 1 byte from the VCNL4000 at 'address' 47 uint8_t Adafruit_VCNL4010::read8(uint8_t address) 48 { 49 uint8_t data; 50 51 Wire.beginTransmission(_i2caddr); 52 #if ARDUINO >= 100 53 Wire.write(address); 54 #else 55 Wire.send(address); 56 #endif 57 Wire.endTransmission(); 58 59 delayMicroseconds(170); // delay required 60 61 Wire.requestFrom(_i2caddr, (uint8_t)1); 62 while(!Wire.available()); 63 64 #if ARDUINO >= 100 65 return Wire.read(); 66 #else 67 return Wire.receive(); 68 #endif 69 } 70 71 72 // Read 2 byte from the VCNL4000 at 'address' 73 uint16_t Adafruit_VCNL4010::read16(uint8_t address) 74 { 75 uint16_t data; 76 77 Wire.beginTransmission(_i2caddr); 78 #if ARDUINO >= 100 79 Wire.write(address); 80 #else 81 Wire.send(address); 82 #endif 83 Wire.endTransmission(); 84 85 Wire.requestFrom(_i2caddr, (uint8_t)2); 86 while(!Wire.available()); 87 #if ARDUINO >= 100 88 data = Wire.read(); 89 data <<= 8; 90 while(!Wire.available()); 91 data |= Wire.read(); 92 #else 93 data = Wire.receive(); 94 data <<= 8; 95 while(!Wire.available()); 96 data |= Wire.receive(); 97 #endif 98 99 return data; 100 } 101 102 // write 1 byte 103 void Adafruit_VCNL4010::write8(uint8_t address, uint8_t data) 104 { 105 Wire.beginTransmission(_i2caddr); 106 #if ARDUINO >= 100 107 Wire.write(address); 108 Wire.write(data); 109 #else 110 Wire.send(address); 111 Wire.send(data); 112 #endif 113 Wire.endTransmission(); 114 }