Class module for ISL29011 Ambient Light Sensor
Dependents: mDotEVBM2X MTDOT-EVBDemo-DRH MTDOT-BOX-EVB-Factory-Firmware-LIB-108 MTDOT-UDKDemo_Senet ... more
ISL29011.h@5:953adca17438, 2018-01-31 (annotated)
- Committer:
- Evan Hosseini
- Date:
- Wed Jan 31 09:58:22 2018 -0600
- Revision:
- 5:953adca17438
- Parent:
- 0:b37e4acdfa7b
Make driver thread safe by making i2c read transactions atomic
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
falingtrea | 0:b37e4acdfa7b | 1 | /** |
falingtrea | 0:b37e4acdfa7b | 2 | * @file ISL29011.h |
falingtrea | 0:b37e4acdfa7b | 3 | * @brief Device driver - ISL29011 Ambient Light/IR Proximity Sensor |
falingtrea | 0:b37e4acdfa7b | 4 | * @author Tim Barr |
falingtrea | 0:b37e4acdfa7b | 5 | * @version 1.0 |
falingtrea | 0:b37e4acdfa7b | 6 | * @see http://www.intersil.com/content/dam/Intersil/documents/isl2/isl29011.pdf |
falingtrea | 0:b37e4acdfa7b | 7 | * |
falingtrea | 0:b37e4acdfa7b | 8 | * Copyright (c) 2015 |
falingtrea | 0:b37e4acdfa7b | 9 | * |
falingtrea | 0:b37e4acdfa7b | 10 | * Licensed under the Apache License, Version 2.0 (the "License"); |
falingtrea | 0:b37e4acdfa7b | 11 | * you may not use this file except in compliance with the License. |
falingtrea | 0:b37e4acdfa7b | 12 | * You may obtain a copy of the License at |
falingtrea | 0:b37e4acdfa7b | 13 | * |
falingtrea | 0:b37e4acdfa7b | 14 | * http://www.apache.org/licenses/LICENSE-2.0 |
falingtrea | 0:b37e4acdfa7b | 15 | * |
falingtrea | 0:b37e4acdfa7b | 16 | * Unless required by applicable law or agreed to in writing, software |
falingtrea | 0:b37e4acdfa7b | 17 | * distributed under the License is distributed on an "AS IS" BASIS, |
falingtrea | 0:b37e4acdfa7b | 18 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
falingtrea | 0:b37e4acdfa7b | 19 | * See the License for the specific language governing permissions and |
falingtrea | 0:b37e4acdfa7b | 20 | * limitations under the License. |
falingtrea | 0:b37e4acdfa7b | 21 | * |
falingtrea | 0:b37e4acdfa7b | 22 | */ |
falingtrea | 0:b37e4acdfa7b | 23 | |
falingtrea | 0:b37e4acdfa7b | 24 | #ifndef ISL29011_H |
falingtrea | 0:b37e4acdfa7b | 25 | #define ISL29011_H |
falingtrea | 0:b37e4acdfa7b | 26 | |
falingtrea | 0:b37e4acdfa7b | 27 | #include "mbed.h" |
falingtrea | 0:b37e4acdfa7b | 28 | |
falingtrea | 0:b37e4acdfa7b | 29 | /** Using the Multitech MTDOT-EVB |
falingtrea | 0:b37e4acdfa7b | 30 | * |
falingtrea | 0:b37e4acdfa7b | 31 | * Example: |
falingtrea | 0:b37e4acdfa7b | 32 | * @code |
falingtrea | 0:b37e4acdfa7b | 33 | * #include "mbed.h" |
falingtrea | 0:b37e4acdfa7b | 34 | * #include "ISL29011.h" |
falingtrea | 0:b37e4acdfa7b | 35 | * |
falingtrea | 0:b37e4acdfa7b | 36 | |
falingtrea | 0:b37e4acdfa7b | 37 | * |
falingtrea | 0:b37e4acdfa7b | 38 | * int main() |
falingtrea | 0:b37e4acdfa7b | 39 | * { |
falingtrea | 0:b37e4acdfa7b | 40 | |
falingtrea | 0:b37e4acdfa7b | 41 | * } |
falingtrea | 0:b37e4acdfa7b | 42 | * @endcode |
falingtrea | 0:b37e4acdfa7b | 43 | */ |
falingtrea | 0:b37e4acdfa7b | 44 | |
falingtrea | 0:b37e4acdfa7b | 45 | /** |
falingtrea | 0:b37e4acdfa7b | 46 | * @class ISL29011 |
falingtrea | 0:b37e4acdfa7b | 47 | * @brief API abstraction for the ISL29011 Ambient Light/Proximity IC |
falingtrea | 0:b37e4acdfa7b | 48 | * initial version will be polling only. Interrupt service and rtos support will |
falingtrea | 0:b37e4acdfa7b | 49 | * be added at a later point |
falingtrea | 0:b37e4acdfa7b | 50 | */ |
falingtrea | 0:b37e4acdfa7b | 51 | class ISL29011 |
falingtrea | 0:b37e4acdfa7b | 52 | { |
falingtrea | 0:b37e4acdfa7b | 53 | public: |
falingtrea | 0:b37e4acdfa7b | 54 | |
falingtrea | 0:b37e4acdfa7b | 55 | /** |
falingtrea | 0:b37e4acdfa7b | 56 | * @static INT_FLG |
falingtrea | 0:b37e4acdfa7b | 57 | * @brief Interrupt flag bit |
falingtrea | 0:b37e4acdfa7b | 58 | */ |
falingtrea | 0:b37e4acdfa7b | 59 | uint8_t static const INT_FLG = 0x04; |
falingtrea | 0:b37e4acdfa7b | 60 | |
falingtrea | 0:b37e4acdfa7b | 61 | /** |
falingtrea | 0:b37e4acdfa7b | 62 | * @static CT_16BIT |
falingtrea | 0:b37e4acdfa7b | 63 | * @brief Conversion time in usec for 16 bit setting |
falingtrea | 0:b37e4acdfa7b | 64 | */ |
falingtrea | 0:b37e4acdfa7b | 65 | uint32_t static const CT_16BIT = 90000; |
falingtrea | 0:b37e4acdfa7b | 66 | |
falingtrea | 0:b37e4acdfa7b | 67 | /** |
falingtrea | 0:b37e4acdfa7b | 68 | * @static CT_12BIT |
falingtrea | 0:b37e4acdfa7b | 69 | * @brief conversion time in usec for 12 bit setting |
falingtrea | 0:b37e4acdfa7b | 70 | */ |
falingtrea | 0:b37e4acdfa7b | 71 | uint32_t static const CT_12BIT = 5630; |
falingtrea | 0:b37e4acdfa7b | 72 | |
falingtrea | 0:b37e4acdfa7b | 73 | /** |
falingtrea | 0:b37e4acdfa7b | 74 | * @static CT_8BIT |
falingtrea | 0:b37e4acdfa7b | 75 | * @brief conversion time in usec for 8 bit setting |
falingtrea | 0:b37e4acdfa7b | 76 | */ |
falingtrea | 0:b37e4acdfa7b | 77 | uint32_t static const CT_8BIT = 351; |
falingtrea | 0:b37e4acdfa7b | 78 | |
falingtrea | 0:b37e4acdfa7b | 79 | /** |
falingtrea | 0:b37e4acdfa7b | 80 | * @static CT_4BIT |
falingtrea | 0:b37e4acdfa7b | 81 | * @brief conversion time in usec for 4 bit setting |
falingtrea | 0:b37e4acdfa7b | 82 | */ |
falingtrea | 0:b37e4acdfa7b | 83 | uint32_t static const CT_4BIT = 22; |
falingtrea | 0:b37e4acdfa7b | 84 | |
falingtrea | 0:b37e4acdfa7b | 85 | |
falingtrea | 0:b37e4acdfa7b | 86 | /** |
falingtrea | 0:b37e4acdfa7b | 87 | * @enum OP_MODE |
falingtrea | 0:b37e4acdfa7b | 88 | * @brief operating mode of ILS29011 |
falingtrea | 0:b37e4acdfa7b | 89 | */ |
falingtrea | 0:b37e4acdfa7b | 90 | enum OPERATION_MODE |
falingtrea | 0:b37e4acdfa7b | 91 | { |
falingtrea | 0:b37e4acdfa7b | 92 | PWR_DOWN = 0x00, |
falingtrea | 0:b37e4acdfa7b | 93 | ALS_ONCE = 0x20, |
falingtrea | 0:b37e4acdfa7b | 94 | IR_ONCE = 0x04, |
falingtrea | 0:b37e4acdfa7b | 95 | PROX_ONCE = 0xA0, |
falingtrea | 0:b37e4acdfa7b | 96 | ALS_CONT = 0xC0, |
falingtrea | 0:b37e4acdfa7b | 97 | IR_CONT = 0xE0, |
falingtrea | 0:b37e4acdfa7b | 98 | PROX_CONT |
falingtrea | 0:b37e4acdfa7b | 99 | }; |
falingtrea | 0:b37e4acdfa7b | 100 | |
falingtrea | 0:b37e4acdfa7b | 101 | /** |
falingtrea | 0:b37e4acdfa7b | 102 | * @enum INT_PERSIST |
falingtrea | 0:b37e4acdfa7b | 103 | * @brief Number of cycles measurement needs to be out of threshold to generate an interrupt |
falingtrea | 0:b37e4acdfa7b | 104 | */ |
falingtrea | 0:b37e4acdfa7b | 105 | enum INT_PERSIST |
falingtrea | 0:b37e4acdfa7b | 106 | { |
falingtrea | 0:b37e4acdfa7b | 107 | NUMCYCLE_1 = 0x00, |
falingtrea | 0:b37e4acdfa7b | 108 | NUMCYCLE_2, NUMCYCLE_4, NUMCYCYLE_8, NUMCYCLE_16 |
falingtrea | 0:b37e4acdfa7b | 109 | }; |
falingtrea | 0:b37e4acdfa7b | 110 | |
falingtrea | 0:b37e4acdfa7b | 111 | /** |
falingtrea | 0:b37e4acdfa7b | 112 | * @enum PROX_SCHEME |
falingtrea | 0:b37e4acdfa7b | 113 | * @brief Dynamic Range scheme for IR proximity |
falingtrea | 0:b37e4acdfa7b | 114 | */ |
falingtrea | 0:b37e4acdfa7b | 115 | enum PROX_SCHEME |
falingtrea | 0:b37e4acdfa7b | 116 | { |
falingtrea | 0:b37e4acdfa7b | 117 | PROX_FULL = 0x00, /* full n (4,8,12,16) bit data */ |
falingtrea | 0:b37e4acdfa7b | 118 | PROX_NR = 0x80 /* n-1 (3,7,11,15) bit data */ |
falingtrea | 0:b37e4acdfa7b | 119 | }; |
falingtrea | 0:b37e4acdfa7b | 120 | |
falingtrea | 0:b37e4acdfa7b | 121 | /** |
falingtrea | 0:b37e4acdfa7b | 122 | * @enum MOD_FREQ |
falingtrea | 0:b37e4acdfa7b | 123 | * @brief Modulation frequency of Proximity LED |
falingtrea | 0:b37e4acdfa7b | 124 | */ |
falingtrea | 0:b37e4acdfa7b | 125 | enum MOD_FREQ |
falingtrea | 0:b37e4acdfa7b | 126 | { |
falingtrea | 0:b37e4acdfa7b | 127 | FREQ_DC = 0x00, /* No modulation of LED */ |
falingtrea | 0:b37e4acdfa7b | 128 | FREQ_360k = 0x40 /* Proximity LED modulated at 360 kHz */ |
falingtrea | 0:b37e4acdfa7b | 129 | }; |
falingtrea | 0:b37e4acdfa7b | 130 | |
falingtrea | 0:b37e4acdfa7b | 131 | /** |
falingtrea | 0:b37e4acdfa7b | 132 | * @enum LED_DRIVE |
falingtrea | 0:b37e4acdfa7b | 133 | * @brief Sets the drive current of the IR Proximity LED |
falingtrea | 0:b37e4acdfa7b | 134 | */ |
falingtrea | 0:b37e4acdfa7b | 135 | enum LED_DRIVE |
falingtrea | 0:b37e4acdfa7b | 136 | { |
falingtrea | 0:b37e4acdfa7b | 137 | LED_12_5 = 0x00, /* 12.5 mA current drive */ |
falingtrea | 0:b37e4acdfa7b | 138 | LED_25 = 0x10, /* 25 mA current drive */ |
falingtrea | 0:b37e4acdfa7b | 139 | LED_50 = 0x20, /* 50 mA current drive */ |
falingtrea | 0:b37e4acdfa7b | 140 | LED_100 = 0x30 /* 100 mA current driver */ |
falingtrea | 0:b37e4acdfa7b | 141 | }; |
falingtrea | 0:b37e4acdfa7b | 142 | |
falingtrea | 0:b37e4acdfa7b | 143 | /** |
falingtrea | 0:b37e4acdfa7b | 144 | * @enum ADC_RESOLUTION |
falingtrea | 0:b37e4acdfa7b | 145 | * @brief Measurement resolution for ADC |
falingtrea | 0:b37e4acdfa7b | 146 | */ |
falingtrea | 0:b37e4acdfa7b | 147 | enum ADC_RESOLUTION |
falingtrea | 0:b37e4acdfa7b | 148 | { |
falingtrea | 0:b37e4acdfa7b | 149 | ADC_16BIT = 0x00, |
falingtrea | 0:b37e4acdfa7b | 150 | ADC_12BIT = 0x04, |
falingtrea | 0:b37e4acdfa7b | 151 | ADC_8BIT = 0x08, |
falingtrea | 0:b37e4acdfa7b | 152 | ADC_4BIT = 0x0B |
falingtrea | 0:b37e4acdfa7b | 153 | }; |
falingtrea | 0:b37e4acdfa7b | 154 | |
falingtrea | 0:b37e4acdfa7b | 155 | /** |
falingtrea | 0:b37e4acdfa7b | 156 | * @enum LUX_RANGE |
falingtrea | 0:b37e4acdfa7b | 157 | * @brief Setting for LUX Range of ADC |
falingtrea | 0:b37e4acdfa7b | 158 | */ |
falingtrea | 0:b37e4acdfa7b | 159 | enum LUX_RANGE |
falingtrea | 0:b37e4acdfa7b | 160 | { |
falingtrea | 0:b37e4acdfa7b | 161 | RNG_1000 = 0x00, /* Full scale 1,000 LUX */ |
falingtrea | 0:b37e4acdfa7b | 162 | RNG_4000, /* Full scale 4,000 LUX */ |
falingtrea | 0:b37e4acdfa7b | 163 | RNG_16000, /* Full scale 16,000 LUX */ |
falingtrea | 0:b37e4acdfa7b | 164 | RNG_64000 /* Full scale 64,000 LUX */ |
falingtrea | 0:b37e4acdfa7b | 165 | }; |
falingtrea | 0:b37e4acdfa7b | 166 | |
falingtrea | 0:b37e4acdfa7b | 167 | /** |
falingtrea | 0:b37e4acdfa7b | 168 | * @enum REGISTER |
falingtrea | 0:b37e4acdfa7b | 169 | * @brief The device register map |
falingtrea | 0:b37e4acdfa7b | 170 | */ |
falingtrea | 0:b37e4acdfa7b | 171 | enum REGISTER |
falingtrea | 0:b37e4acdfa7b | 172 | { |
falingtrea | 0:b37e4acdfa7b | 173 | COMMAND1 = 0x00, |
falingtrea | 0:b37e4acdfa7b | 174 | COMMAND2, DATA_LSB, DATA_MSB, INT_LT_LSB, INT_LT_MSB, INT_HT_LSB, INT_HT_MSB |
falingtrea | 0:b37e4acdfa7b | 175 | }; |
falingtrea | 0:b37e4acdfa7b | 176 | |
falingtrea | 0:b37e4acdfa7b | 177 | /** Create the ISL29011 object |
falingtrea | 0:b37e4acdfa7b | 178 | * @param i2c - A defined I2C object |
falingtrea | 0:b37e4acdfa7b | 179 | * @param InterruptIn* - pointer to a defined InterruptIn object. Default to NULL if polled |
falingtrea | 0:b37e4acdfa7b | 180 | */ |
falingtrea | 0:b37e4acdfa7b | 181 | ISL29011(I2C &i2c, InterruptIn* isl_int = NULL); |
falingtrea | 0:b37e4acdfa7b | 182 | |
falingtrea | 0:b37e4acdfa7b | 183 | /** Get the data |
falingtrea | 0:b37e4acdfa7b | 184 | * @return The last valid LUX reading from the ambient light sensor |
falingtrea | 0:b37e4acdfa7b | 185 | */ |
falingtrea | 0:b37e4acdfa7b | 186 | uint16_t getData(void); |
falingtrea | 0:b37e4acdfa7b | 187 | |
falingtrea | 0:b37e4acdfa7b | 188 | /** Setup the ISL29011 measurement mode |
falingtrea | 0:b37e4acdfa7b | 189 | * @op_mode - Operating moe of sensor using the OPERATION_MODE enum |
falingtrea | 0:b37e4acdfa7b | 190 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 191 | */ |
falingtrea | 0:b37e4acdfa7b | 192 | uint8_t setMode(OPERATION_MODE op_mode) const; |
falingtrea | 0:b37e4acdfa7b | 193 | |
falingtrea | 0:b37e4acdfa7b | 194 | /** Set Interrupt Threshold persistence |
falingtrea | 0:b37e4acdfa7b | 195 | * @int_persist - Sets the Interrupt Persistence Threshold using the INT_PERSIST enum |
falingtrea | 0:b37e4acdfa7b | 196 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 197 | * TODO - Still need to add interrupt support code |
falingtrea | 0:b37e4acdfa7b | 198 | */ |
falingtrea | 0:b37e4acdfa7b | 199 | uint8_t setPersistence(INT_PERSIST int_persist) const; |
falingtrea | 0:b37e4acdfa7b | 200 | |
falingtrea | 0:b37e4acdfa7b | 201 | /** Set Proximity measurement parameters |
falingtrea | 0:b37e4acdfa7b | 202 | * @prox_scheme - Sets the Proximity measurement scheme using the PROX_SCHEME enum |
falingtrea | 0:b37e4acdfa7b | 203 | * @mod_freq - Sets the Moduletion Frequency using the MOD_FREQ enum |
falingtrea | 0:b37e4acdfa7b | 204 | * @led_drive - Sets the LED Drive current for Proximity mode using the LED_DRIVE enum |
falingtrea | 0:b37e4acdfa7b | 205 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 206 | * NOTE: function added for completeness. MTDOT-EVB does not have IR LED installed at this time |
falingtrea | 0:b37e4acdfa7b | 207 | */ |
falingtrea | 0:b37e4acdfa7b | 208 | uint8_t setProximity(PROX_SCHEME prox_scheme, MOD_FREQ mod_freq, LED_DRIVE led_drive) const; |
falingtrea | 0:b37e4acdfa7b | 209 | |
falingtrea | 0:b37e4acdfa7b | 210 | /** Set ADC Resolution |
falingtrea | 0:b37e4acdfa7b | 211 | * @adc_resolution - Sets the ADC resolution using the ADC_RESOLUTION enum |
falingtrea | 0:b37e4acdfa7b | 212 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 213 | */ |
falingtrea | 0:b37e4acdfa7b | 214 | uint8_t setResolution(ADC_RESOLUTION adc_resolution) const; |
falingtrea | 0:b37e4acdfa7b | 215 | |
falingtrea | 0:b37e4acdfa7b | 216 | /** Set the LUX Full Scale measurement range |
falingtrea | 0:b37e4acdfa7b | 217 | * @lux_range - Sets the maximum measured Lux value usngthe LUX_RANGE enum |
falingtrea | 0:b37e4acdfa7b | 218 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 219 | */ |
falingtrea | 0:b37e4acdfa7b | 220 | uint8_t setRange(LUX_RANGE lux_range ) const; |
falingtrea | 0:b37e4acdfa7b | 221 | |
falingtrea | 0:b37e4acdfa7b | 222 | private: |
falingtrea | 0:b37e4acdfa7b | 223 | |
falingtrea | 0:b37e4acdfa7b | 224 | I2C *_i2c; |
falingtrea | 0:b37e4acdfa7b | 225 | InterruptIn *_isl_int; |
falingtrea | 0:b37e4acdfa7b | 226 | bool _polling_mode; |
falingtrea | 0:b37e4acdfa7b | 227 | uint8_t static const _i2c_addr = (0x44 << 1); |
falingtrea | 0:b37e4acdfa7b | 228 | uint16_t _lux_data; |
falingtrea | 0:b37e4acdfa7b | 229 | |
falingtrea | 0:b37e4acdfa7b | 230 | /* Initialize the ISL29011 device |
falingtrea | 0:b37e4acdfa7b | 231 | */ |
falingtrea | 0:b37e4acdfa7b | 232 | uint8_t init(void); |
falingtrea | 0:b37e4acdfa7b | 233 | |
falingtrea | 0:b37e4acdfa7b | 234 | /* |
falingtrea | 0:b37e4acdfa7b | 235 | * Write to a register (exposed for debugging reasons) |
falingtrea | 0:b37e4acdfa7b | 236 | * Note: most writes are only valid in stop mode |
falingtrea | 0:b37e4acdfa7b | 237 | * @param reg - The register to be written |
falingtrea | 0:b37e4acdfa7b | 238 | * @param data - The data to be written |
falingtrea | 0:b37e4acdfa7b | 239 | */ |
falingtrea | 0:b37e4acdfa7b | 240 | uint8_t writeRegister(uint8_t const reg, uint8_t const data) const; |
falingtrea | 0:b37e4acdfa7b | 241 | |
falingtrea | 0:b37e4acdfa7b | 242 | /* |
falingtrea | 0:b37e4acdfa7b | 243 | * Read from a register (exposed for debugging reasons) |
falingtrea | 0:b37e4acdfa7b | 244 | * @param reg - The register to read from |
falingtrea | 0:b37e4acdfa7b | 245 | * @return The register contents |
falingtrea | 0:b37e4acdfa7b | 246 | */ |
falingtrea | 0:b37e4acdfa7b | 247 | uint8_t readRegister(uint8_t const reg, char* data, uint8_t count = 1) const; |
falingtrea | 0:b37e4acdfa7b | 248 | |
falingtrea | 0:b37e4acdfa7b | 249 | }; |
falingtrea | 0:b37e4acdfa7b | 250 | |
falingtrea | 0:b37e4acdfa7b | 251 | #endif |