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