VCNL4020, Fully Integrated Proximity and Ambient Light Sensor with Infrared Emitter, I2C Interface, and Interrupt Function
Dependents: testVCNL4020 testSensor
VCNL4020.cpp@1:4f4cdaf51fc2, 2017-04-29 (annotated)
- Committer:
- Rhyme
- Date:
- Sat Apr 29 07:09:26 2017 +0000
- Revision:
- 1:4f4cdaf51fc2
- Parent:
- 0:95952f8fe2b4
Some bad comment formats fixed
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:4f4cdaf51fc2 | 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 | 1:4f4cdaf51fc2 | 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 | 1:4f4cdaf51fc2 | 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 | } |