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@2:71053376b55a, 2015-10-28 (annotated)
- Committer:
- mfiore
- Date:
- Wed Oct 28 17:50:21 2015 +0000
- Revision:
- 2:71053376b55a
- Parent:
- 1:f5b5a0477f46
- Child:
- 3:f46f74107f9e
<CTRL><SHIFT><f> for formatting
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 | _i2c->frequency(400000); |
mfiore | 2:71053376b55a | 43 | |
falingtrea | 0:b37e4acdfa7b | 44 | // Reset all registers to POR values |
falingtrea | 0:b37e4acdfa7b | 45 | result = ISL29011::writeRegister(COMMAND1, 0x00); |
falingtrea | 0:b37e4acdfa7b | 46 | |
mfiore | 2:71053376b55a | 47 | if (result == 0) { |
mfiore | 2:71053376b55a | 48 | if (_isl_int == NULL) |
mfiore | 2:71053376b55a | 49 | _polling_mode = true; |
falingtrea | 0:b37e4acdfa7b | 50 | else _polling_mode = false; |
falingtrea | 0:b37e4acdfa7b | 51 | |
mfiore | 2:71053376b55a | 52 | result = ISL29011::writeRegister(COMMAND2, 0x00); |
mfiore | 2:71053376b55a | 53 | result = ISL29011::writeRegister(INT_LT_LSB, 0x00); |
mfiore | 2:71053376b55a | 54 | result = ISL29011::writeRegister(INT_LT_MSB, 0x00); |
mfiore | 2:71053376b55a | 55 | result = ISL29011::writeRegister(INT_HT_LSB, 0xFF); |
mfiore | 2:71053376b55a | 56 | result = ISL29011::writeRegister(INT_HT_MSB, 0xFF); |
falingtrea | 0:b37e4acdfa7b | 57 | } |
falingtrea | 0:b37e4acdfa7b | 58 | |
mfiore | 2:71053376b55a | 59 | if(result != 0) { |
falingtrea | 0:b37e4acdfa7b | 60 | debug("ILS29011:init failed\n\r"); |
falingtrea | 0:b37e4acdfa7b | 61 | } |
falingtrea | 0:b37e4acdfa7b | 62 | |
mfiore | 2:71053376b55a | 63 | return result; |
falingtrea | 0:b37e4acdfa7b | 64 | } |
falingtrea | 0:b37e4acdfa7b | 65 | |
falingtrea | 0:b37e4acdfa7b | 66 | /** Get the data |
falingtrea | 0:b37e4acdfa7b | 67 | * @return The last valid LUX reading from the ambient light sensor |
falingtrea | 0:b37e4acdfa7b | 68 | */ |
falingtrea | 0:b37e4acdfa7b | 69 | uint16_t ISL29011::getData(void) |
falingtrea | 0:b37e4acdfa7b | 70 | { |
mfiore | 2:71053376b55a | 71 | if (_polling_mode) { |
mfiore | 2:71053376b55a | 72 | char datain[2]; |
falingtrea | 0:b37e4acdfa7b | 73 | |
mfiore | 2:71053376b55a | 74 | ISL29011::readRegister(DATA_LSB, datain, 2); |
mfiore | 2:71053376b55a | 75 | _lux_data = (datain[1] << 8) | datain[0]; |
mfiore | 2:71053376b55a | 76 | } |
mfiore | 2:71053376b55a | 77 | return _lux_data; |
falingtrea | 0:b37e4acdfa7b | 78 | } |
falingtrea | 0:b37e4acdfa7b | 79 | |
falingtrea | 0:b37e4acdfa7b | 80 | /** Setup the ISL29011 measurement mode |
falingtrea | 0:b37e4acdfa7b | 81 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 82 | */ |
falingtrea | 0:b37e4acdfa7b | 83 | uint8_t ISL29011::setMode(OPERATION_MODE op_mode) const |
falingtrea | 0:b37e4acdfa7b | 84 | { |
mfiore | 2:71053376b55a | 85 | uint8_t result = 0; |
mfiore | 2:71053376b55a | 86 | char datain[1]; |
mfiore | 2:71053376b55a | 87 | char dataout; |
falingtrea | 0:b37e4acdfa7b | 88 | |
falingtrea | 0:b37e4acdfa7b | 89 | |
falingtrea | 0:b37e4acdfa7b | 90 | result |= ISL29011::readRegister(COMMAND1,datain); |
falingtrea | 0:b37e4acdfa7b | 91 | dataout = (datain[0] & 0x1F) | op_mode; |
falingtrea | 0:b37e4acdfa7b | 92 | result |= ISL29011::writeRegister(COMMAND1, dataout); |
falingtrea | 0:b37e4acdfa7b | 93 | return result; |
falingtrea | 0:b37e4acdfa7b | 94 | |
falingtrea | 0:b37e4acdfa7b | 95 | } |
falingtrea | 0:b37e4acdfa7b | 96 | |
falingtrea | 0:b37e4acdfa7b | 97 | /** Set Interrupt Persistence Threshold |
falingtrea | 0:b37e4acdfa7b | 98 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 99 | */ |
falingtrea | 0:b37e4acdfa7b | 100 | uint8_t ISL29011::setPersistence(INT_PERSIST int_persist) const |
falingtrea | 0:b37e4acdfa7b | 101 | { |
mfiore | 2:71053376b55a | 102 | uint8_t result = 0; |
mfiore | 2:71053376b55a | 103 | char datain[1]; |
mfiore | 2:71053376b55a | 104 | char dataout; |
falingtrea | 0:b37e4acdfa7b | 105 | |
falingtrea | 0:b37e4acdfa7b | 106 | |
falingtrea | 0:b37e4acdfa7b | 107 | result |= ISL29011::readRegister(COMMAND1,datain); |
falingtrea | 0:b37e4acdfa7b | 108 | dataout = (datain[0] & 0xFC) | int_persist; |
falingtrea | 0:b37e4acdfa7b | 109 | result |= ISL29011::writeRegister(COMMAND1, dataout); |
falingtrea | 0:b37e4acdfa7b | 110 | |
mfiore | 2:71053376b55a | 111 | return result; |
falingtrea | 0:b37e4acdfa7b | 112 | } |
falingtrea | 0:b37e4acdfa7b | 113 | |
falingtrea | 0:b37e4acdfa7b | 114 | /** Set Proximity measurement parameters |
falingtrea | 0:b37e4acdfa7b | 115 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 116 | */ |
falingtrea | 0:b37e4acdfa7b | 117 | uint8_t ISL29011::setProximity(PROX_SCHEME prox_scheme, MOD_FREQ mod_freq, LED_DRIVE led_drive) const |
falingtrea | 0:b37e4acdfa7b | 118 | { |
mfiore | 2:71053376b55a | 119 | uint8_t result = 0; |
mfiore | 2:71053376b55a | 120 | char datain[1]; |
mfiore | 2:71053376b55a | 121 | char dataout; |
falingtrea | 0:b37e4acdfa7b | 122 | |
falingtrea | 0:b37e4acdfa7b | 123 | |
falingtrea | 0:b37e4acdfa7b | 124 | result |= ISL29011::readRegister(COMMAND2,datain); |
falingtrea | 0:b37e4acdfa7b | 125 | dataout = (datain[0] & 0x0F) | prox_scheme | mod_freq | led_drive; |
falingtrea | 0:b37e4acdfa7b | 126 | result |= ISL29011::writeRegister(COMMAND2, dataout); |
falingtrea | 0:b37e4acdfa7b | 127 | |
mfiore | 2:71053376b55a | 128 | return result; |
falingtrea | 0:b37e4acdfa7b | 129 | } |
falingtrea | 0:b37e4acdfa7b | 130 | |
falingtrea | 0:b37e4acdfa7b | 131 | /** Set ADC Resolution |
falingtrea | 0:b37e4acdfa7b | 132 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 133 | */ |
falingtrea | 0:b37e4acdfa7b | 134 | uint8_t ISL29011::setResolution(ADC_RESOLUTION adc_resolution) const |
falingtrea | 0:b37e4acdfa7b | 135 | { |
mfiore | 2:71053376b55a | 136 | uint8_t result = 0; |
mfiore | 2:71053376b55a | 137 | char datain[1]; |
mfiore | 2:71053376b55a | 138 | char dataout; |
falingtrea | 0:b37e4acdfa7b | 139 | |
falingtrea | 0:b37e4acdfa7b | 140 | |
falingtrea | 0:b37e4acdfa7b | 141 | result |= ISL29011::readRegister(COMMAND2,datain); |
falingtrea | 0:b37e4acdfa7b | 142 | dataout = (datain[0] & 0xF3) | adc_resolution; |
falingtrea | 0:b37e4acdfa7b | 143 | result |= ISL29011::writeRegister(COMMAND2, dataout); |
falingtrea | 0:b37e4acdfa7b | 144 | |
mfiore | 2:71053376b55a | 145 | return result; |
falingtrea | 0:b37e4acdfa7b | 146 | } |
falingtrea | 0:b37e4acdfa7b | 147 | |
falingtrea | 0:b37e4acdfa7b | 148 | /** Set the LUX Full Scale measurement range |
falingtrea | 0:b37e4acdfa7b | 149 | * @return status of command |
falingtrea | 0:b37e4acdfa7b | 150 | */ |
falingtrea | 0:b37e4acdfa7b | 151 | uint8_t ISL29011::setRange(LUX_RANGE lux_range ) const |
falingtrea | 0:b37e4acdfa7b | 152 | { |
mfiore | 2:71053376b55a | 153 | uint8_t result = 0; |
mfiore | 2:71053376b55a | 154 | char datain[1]; |
mfiore | 2:71053376b55a | 155 | char dataout; |
falingtrea | 0:b37e4acdfa7b | 156 | |
falingtrea | 0:b37e4acdfa7b | 157 | |
falingtrea | 0:b37e4acdfa7b | 158 | result |= ISL29011::readRegister(COMMAND2,datain); |
falingtrea | 0:b37e4acdfa7b | 159 | dataout = (datain[0] & 0xFC) | lux_range; |
falingtrea | 0:b37e4acdfa7b | 160 | result |= ISL29011::writeRegister(COMMAND2, dataout); |
falingtrea | 0:b37e4acdfa7b | 161 | |
mfiore | 2:71053376b55a | 162 | return result; |
falingtrea | 0:b37e4acdfa7b | 163 | } |
falingtrea | 0:b37e4acdfa7b | 164 | |
falingtrea | 0:b37e4acdfa7b | 165 | |
falingtrea | 0:b37e4acdfa7b | 166 | uint8_t ISL29011::writeRegister(uint8_t const reg, uint8_t const data) const |
falingtrea | 0:b37e4acdfa7b | 167 | { |
falingtrea | 0:b37e4acdfa7b | 168 | char buf[2] = {reg, data}; |
falingtrea | 0:b37e4acdfa7b | 169 | uint8_t result = 0; |
falingtrea | 0:b37e4acdfa7b | 170 | |
falingtrea | 0:b37e4acdfa7b | 171 | buf[0] = reg; |
falingtrea | 0:b37e4acdfa7b | 172 | buf[1] = data; |
mfiore | 2:71053376b55a | 173 | |
falingtrea | 0:b37e4acdfa7b | 174 | // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices |
falingtrea | 0:b37e4acdfa7b | 175 | result |= _i2c->write(_i2c_addr, buf, 2); |
falingtrea | 0:b37e4acdfa7b | 176 | // __enable_irq(); // Just need to block during the transaction |
mfiore | 2:71053376b55a | 177 | |
mfiore | 2:71053376b55a | 178 | if(result != 0) { |
falingtrea | 0:b37e4acdfa7b | 179 | debug("ISL29011:writeRegister failed\n\r"); |
falingtrea | 0:b37e4acdfa7b | 180 | } |
mfiore | 2:71053376b55a | 181 | |
falingtrea | 0:b37e4acdfa7b | 182 | return result; |
falingtrea | 0:b37e4acdfa7b | 183 | } |
falingtrea | 0:b37e4acdfa7b | 184 | |
falingtrea | 0:b37e4acdfa7b | 185 | uint8_t ISL29011::readRegister(uint8_t const reg, char* data, uint8_t count) const |
falingtrea | 0:b37e4acdfa7b | 186 | { |
falingtrea | 0:b37e4acdfa7b | 187 | uint8_t result = 0; |
falingtrea | 0:b37e4acdfa7b | 188 | char reg_out[1]; |
mfiore | 2:71053376b55a | 189 | |
falingtrea | 0:b37e4acdfa7b | 190 | reg_out[0] = reg; |
falingtrea | 0:b37e4acdfa7b | 191 | // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices |
mfiore | 2:71053376b55a | 192 | result |= _i2c->write(_i2c_addr,reg_out,1,true); |
falingtrea | 0:b37e4acdfa7b | 193 | // __enable_irq(); // Just need to block during the transaction |
falingtrea | 0:b37e4acdfa7b | 194 | |
mfiore | 2:71053376b55a | 195 | if(result != 0) { |
falingtrea | 0:b37e4acdfa7b | 196 | debug("ISL29011::readRegister failed write\n\r"); |
falingtrea | 0:b37e4acdfa7b | 197 | return result; |
falingtrea | 0:b37e4acdfa7b | 198 | } |
mfiore | 2:71053376b55a | 199 | |
falingtrea | 0:b37e4acdfa7b | 200 | // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices |
mfiore | 2:71053376b55a | 201 | result |= _i2c->read(_i2c_addr,data,count,false); |
falingtrea | 0:b37e4acdfa7b | 202 | // __enable_irq(); // Just need to block during the transaction |
mfiore | 2:71053376b55a | 203 | |
mfiore | 2:71053376b55a | 204 | if(result != 0) { |
falingtrea | 0:b37e4acdfa7b | 205 | debug("ISL29011::readRegister failed read\n\r"); |
falingtrea | 0:b37e4acdfa7b | 206 | } |
mfiore | 2:71053376b55a | 207 | |
falingtrea | 0:b37e4acdfa7b | 208 | return result; |
falingtrea | 0:b37e4acdfa7b | 209 | } |
falingtrea | 0:b37e4acdfa7b | 210 | |
falingtrea | 0:b37e4acdfa7b | 211 |