Class module for ISL29011 Ambient Light Sensor
Dependents: mDotEVBM2X MTDOT-EVBDemo-DRH MTDOT-BOX-EVB-Factory-Firmware-LIB-108 MTDOT-UDKDemo_Senet ... more
ISL29011.cpp@5:953adca17438, 2018-01-31 (annotated)
- Committer:
- Evan Hosseini
- Date:
- Wed Jan 31 09:58:22 2018 -0600
- Revision:
- 5:953adca17438
- Parent:
- 4:c1d5f4999b9e
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.cpp |
falingtrea | 0:b37e4acdfa7b | 3 | * @brief Device driver - ISL29011 Ambient Light/IR Proximity Sensor IC |
falingtrea | 0:b37e4acdfa7b | 4 | * @author Tim Barr |
falingtrea | 1:f5b5a0477f46 | 5 | * @version 1.01 |
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 | 1:f5b5a0477f46 | 21 | * |
falingtrea | 1:f5b5a0477f46 | 22 | * 1.01 TAB 7/6/15 Removed "= NULL" reference from object call. Only needs to be in .h file |
falingtrea | 0:b37e4acdfa7b | 23 | */ |
mfiore | 2:71053376b55a | 24 | |
falingtrea | 0:b37e4acdfa7b | 25 | #include "ISL29011.h" |
falingtrea | 0:b37e4acdfa7b | 26 | #include "mbed_debug.h" |
mfiore | 2:71053376b55a | 27 | |
falingtrea | 1:f5b5a0477f46 | 28 | ISL29011::ISL29011(I2C &i2c, InterruptIn* isl_int) |
falingtrea | 0:b37e4acdfa7b | 29 | { |
falingtrea | 0:b37e4acdfa7b | 30 | _i2c = &i2c; |
falingtrea | 0:b37e4acdfa7b | 31 | _isl_int = isl_int; |
falingtrea | 0:b37e4acdfa7b | 32 | |
falingtrea | 0:b37e4acdfa7b | 33 | ISL29011::init(); |
mfiore | 2:71053376b55a | 34 | |
falingtrea | 0:b37e4acdfa7b | 35 | return; |
falingtrea | 0:b37e4acdfa7b | 36 | } |
falingtrea | 0:b37e4acdfa7b | 37 | |
falingtrea | 0:b37e4acdfa7b | 38 | uint8_t ISL29011::init(void) |
falingtrea | 0:b37e4acdfa7b | 39 | { |
falingtrea | 0:b37e4acdfa7b | 40 | uint8_t result = 0; |
mfiore | 2:71053376b55a | 41 | |
falingtrea | 0:b37e4acdfa7b | 42 | // Reset all registers to POR values |
falingtrea | 0:b37e4acdfa7b | 43 | result = ISL29011::writeRegister(COMMAND1, 0x00); |
falingtrea | 0:b37e4acdfa7b | 44 | |
mfiore | 2:71053376b55a | 45 | if (result == 0) { |
mfiore | 2:71053376b55a | 46 | if (_isl_int == NULL) |
mfiore | 2:71053376b55a | 47 | _polling_mode = true; |
falingtrea | 0:b37e4acdfa7b | 48 | else _polling_mode = false; |
falingtrea | 0:b37e4acdfa7b | 49 | |
mfiore | 2:71053376b55a | 50 | result = ISL29011::writeRegister(COMMAND2, 0x00); |
mfiore | 2:71053376b55a | 51 | result = ISL29011::writeRegister(INT_LT_LSB, 0x00); |
mfiore | 2:71053376b55a | 52 | result = ISL29011::writeRegister(INT_LT_MSB, 0x00); |
mfiore | 2:71053376b55a | 53 | result = ISL29011::writeRegister(INT_HT_LSB, 0xFF); |
mfiore | 2:71053376b55a | 54 | result = ISL29011::writeRegister(INT_HT_MSB, 0xFF); |
falingtrea | 0:b37e4acdfa7b | 55 | } |
falingtrea | 0:b37e4acdfa7b | 56 | |
Evan Hosseini |
5:953adca17438 | 57 | if (result != 0) { |
falingtrea | 0:b37e4acdfa7b | 58 | debug("ILS29011:init failed\n\r"); |
falingtrea | 0:b37e4acdfa7b | 59 | } |
falingtrea | 0:b37e4acdfa7b | 60 | |
mfiore | 2:71053376b55a | 61 | return result; |
falingtrea | 0:b37e4acdfa7b | 62 | } |
falingtrea | 0:b37e4acdfa7b | 63 | |
falingtrea | 0:b37e4acdfa7b | 64 | /** Get the data |
falingtrea | 0:b37e4acdfa7b | 65 | * @return The last valid LUX reading from the ambient light sensor |
falingtrea | 0:b37e4acdfa7b | 66 | */ |
falingtrea | 0:b37e4acdfa7b | 67 | uint16_t ISL29011::getData(void) |
falingtrea | 0:b37e4acdfa7b | 68 | { |
mfiore | 2:71053376b55a | 69 | if (_polling_mode) { |
mfiore | 2:71053376b55a | 70 | char datain[2]; |
falingtrea | 0:b37e4acdfa7b | 71 | |
mfiore | 2:71053376b55a | 72 | ISL29011::readRegister(DATA_LSB, datain, 2); |
mfiore | 2:71053376b55a | 73 | _lux_data = (datain[1] << 8) | datain[0]; |
mfiore | 2:71053376b55a | 74 | } |
mfiore | 2:71053376b55a | 75 | return _lux_data; |
falingtrea | 0:b37e4acdfa7b | 76 | } |
falingtrea | 0:b37e4acdfa7b | 77 | |
falingtrea | 0:b37e4acdfa7b | 78 | /** Setup the ISL29011 measurement mode |
falingtrea | 0:b37e4acdfa7b | 79 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 80 | */ |
falingtrea | 0:b37e4acdfa7b | 81 | uint8_t ISL29011::setMode(OPERATION_MODE op_mode) const |
falingtrea | 0:b37e4acdfa7b | 82 | { |
mfiore | 2:71053376b55a | 83 | uint8_t result = 0; |
mfiore | 2:71053376b55a | 84 | char datain[1]; |
mfiore | 2:71053376b55a | 85 | char dataout; |
falingtrea | 0:b37e4acdfa7b | 86 | |
falingtrea | 0:b37e4acdfa7b | 87 | |
falingtrea | 0:b37e4acdfa7b | 88 | result |= ISL29011::readRegister(COMMAND1,datain); |
falingtrea | 0:b37e4acdfa7b | 89 | dataout = (datain[0] & 0x1F) | op_mode; |
falingtrea | 0:b37e4acdfa7b | 90 | result |= ISL29011::writeRegister(COMMAND1, dataout); |
falingtrea | 0:b37e4acdfa7b | 91 | return result; |
falingtrea | 0:b37e4acdfa7b | 92 | |
falingtrea | 0:b37e4acdfa7b | 93 | } |
falingtrea | 0:b37e4acdfa7b | 94 | |
falingtrea | 0:b37e4acdfa7b | 95 | /** Set Interrupt Persistence Threshold |
falingtrea | 0:b37e4acdfa7b | 96 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 97 | */ |
falingtrea | 0:b37e4acdfa7b | 98 | uint8_t ISL29011::setPersistence(INT_PERSIST int_persist) const |
falingtrea | 0:b37e4acdfa7b | 99 | { |
mfiore | 2:71053376b55a | 100 | uint8_t result = 0; |
mfiore | 2:71053376b55a | 101 | char datain[1]; |
mfiore | 2:71053376b55a | 102 | char dataout; |
falingtrea | 0:b37e4acdfa7b | 103 | |
falingtrea | 0:b37e4acdfa7b | 104 | result |= ISL29011::readRegister(COMMAND1,datain); |
falingtrea | 0:b37e4acdfa7b | 105 | dataout = (datain[0] & 0xFC) | int_persist; |
falingtrea | 0:b37e4acdfa7b | 106 | result |= ISL29011::writeRegister(COMMAND1, dataout); |
falingtrea | 0:b37e4acdfa7b | 107 | |
mfiore | 2:71053376b55a | 108 | return result; |
falingtrea | 0:b37e4acdfa7b | 109 | } |
falingtrea | 0:b37e4acdfa7b | 110 | |
falingtrea | 0:b37e4acdfa7b | 111 | /** Set Proximity measurement parameters |
falingtrea | 0:b37e4acdfa7b | 112 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 113 | */ |
falingtrea | 0:b37e4acdfa7b | 114 | uint8_t ISL29011::setProximity(PROX_SCHEME prox_scheme, MOD_FREQ mod_freq, LED_DRIVE led_drive) const |
falingtrea | 0:b37e4acdfa7b | 115 | { |
mfiore | 2:71053376b55a | 116 | uint8_t result = 0; |
mfiore | 2:71053376b55a | 117 | char datain[1]; |
mfiore | 2:71053376b55a | 118 | char dataout; |
falingtrea | 0:b37e4acdfa7b | 119 | |
falingtrea | 0:b37e4acdfa7b | 120 | result |= ISL29011::readRegister(COMMAND2,datain); |
falingtrea | 0:b37e4acdfa7b | 121 | dataout = (datain[0] & 0x0F) | prox_scheme | mod_freq | led_drive; |
falingtrea | 0:b37e4acdfa7b | 122 | result |= ISL29011::writeRegister(COMMAND2, dataout); |
falingtrea | 0:b37e4acdfa7b | 123 | |
mfiore | 2:71053376b55a | 124 | return result; |
falingtrea | 0:b37e4acdfa7b | 125 | } |
falingtrea | 0:b37e4acdfa7b | 126 | |
falingtrea | 0:b37e4acdfa7b | 127 | /** Set ADC Resolution |
falingtrea | 0:b37e4acdfa7b | 128 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 129 | */ |
falingtrea | 0:b37e4acdfa7b | 130 | uint8_t ISL29011::setResolution(ADC_RESOLUTION adc_resolution) const |
falingtrea | 0:b37e4acdfa7b | 131 | { |
mfiore | 2:71053376b55a | 132 | uint8_t result = 0; |
mfiore | 2:71053376b55a | 133 | char datain[1]; |
mfiore | 2:71053376b55a | 134 | char dataout; |
falingtrea | 0:b37e4acdfa7b | 135 | |
falingtrea | 0:b37e4acdfa7b | 136 | result |= ISL29011::readRegister(COMMAND2,datain); |
falingtrea | 0:b37e4acdfa7b | 137 | dataout = (datain[0] & 0xF3) | adc_resolution; |
falingtrea | 0:b37e4acdfa7b | 138 | result |= ISL29011::writeRegister(COMMAND2, dataout); |
falingtrea | 0:b37e4acdfa7b | 139 | |
mfiore | 2:71053376b55a | 140 | return result; |
falingtrea | 0:b37e4acdfa7b | 141 | } |
falingtrea | 0:b37e4acdfa7b | 142 | |
falingtrea | 0:b37e4acdfa7b | 143 | /** Set the LUX Full Scale measurement range |
falingtrea | 0:b37e4acdfa7b | 144 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 145 | */ |
falingtrea | 0:b37e4acdfa7b | 146 | uint8_t ISL29011::setRange(LUX_RANGE lux_range ) const |
falingtrea | 0:b37e4acdfa7b | 147 | { |
mfiore | 2:71053376b55a | 148 | uint8_t result = 0; |
mfiore | 2:71053376b55a | 149 | char datain[1]; |
mfiore | 2:71053376b55a | 150 | char dataout; |
falingtrea | 0:b37e4acdfa7b | 151 | |
falingtrea | 0:b37e4acdfa7b | 152 | result |= ISL29011::readRegister(COMMAND2,datain); |
falingtrea | 0:b37e4acdfa7b | 153 | dataout = (datain[0] & 0xFC) | lux_range; |
falingtrea | 0:b37e4acdfa7b | 154 | result |= ISL29011::writeRegister(COMMAND2, dataout); |
falingtrea | 0:b37e4acdfa7b | 155 | |
mfiore | 2:71053376b55a | 156 | return result; |
falingtrea | 0:b37e4acdfa7b | 157 | } |
falingtrea | 0:b37e4acdfa7b | 158 | |
falingtrea | 0:b37e4acdfa7b | 159 | |
falingtrea | 0:b37e4acdfa7b | 160 | uint8_t ISL29011::writeRegister(uint8_t const reg, uint8_t const data) const |
falingtrea | 0:b37e4acdfa7b | 161 | { |
falingtrea | 0:b37e4acdfa7b | 162 | char buf[2] = {reg, data}; |
falingtrea | 0:b37e4acdfa7b | 163 | uint8_t result = 0; |
falingtrea | 0:b37e4acdfa7b | 164 | |
falingtrea | 0:b37e4acdfa7b | 165 | buf[0] = reg; |
falingtrea | 0:b37e4acdfa7b | 166 | buf[1] = data; |
mfiore | 2:71053376b55a | 167 | |
falingtrea | 0:b37e4acdfa7b | 168 | result |= _i2c->write(_i2c_addr, buf, 2); |
mfiore | 2:71053376b55a | 169 | |
Evan Hosseini |
5:953adca17438 | 170 | if (result != 0) { |
Evan Hosseini |
5:953adca17438 | 171 | debug("ISL29011::writeRegister failed\n\r"); |
falingtrea | 0:b37e4acdfa7b | 172 | } |
mfiore | 2:71053376b55a | 173 | |
falingtrea | 0:b37e4acdfa7b | 174 | return result; |
falingtrea | 0:b37e4acdfa7b | 175 | } |
falingtrea | 0:b37e4acdfa7b | 176 | |
falingtrea | 0:b37e4acdfa7b | 177 | uint8_t ISL29011::readRegister(uint8_t const reg, char* data, uint8_t count) const |
falingtrea | 0:b37e4acdfa7b | 178 | { |
falingtrea | 0:b37e4acdfa7b | 179 | uint8_t result = 0; |
falingtrea | 0:b37e4acdfa7b | 180 | char reg_out[1]; |
mfiore | 2:71053376b55a | 181 | |
falingtrea | 0:b37e4acdfa7b | 182 | reg_out[0] = reg; |
Evan Hosseini |
5:953adca17438 | 183 | _i2c->lock(); |
mfiore | 2:71053376b55a | 184 | result |= _i2c->write(_i2c_addr,reg_out,1,true); |
falingtrea | 0:b37e4acdfa7b | 185 | |
Evan Hosseini |
5:953adca17438 | 186 | if (result != 0) { |
falingtrea | 0:b37e4acdfa7b | 187 | debug("ISL29011::readRegister failed write\n\r"); |
Evan Hosseini |
5:953adca17438 | 188 | goto exit; |
falingtrea | 0:b37e4acdfa7b | 189 | } |
mfiore | 2:71053376b55a | 190 | |
mfiore | 2:71053376b55a | 191 | result |= _i2c->read(_i2c_addr,data,count,false); |
mfiore | 2:71053376b55a | 192 | |
Evan Hosseini |
5:953adca17438 | 193 | if (result != 0) { |
falingtrea | 0:b37e4acdfa7b | 194 | debug("ISL29011::readRegister failed read\n\r"); |
falingtrea | 0:b37e4acdfa7b | 195 | } |
mfiore | 2:71053376b55a | 196 | |
Evan Hosseini |
5:953adca17438 | 197 | exit: |
Evan Hosseini |
5:953adca17438 | 198 | _i2c->unlock(); |
falingtrea | 0:b37e4acdfa7b | 199 | return result; |
falingtrea | 0:b37e4acdfa7b | 200 | } |