VCNL4020, Fully Integrated Proximity and Ambient Light Sensor with Infrared Emitter, I2C Interface, and Interrupt Function

Dependents:   testVCNL4020 testSensor

Committer:
Rhyme
Date:
Wed Mar 29 04:39:07 2017 +0000
Revision:
0:95952f8fe2b4
Child:
1:4f4cdaf51fc2
First working version. no document nor interrupt mode tested

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:95952f8fe2b4 1 #include "mbed.h"
Rhyme 0:95952f8fe2b4 2 #include "VCNL4020.h"
Rhyme 0:95952f8fe2b4 3
Rhyme 0:95952f8fe2b4 4 /* Register address definitions */
Rhyme 0:95952f8fe2b4 5 #define REG_COMMAND 0x80
Rhyme 0:95952f8fe2b4 6 #define REG_PRODUCT_ID_REV 0x81
Rhyme 0:95952f8fe2b4 7 #define REG_PROXIMITY_RATE 0x82
Rhyme 0:95952f8fe2b4 8 #define REG_IR_LED_CURRENT 0x83
Rhyme 0:95952f8fe2b4 9 #define REG_AMBIENT_LIGHT_PARAM 0x84
Rhyme 0:95952f8fe2b4 10 #define REG_AMBIENT_LIGHT_RESULT 0x85
Rhyme 0:95952f8fe2b4 11 #define REG_AMBIENT_LIGHT_MSB 0x85
Rhyme 0:95952f8fe2b4 12 #define REG_AMBIENT_LIGHT_LSB 0x86
Rhyme 0:95952f8fe2b4 13 #define REG_PROXIMITY_RESULT 0x87
Rhyme 0:95952f8fe2b4 14 #define REG_PROXIMITY_MSB 0x87
Rhyme 0:95952f8fe2b4 15 #define REG_PROXIMITY_LSB 0x88
Rhyme 0:95952f8fe2b4 16 #define REG_INTERRUPT_CONTROL 0x89
Rhyme 0:95952f8fe2b4 17 #define REG_LOW_THRESHOLD_MSB 0x8A
Rhyme 0:95952f8fe2b4 18 #define REG_LOW_THRESHOLD_LSB 0x8B
Rhyme 0:95952f8fe2b4 19 #define REG_HIGH_THRESHOLD_MSB 0x8C
Rhyme 0:95952f8fe2b4 20 #define REG_HIGH_THRESHOLD_LSB 0x8D
Rhyme 0:95952f8fe2b4 21 #define REG_INTERRUPT_STATUS 0x8E
Rhyme 0:95952f8fe2b4 22 #define REG_PROXIMITY_MOD_TIMING 0x8F
Rhyme 0:95952f8fe2b4 23
Rhyme 0:95952f8fe2b4 24 /* bit definitions */
Rhyme 0:95952f8fe2b4 25 /* Command Register (0x80) Register #0 */
Rhyme 0:95952f8fe2b4 26 /* bit[7] config_lock Read only bit. Value = 1 */
Rhyme 0:95952f8fe2b4 27 #define BIT_CONFIG_LOCK 0x80
Rhyme 0:95952f8fe2b4 28
Rhyme 0:95952f8fe2b4 29 /* bit[6] als_data_rdy Read only bit.
Rhyme 0:95952f8fe2b4 30 * Value = 1 when ambient light measurement data is availabe in thre result registers.
Rhyme 0:95952f8fe2b4 31 * This bit will be reset when one of the corresponding result registers (reg #5, reg #6) is read */
Rhyme 0:95952f8fe2b4 32 #define BIT_ALS_DATA_RDY 0x40
Rhyme 0:95952f8fe2b4 33
Rhyme 0:95952f8fe2b4 34 /* bit[5] prox_data_rdy Read only bit.
Rhyme 0:95952f8fe2b4 35 * Value = 1 when proximity measurement data is available in the result registers.
Rhyme 0:95952f8fe2b4 36 * This bit will be reset when one of the corresponding result registers (reg #7, reg #8) is read */
Rhyme 0:95952f8fe2b4 37 #define BIT_PROX_DATA_RDY 0x20
Rhyme 0:95952f8fe2b4 38
Rhyme 0:95952f8fe2b4 39 /* bit[4] als_od R/W bit.
Rhyme 0:95952f8fe2b4 40 * Starts a single on-demand measurement for ambient light.
Rhyme 0:95952f8fe2b4 41 * If averaging is enabled, starts a sequence of readings and stores the averaged result.
Rhyme 0:95952f8fe2b4 42 * Result is available at the end of conversion for reading in the registers #5(HB) and #6(LB). */
Rhyme 0:95952f8fe2b4 43 #define BIT_ALS_OD 0x10
Rhyme 0:95952f8fe2b4 44
Rhyme 0:95952f8fe2b4 45 /* bit[3] prox_od R/W bit.
Rhyme 0:95952f8fe2b4 46 * Starts a single on-demand measurement for proximity.
Rhyme 0:95952f8fe2b4 47 * Result is available at the end of conversion for reading in the registers #7(HB) and #8(LB). */
Rhyme 0:95952f8fe2b4 48 #define BIT_PROX_OD 0x08
Rhyme 0:95952f8fe2b4 49
Rhyme 0:95952f8fe2b4 50 /* bit[2] als_en R/W bit. Enables periodic als measurement */
Rhyme 0:95952f8fe2b4 51 #define BIT_ALS_EN 0x04
Rhyme 0:95952f8fe2b4 52
Rhyme 0:95952f8fe2b4 53 /* bit[1] prox_en R/W bit. Enables periodic proximity measurement */
Rhyme 0:95952f8fe2b4 54 #define BIT_PROX_EN 0x02
Rhyme 0:95952f8fe2b4 55
Rhyme 0:95952f8fe2b4 56 /* bit[0] sleftimed_en R/W bit.
Rhyme 0:95952f8fe2b4 57 * Enables state machine and LP oscillator for self timed measurements;
Rhyme 0:95952f8fe2b4 58 * no measurement is performed until the correnponding bit is set */
Rhyme 0:95952f8fe2b4 59 #define BIT_SELFTIMED_EN 0x01
Rhyme 0:95952f8fe2b4 60
Rhyme 0:95952f8fe2b4 61 /* Note: With setting bit[3] and bit[4] at the same write command,
Rhyme 0:95952f8fe2b4 62 * a simultaneously measurement of ambient light and proximity is done.
Rhyme 0:95952f8fe2b4 63 * Beside als_en and/or prox_en first selftimed_en needs to be set.
Rhyme 0:95952f8fe2b4 64 * On-demand measurement modes are disabled if setltimed_en bit is set.
Rhyme 0:95952f8fe2b4 65 * For the selftimed_en mode changes in reading rates (reg #5 and reg #2)
Rhyme 0:95952f8fe2b4 66 * can be made only when b[0] (seltfimed_en bit) = 0.
Rhyme 0:95952f8fe2b4 67 * For the als_od mode changes to the reg #4 can be made only when b[4](als_od bit) = 0;
Rhyme 0:95952f8fe2b4 68 * this is to avoid synchronization problems and undefined states between
Rhyme 0:95952f8fe2b4 69 * the clock domains. In effect this means that it is only reasonable to change
Rhyme 0:95952f8fe2b4 70 * rates while no selftimed conversion is ongoing. */
Rhyme 0:95952f8fe2b4 71
Rhyme 0:95952f8fe2b4 72 uint8_t VCNL4020::getCommandReg(void)
Rhyme 0:95952f8fe2b4 73 {
Rhyme 0:95952f8fe2b4 74 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 75 readRegs(REG_COMMAND, &cmd, 1) ;
Rhyme 0:95952f8fe2b4 76 return(cmd) ;
Rhyme 0:95952f8fe2b4 77 }
Rhyme 0:95952f8fe2b4 78
Rhyme 0:95952f8fe2b4 79 void VCNL4020::setCommandReg(uint8_t cmd)
Rhyme 0:95952f8fe2b4 80 {
Rhyme 0:95952f8fe2b4 81 uint8_t data[2] ;
Rhyme 0:95952f8fe2b4 82 data[0] = REG_COMMAND ;
Rhyme 0:95952f8fe2b4 83 data[1] = cmd ;
Rhyme 0:95952f8fe2b4 84 writeRegs(data, 2) ;
Rhyme 0:95952f8fe2b4 85 }
Rhyme 0:95952f8fe2b4 86
Rhyme 0:95952f8fe2b4 87 uint8_t VCNL4020::getConfigLock(void)
Rhyme 0:95952f8fe2b4 88 {
Rhyme 0:95952f8fe2b4 89 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 90 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 91 cmd = (cmd >> 7) & 0x01 ;
Rhyme 0:95952f8fe2b4 92 return(cmd) ;
Rhyme 0:95952f8fe2b4 93 }
Rhyme 0:95952f8fe2b4 94
Rhyme 0:95952f8fe2b4 95 void VCNL4020::setConfigLock(void)
Rhyme 0:95952f8fe2b4 96 {
Rhyme 0:95952f8fe2b4 97 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 98 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 99 cmd |= BIT_CONFIG_LOCK ;
Rhyme 0:95952f8fe2b4 100 setCommandReg(cmd) ;
Rhyme 0:95952f8fe2b4 101 }
Rhyme 0:95952f8fe2b4 102
Rhyme 0:95952f8fe2b4 103 void VCNL4020::clearConfigLock(void)
Rhyme 0:95952f8fe2b4 104 {
Rhyme 0:95952f8fe2b4 105 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 106 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 107 cmd ^= BIT_CONFIG_LOCK ;
Rhyme 0:95952f8fe2b4 108 setCommandReg(cmd) ;
Rhyme 0:95952f8fe2b4 109 }
Rhyme 0:95952f8fe2b4 110
Rhyme 0:95952f8fe2b4 111 uint8_t VCNL4020::alsDataReady(void)
Rhyme 0:95952f8fe2b4 112 {
Rhyme 0:95952f8fe2b4 113 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 114 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 115 cmd = (cmd >> 6) & 0x01 ;
Rhyme 0:95952f8fe2b4 116 return(cmd) ;
Rhyme 0:95952f8fe2b4 117 }
Rhyme 0:95952f8fe2b4 118
Rhyme 0:95952f8fe2b4 119 uint8_t VCNL4020::proxDataReady(void)
Rhyme 0:95952f8fe2b4 120 {
Rhyme 0:95952f8fe2b4 121 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 122 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 123 cmd = (cmd >> 5) & 0x01 ;
Rhyme 0:95952f8fe2b4 124 return(cmd) ;
Rhyme 0:95952f8fe2b4 125 }
Rhyme 0:95952f8fe2b4 126
Rhyme 0:95952f8fe2b4 127 void VCNL4020::trigAlsOd(void)
Rhyme 0:95952f8fe2b4 128 {
Rhyme 0:95952f8fe2b4 129 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 130 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 131 cmd |= BIT_ALS_OD ;
Rhyme 0:95952f8fe2b4 132 setCommandReg(cmd) ;
Rhyme 0:95952f8fe2b4 133 }
Rhyme 0:95952f8fe2b4 134
Rhyme 0:95952f8fe2b4 135 void VCNL4020::trigProxOd(void)
Rhyme 0:95952f8fe2b4 136 {
Rhyme 0:95952f8fe2b4 137 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 138 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 139 cmd |= BIT_PROX_OD ;
Rhyme 0:95952f8fe2b4 140 setCommandReg(cmd) ;
Rhyme 0:95952f8fe2b4 141 }
Rhyme 0:95952f8fe2b4 142
Rhyme 0:95952f8fe2b4 143 void VCNL4020::trigBothOd(void)
Rhyme 0:95952f8fe2b4 144 {
Rhyme 0:95952f8fe2b4 145 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 146 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 147 cmd |= (BIT_ALS_OD | BIT_PROX_OD) ;
Rhyme 0:95952f8fe2b4 148 setCommandReg(cmd) ;
Rhyme 0:95952f8fe2b4 149 }
Rhyme 0:95952f8fe2b4 150
Rhyme 0:95952f8fe2b4 151 uint8_t VCNL4020::getAlsPeriodicEnable(void)
Rhyme 0:95952f8fe2b4 152 {
Rhyme 0:95952f8fe2b4 153 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 154 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 155 cmd = (cmd >> 2) & 0x01 ;
Rhyme 0:95952f8fe2b4 156 return(cmd) ;
Rhyme 0:95952f8fe2b4 157 }
Rhyme 0:95952f8fe2b4 158
Rhyme 0:95952f8fe2b4 159 void VCNL4020::enableAlsPeriodic(void)
Rhyme 0:95952f8fe2b4 160 {
Rhyme 0:95952f8fe2b4 161 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 162 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 163 cmd |= BIT_ALS_EN ;
Rhyme 0:95952f8fe2b4 164 setCommandReg(cmd) ;
Rhyme 0:95952f8fe2b4 165 }
Rhyme 0:95952f8fe2b4 166
Rhyme 0:95952f8fe2b4 167 void VCNL4020::disableAlsPeriodic(void)
Rhyme 0:95952f8fe2b4 168 {
Rhyme 0:95952f8fe2b4 169 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 170 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 171 cmd ^= BIT_ALS_EN ;
Rhyme 0:95952f8fe2b4 172 setCommandReg(cmd) ;
Rhyme 0:95952f8fe2b4 173 }
Rhyme 0:95952f8fe2b4 174
Rhyme 0:95952f8fe2b4 175 uint8_t VCNL4020::getProxPeriodicEnable(void)
Rhyme 0:95952f8fe2b4 176 {
Rhyme 0:95952f8fe2b4 177 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 178 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 179 cmd = (cmd >> 1) & 0x01 ;
Rhyme 0:95952f8fe2b4 180 return(cmd) ;
Rhyme 0:95952f8fe2b4 181 }
Rhyme 0:95952f8fe2b4 182
Rhyme 0:95952f8fe2b4 183 void VCNL4020::enableProxPeriodic(void)
Rhyme 0:95952f8fe2b4 184 {
Rhyme 0:95952f8fe2b4 185 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 186 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 187 cmd |= BIT_PROX_EN ;
Rhyme 0:95952f8fe2b4 188 setCommandReg(cmd) ;
Rhyme 0:95952f8fe2b4 189 }
Rhyme 0:95952f8fe2b4 190
Rhyme 0:95952f8fe2b4 191 void VCNL4020::disableProxPeriodic(void)
Rhyme 0:95952f8fe2b4 192 {
Rhyme 0:95952f8fe2b4 193 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 194 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 195 cmd ^= BIT_PROX_EN ;
Rhyme 0:95952f8fe2b4 196 setCommandReg(cmd) ;
Rhyme 0:95952f8fe2b4 197 }
Rhyme 0:95952f8fe2b4 198
Rhyme 0:95952f8fe2b4 199 uint8_t VCNL4020::getSelfTimedEnable(void)
Rhyme 0:95952f8fe2b4 200 {
Rhyme 0:95952f8fe2b4 201 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 202 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 203 cmd = cmd & BIT_SELFTIMED_EN ;
Rhyme 0:95952f8fe2b4 204 return(cmd) ;
Rhyme 0:95952f8fe2b4 205 }
Rhyme 0:95952f8fe2b4 206
Rhyme 0:95952f8fe2b4 207 void VCNL4020::enableSelfTimed(void)
Rhyme 0:95952f8fe2b4 208 {
Rhyme 0:95952f8fe2b4 209 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 210 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 211 cmd |= BIT_SELFTIMED_EN ;
Rhyme 0:95952f8fe2b4 212 setCommandReg(cmd) ;
Rhyme 0:95952f8fe2b4 213 }
Rhyme 0:95952f8fe2b4 214
Rhyme 0:95952f8fe2b4 215 void VCNL4020::disableSelfTimed(void)
Rhyme 0:95952f8fe2b4 216 {
Rhyme 0:95952f8fe2b4 217 uint8_t cmd ;
Rhyme 0:95952f8fe2b4 218 cmd = getCommandReg() ;
Rhyme 0:95952f8fe2b4 219 cmd ^= BIT_SELFTIMED_EN ;
Rhyme 0:95952f8fe2b4 220 setCommandReg(cmd) ;
Rhyme 0:95952f8fe2b4 221 }
Rhyme 0:95952f8fe2b4 222
Rhyme 0:95952f8fe2b4 223 /* Product ID Revision (0x81) Register #1 */
Rhyme 0:95952f8fe2b4 224 /* bit[7:4] Product ID Read Only bits. Value = 2 */
Rhyme 0:95952f8fe2b4 225 /* bit[3:0] Revision ID Read Only bits. Value = 1 */
Rhyme 0:95952f8fe2b4 226 uint8_t VCNL4020::getProdID(void)
Rhyme 0:95952f8fe2b4 227 {
Rhyme 0:95952f8fe2b4 228 uint8_t prod_id ;
Rhyme 0:95952f8fe2b4 229 readRegs(REG_PRODUCT_ID_REV, &prod_id, 1) ;
Rhyme 0:95952f8fe2b4 230 prod_id = (prod_id >> 4) & 0x0F ;
Rhyme 0:95952f8fe2b4 231 return(prod_id) ;
Rhyme 0:95952f8fe2b4 232 }
Rhyme 0:95952f8fe2b4 233
Rhyme 0:95952f8fe2b4 234 /* Proximity Rate (0x82) Register #2 */
Rhyme 0:95952f8fe2b4 235 /* bit[7:3] (reserved) */
Rhyme 0:95952f8fe2b4 236 /* bit[2:1] Rate of Proximity Measurement (no. of measurements per second) */
Rhyme 0:95952f8fe2b4 237 /* R/W bits */
Rhyme 0:95952f8fe2b4 238 /* 000 - 1.95 measurements/s (DEFAULT) */
Rhyme 0:95952f8fe2b4 239 /* 001 - 3.90626 */
Rhyme 0:95952f8fe2b4 240 /* 010 - 7.8125 */
Rhyme 0:95952f8fe2b4 241 /* 011 - 16.625 */
Rhyme 0:95952f8fe2b4 242 /* 100 - 31.25 */
Rhyme 0:95952f8fe2b4 243 /* 101 - 62.5 */
Rhyme 0:95952f8fe2b4 244 /* 110 - 125 */
Rhyme 0:95952f8fe2b4 245 /* 111 - 250 */
Rhyme 0:95952f8fe2b4 246 uint8_t VCNL4020::getProxRate(void)
Rhyme 0:95952f8fe2b4 247 {
Rhyme 0:95952f8fe2b4 248 uint8_t rate ;
Rhyme 0:95952f8fe2b4 249 readRegs(REG_PROXIMITY_RATE, &rate, 1) ;
Rhyme 0:95952f8fe2b4 250 rate &= 0x07 ;
Rhyme 0:95952f8fe2b4 251 return( rate ) ;
Rhyme 0:95952f8fe2b4 252 }
Rhyme 0:95952f8fe2b4 253
Rhyme 0:95952f8fe2b4 254 void VCNL4020::setProxRate(uint8_t rate)
Rhyme 0:95952f8fe2b4 255 {
Rhyme 0:95952f8fe2b4 256 uint8_t data[2] ;
Rhyme 0:95952f8fe2b4 257 data[0] = REG_PROXIMITY_RATE ;
Rhyme 0:95952f8fe2b4 258 data[1] = (rate & 0x07) ;
Rhyme 0:95952f8fe2b4 259 writeRegs(data, 2) ;
Rhyme 0:95952f8fe2b4 260 }
Rhyme 0:95952f8fe2b4 261
Rhyme 0:95952f8fe2b4 262 /* IR LED Current (0x83) Register #3 */
Rhyme 0:95952f8fe2b4 263 /* bit[7:6] Fuse prog ID Read only bits */
Rhyme 0:95952f8fe2b4 264 /* Information about fuse program revision used for initial setup/calibration of the device. */
Rhyme 0:95952f8fe2b4 265 /* bit[5:0] IR LED current value R/W bits. */
Rhyme 0:95952f8fe2b4 266 /* IR LED current = Value(dec.) x 10mA */
Rhyme 0:95952f8fe2b4 267 /* Valid Rage = 0 to 20d.
Rhyme 0:95952f8fe2b4 268 /* 0 = 0mA, 1 = 10mA, 2 = 20mA (DEFAULT) ... 20 = 200mA */
Rhyme 0:95952f8fe2b4 269 /* LED Current is limited to 200mA for values higher than 20d. */
Rhyme 0:95952f8fe2b4 270 uint8_t VCNL4020::getFuseProgID(void)
Rhyme 0:95952f8fe2b4 271 {
Rhyme 0:95952f8fe2b4 272 uint8_t data ;
Rhyme 0:95952f8fe2b4 273 readRegs(REG_IR_LED_CURRENT, &data, 1) ;
Rhyme 0:95952f8fe2b4 274 data = ((data >> 5) & 0x03) ;
Rhyme 0:95952f8fe2b4 275 return(data) ;
Rhyme 0:95952f8fe2b4 276 }
Rhyme 0:95952f8fe2b4 277
Rhyme 0:95952f8fe2b4 278 uint8_t VCNL4020::getIrLedCurrent(void)
Rhyme 0:95952f8fe2b4 279 {
Rhyme 0:95952f8fe2b4 280 uint8_t data ;
Rhyme 0:95952f8fe2b4 281 readRegs(REG_IR_LED_CURRENT, &data, 1) ;
Rhyme 0:95952f8fe2b4 282 data = data & 0x3F ;
Rhyme 0:95952f8fe2b4 283 return(data) ;
Rhyme 0:95952f8fe2b4 284 }
Rhyme 0:95952f8fe2b4 285
Rhyme 0:95952f8fe2b4 286 void VCNL4020::setIrLedCurrent(uint8_t value)
Rhyme 0:95952f8fe2b4 287 {
Rhyme 0:95952f8fe2b4 288 uint8_t data[2] ;
Rhyme 0:95952f8fe2b4 289 data[0] = REG_IR_LED_CURRENT ;
Rhyme 0:95952f8fe2b4 290 data[1] = value & 0x3F ;
Rhyme 0:95952f8fe2b4 291 writeRegs(data, 2) ;
Rhyme 0:95952f8fe2b4 292 }
Rhyme 0:95952f8fe2b4 293
Rhyme 0:95952f8fe2b4 294 /* Ambient Light Parameter (0x84) Register #4 */
Rhyme 0:95952f8fe2b4 295
Rhyme 0:95952f8fe2b4 296 /* bit[7] Cont.Conv.mode R/W bit. Continuous conversion mode. */
Rhyme 0:95952f8fe2b4 297 /* Enable = 1; Disable = 0 = DEFAULT */
Rhyme 0:95952f8fe2b4 298 /* This funcion can be used for performing faster ambient light measurements. */
Rhyme 0:95952f8fe2b4 299 /* This mode should only be used with ambient light on-demand measurements. */
Rhyme 0:95952f8fe2b4 300 /* Do not use with self-fimed mode. */
Rhyme 0:95952f8fe2b4 301 /* Please refer to the application information chapter 3.3 for details about this function */
Rhyme 0:95952f8fe2b4 302 #define BIT_CONT_CONV_MODE 0x80
Rhyme 0:95952f8fe2b4 303
Rhyme 0:95952f8fe2b4 304 /* bit[6:4] als_rate R/W bits. Ambient light measurement rate */
Rhyme 0:95952f8fe2b4 305 /* 000 - 1 samples/s */
Rhyme 0:95952f8fe2b4 306 /* 001 - 2 */
Rhyme 0:95952f8fe2b4 307 /* 010 - 3 */
Rhyme 0:95952f8fe2b4 308 /* 011 - 4 */
Rhyme 0:95952f8fe2b4 309 /* 100 - 5 */
Rhyme 0:95952f8fe2b4 310 /* 101 - 6 */
Rhyme 0:95952f8fe2b4 311 /* 110 - 8 */
Rhyme 0:95952f8fe2b4 312 /* 111 - 10 */
Rhyme 0:95952f8fe2b4 313
Rhyme 0:95952f8fe2b4 314 /* bit[3] Auto offset compensation R/W bit. Automatic offset compensation */
Rhyme 0:95952f8fe2b4 315 /* Enable = 1 = DEFAULT; Disable = 0 */
Rhyme 0:95952f8fe2b4 316 /* In order to compensate a technology, package or temperature realted drift
Rhyme 0:95952f8fe2b4 317 /* of the ambient light values there is a built in automatic offset compensation function */
Rhyme 0:95952f8fe2b4 318 /* With active auto offset compensation the offset value is measured before each
Rhyme 0:95952f8fe2b4 319 /* ambient light measurement and subtracted automatically from actual reading. */
Rhyme 0:95952f8fe2b4 320
Rhyme 0:95952f8fe2b4 321 /* bit[2:0] Averaging function (number of measurements per fun) */
Rhyme 0:95952f8fe2b4 322 /* R/W bits. Averating function */
Rhyme 0:95952f8fe2b4 323 /* Bit values sets the number of single conversions done during one measurement cycle. */
Rhyme 0:95952f8fe2b4 324 /* Result is the average value of all conversions */
Rhyme 0:95952f8fe2b4 325 /* Number of conversions = 2^decimal_value */
Rhyme 0:95952f8fe2b4 326 /* 0 = 1 conv, 1 = 2 conv, 2 = 4 conv, ... 5 = 32 conv (DEFAULT), ... 7 = 128 conv. */
Rhyme 0:95952f8fe2b4 327
Rhyme 0:95952f8fe2b4 328 /* Ambient Light Result 0x85, 0x86, Read only bits Register #5, #6 */
Rhyme 0:95952f8fe2b4 329 uint16_t VCNL4020::getAls(void)
Rhyme 0:95952f8fe2b4 330 {
Rhyme 0:95952f8fe2b4 331 uint16_t result ;
Rhyme 0:95952f8fe2b4 332 uint8_t data[2] ;
Rhyme 0:95952f8fe2b4 333 readRegs(REG_AMBIENT_LIGHT_RESULT, data, 2) ;
Rhyme 0:95952f8fe2b4 334 result = (data[0] << 8) | data[1] ;
Rhyme 0:95952f8fe2b4 335 return( result ) ;
Rhyme 0:95952f8fe2b4 336 }
Rhyme 0:95952f8fe2b4 337
Rhyme 0:95952f8fe2b4 338 /* Proxymity Measurement Result 0x87, 0x88 Register #7, #8 */
Rhyme 0:95952f8fe2b4 339 uint16_t VCNL4020::getProx(void)
Rhyme 0:95952f8fe2b4 340 {
Rhyme 0:95952f8fe2b4 341 uint16_t result ;
Rhyme 0:95952f8fe2b4 342 uint8_t data[2] ;
Rhyme 0:95952f8fe2b4 343 readRegs(REG_PROXIMITY_RESULT, data, 2) ;
Rhyme 0:95952f8fe2b4 344 result = (data[0] << 8) | data[1] ;
Rhyme 0:95952f8fe2b4 345 return( result ) ;
Rhyme 0:95952f8fe2b4 346 }
Rhyme 0:95952f8fe2b4 347
Rhyme 0:95952f8fe2b4 348 /* Interrupt Control 0x89, Register #9 */
Rhyme 0:95952f8fe2b4 349 /* bit[7:5] Int count exceed R/W bits */
Rhyme 0:95952f8fe2b4 350 /* These bits contains number of consecutive measurements needed above/below the threshold */
Rhyme 0:95952f8fe2b4 351 /* 000 - 1 count = DEFAULT */
Rhyme 0:95952f8fe2b4 352 /* 001 - 2 */
Rhyme 0:95952f8fe2b4 353 /* 010 - 4 */
Rhyme 0:95952f8fe2b4 354 /* 011 - 8 */
Rhyme 0:95952f8fe2b4 355 /* 100 - 16 */
Rhyme 0:95952f8fe2b4 356 /* 101 - 32 */
Rhyme 0:95952f8fe2b4 357 /* 110 - 64 */
Rhyme 0:95952f8fe2b4 358 /* 111 - 128 */
Rhyme 0:95952f8fe2b4 359 /* bit[4] (reserved) */
Rhyme 0:95952f8fe2b4 360 /* bit[3] INT_PROX_ready_EN R/W bit */
Rhyme 0:95952f8fe2b4 361 /* Enables interrupt generation at proximity data ready */
Rhyme 0:95952f8fe2b4 362
Rhyme 0:95952f8fe2b4 363 /* bit[2] INT_ALS_ready_EN R/W bit */
Rhyme 0:95952f8fe2b4 364 /* Enables interrupt generation at ambient data ready */
Rhyme 0:95952f8fe2b4 365
Rhyme 0:95952f8fe2b4 366 /* bit[1] INT_THRES_EN R/W bit */
Rhyme 0:95952f8fe2b4 367 /* Enables interrupt generation when high or low threshol is exceeded */
Rhyme 0:95952f8fe2b4 368
Rhyme 0:95952f8fe2b4 369 /* bit[0] INT_THRES_SEL R/W bit */
Rhyme 0:95952f8fe2b4 370 /* if 0: thresholds are applied to proximity measurements */
Rhyme 0:95952f8fe2b4 371 /* if 1: thresholds are applied to als measurements */
Rhyme 0:95952f8fe2b4 372 uint8_t VCNL4020::getIntControl(void)
Rhyme 0:95952f8fe2b4 373 {
Rhyme 0:95952f8fe2b4 374 uint8_t data ;
Rhyme 0:95952f8fe2b4 375 readRegs(REG_INTERRUPT_CONTROL, &data, 1) ;
Rhyme 0:95952f8fe2b4 376 return(data) ;
Rhyme 0:95952f8fe2b4 377 }
Rhyme 0:95952f8fe2b4 378
Rhyme 0:95952f8fe2b4 379 void VCNL4020::setIntControl(uint8_t ctrl)
Rhyme 0:95952f8fe2b4 380 {
Rhyme 0:95952f8fe2b4 381 uint8_t data[2] ;
Rhyme 0:95952f8fe2b4 382 data[0] = REG_INTERRUPT_CONTROL ;
Rhyme 0:95952f8fe2b4 383 data[1] = ctrl ;
Rhyme 0:95952f8fe2b4 384 writeRegs(data, 2) ;
Rhyme 0:95952f8fe2b4 385 }
Rhyme 0:95952f8fe2b4 386
Rhyme 0:95952f8fe2b4 387 /* Low Threshold 0x8A, 0x8B Register #10, #11 */
Rhyme 0:95952f8fe2b4 388
Rhyme 0:95952f8fe2b4 389 uint16_t VCNL4020::getLowThreshold(void)
Rhyme 0:95952f8fe2b4 390 {
Rhyme 0:95952f8fe2b4 391 uint32_t threshold ;
Rhyme 0:95952f8fe2b4 392 uint8_t data[2] ;
Rhyme 0:95952f8fe2b4 393 readRegs(REG_LOW_THRESHOLD_MSB, data, 2) ;
Rhyme 0:95952f8fe2b4 394 threshold = (data[0] << 8) | data[1] ;
Rhyme 0:95952f8fe2b4 395 return(threshold) ;
Rhyme 0:95952f8fe2b4 396 }
Rhyme 0:95952f8fe2b4 397
Rhyme 0:95952f8fe2b4 398 void VCNL4020::setLowThreshold(uint16_t threshold)
Rhyme 0:95952f8fe2b4 399 {
Rhyme 0:95952f8fe2b4 400 uint8_t data[5] ;
Rhyme 0:95952f8fe2b4 401 data[0] = REG_LOW_THRESHOLD_MSB ;
Rhyme 0:95952f8fe2b4 402 data[1] = (threshold >> 8) & 0xFF ;
Rhyme 0:95952f8fe2b4 403 data[2] = threshold & 0xFF ;
Rhyme 0:95952f8fe2b4 404 writeRegs(data, 3) ;
Rhyme 0:95952f8fe2b4 405 }
Rhyme 0:95952f8fe2b4 406
Rhyme 0:95952f8fe2b4 407 /* High Threshold 0x8C, 0x8D Register #12, #13 */
Rhyme 0:95952f8fe2b4 408 uint16_t VCNL4020::getHighThreshold(void)
Rhyme 0:95952f8fe2b4 409 {
Rhyme 0:95952f8fe2b4 410 uint32_t threshold ;
Rhyme 0:95952f8fe2b4 411 uint8_t data[2] ;
Rhyme 0:95952f8fe2b4 412 readRegs(REG_HIGH_THRESHOLD_MSB, data, 2) ;
Rhyme 0:95952f8fe2b4 413 threshold = (data[0] << 8) | data[1] ;
Rhyme 0:95952f8fe2b4 414 return(threshold) ;
Rhyme 0:95952f8fe2b4 415 }
Rhyme 0:95952f8fe2b4 416
Rhyme 0:95952f8fe2b4 417 void VCNL4020::setHighThreshold(uint16_t threshold)
Rhyme 0:95952f8fe2b4 418 {
Rhyme 0:95952f8fe2b4 419 uint8_t data[5] ;
Rhyme 0:95952f8fe2b4 420 data[0] = REG_HIGH_THRESHOLD_MSB ;
Rhyme 0:95952f8fe2b4 421 data[1] = (threshold >> 8) & 0xFF ;
Rhyme 0:95952f8fe2b4 422 data[2] = threshold & 0xFF ;
Rhyme 0:95952f8fe2b4 423 writeRegs(data, 3) ;
Rhyme 0:95952f8fe2b4 424 }
Rhyme 0:95952f8fe2b4 425
Rhyme 0:95952f8fe2b4 426
Rhyme 0:95952f8fe2b4 427 /* Interrupt Status 0x8E Register #14 */
Rhyme 0:95952f8fe2b4 428 /* bit[7:4] (reserved) */
Rhyme 0:95952f8fe2b4 429 /* bit[3] int_prox_ready */
Rhyme 0:95952f8fe2b4 430 /* bit[2] int_als_ready */
Rhyme 0:95952f8fe2b4 431 /* bit[1] int_th_low */
Rhyme 0:95952f8fe2b4 432 /* bit[0] int_th_hi */
Rhyme 0:95952f8fe2b4 433 uint8_t VCNL4020::getIntStatus(void)
Rhyme 0:95952f8fe2b4 434 {
Rhyme 0:95952f8fe2b4 435 uint8_t status ;
Rhyme 0:95952f8fe2b4 436 readRegs(REG_INTERRUPT_STATUS, &status, 1) ;
Rhyme 0:95952f8fe2b4 437 status &= 0x0F ;
Rhyme 0:95952f8fe2b4 438 return(status) ;
Rhyme 0:95952f8fe2b4 439 }
Rhyme 0:95952f8fe2b4 440
Rhyme 0:95952f8fe2b4 441 /* Proximity Modulator Timing Adjustment 0x8F Register #15 */
Rhyme 0:95952f8fe2b4 442 /* bit[7:5] Modulation delay time */
Rhyme 0:95952f8fe2b4 443 /* bit[4:3] Proximity frequency */
Rhyme 0:95952f8fe2b4 444 /* bit[2:0] Modulation dead time */
Rhyme 0:95952f8fe2b4 445 uint8_t VCNL4020::getProxModTiming(void)
Rhyme 0:95952f8fe2b4 446 {
Rhyme 0:95952f8fe2b4 447 uint8_t pmta ; /* Proximity Modulator Timing Adjustment */
Rhyme 0:95952f8fe2b4 448 readRegs(REG_PROXIMITY_MOD_TIMING, &pmta, 1) ;
Rhyme 0:95952f8fe2b4 449 return(pmta) ;
Rhyme 0:95952f8fe2b4 450 }
Rhyme 0:95952f8fe2b4 451
Rhyme 0:95952f8fe2b4 452 void VCNL4020::setProxModTiming(uint8_t pmta)
Rhyme 0:95952f8fe2b4 453 {
Rhyme 0:95952f8fe2b4 454 uint8_t data[2] ;
Rhyme 0:95952f8fe2b4 455 data[0] = REG_PROXIMITY_MOD_TIMING ;
Rhyme 0:95952f8fe2b4 456 data[1] = pmta ;
Rhyme 0:95952f8fe2b4 457 writeRegs(data, 2) ;
Rhyme 0:95952f8fe2b4 458 }
Rhyme 0:95952f8fe2b4 459
Rhyme 0:95952f8fe2b4 460 uint8_t VCNL4020::getRevID(void)
Rhyme 0:95952f8fe2b4 461 {
Rhyme 0:95952f8fe2b4 462 uint8_t rev_id ;
Rhyme 0:95952f8fe2b4 463 readRegs(REG_PRODUCT_ID_REV, &rev_id, 1) ;
Rhyme 0:95952f8fe2b4 464 rev_id = (rev_id & 0x0F) ;
Rhyme 0:95952f8fe2b4 465 return(rev_id) ;
Rhyme 0:95952f8fe2b4 466 }
Rhyme 0:95952f8fe2b4 467
Rhyme 0:95952f8fe2b4 468 VCNL4020::VCNL4020(PinName sda, PinName scl, int addr) :
Rhyme 0:95952f8fe2b4 469 m_i2c(sda, scl), m_addr(addr<<1)
Rhyme 0:95952f8fe2b4 470 {
Rhyme 0:95952f8fe2b4 471 // activate the peripheral
Rhyme 0:95952f8fe2b4 472 }
Rhyme 0:95952f8fe2b4 473
Rhyme 0:95952f8fe2b4 474
Rhyme 0:95952f8fe2b4 475 VCNL4020::~VCNL4020()
Rhyme 0:95952f8fe2b4 476 {
Rhyme 0:95952f8fe2b4 477 }
Rhyme 0:95952f8fe2b4 478
Rhyme 0:95952f8fe2b4 479 void VCNL4020::readRegs(int addr, uint8_t * data, int len) {
Rhyme 0:95952f8fe2b4 480 char t[1] = {addr};
Rhyme 0:95952f8fe2b4 481 m_i2c.write(m_addr, t, 1, true);
Rhyme 0:95952f8fe2b4 482 m_i2c.read(m_addr, (char *)data, len);
Rhyme 0:95952f8fe2b4 483 }
Rhyme 0:95952f8fe2b4 484
Rhyme 0:95952f8fe2b4 485 void VCNL4020::writeRegs(uint8_t * data, int len) {
Rhyme 0:95952f8fe2b4 486 m_i2c.write(m_addr, (char *)data, len);
Rhyme 0:95952f8fe2b4 487 }