Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: mDotEVBM2X MTDOT-EVBDemo-DRH MTDOT-BOX-EVB-Factory-Firmware-LIB-108 MTDOT-UDKDemo_Senet ... more
ISL29011.cpp@0:b37e4acdfa7b, 2015-07-06 (annotated)
- Committer:
- falingtrea
- Date:
- Mon Jul 06 19:35:14 2015 +0000
- Revision:
- 0:b37e4acdfa7b
- Child:
- 1:f5b5a0477f46
Initial release
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 | 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 | #include "ISL29011.h" |
| falingtrea | 0:b37e4acdfa7b | 24 | #include "mbed_debug.h" |
| falingtrea | 0:b37e4acdfa7b | 25 | |
| falingtrea | 0:b37e4acdfa7b | 26 | ISL29011::ISL29011(I2C &i2c, InterruptIn* isl_int = NULL) |
| falingtrea | 0:b37e4acdfa7b | 27 | { |
| falingtrea | 0:b37e4acdfa7b | 28 | _i2c = &i2c; |
| falingtrea | 0:b37e4acdfa7b | 29 | _isl_int = isl_int; |
| falingtrea | 0:b37e4acdfa7b | 30 | |
| falingtrea | 0:b37e4acdfa7b | 31 | ISL29011::init(); |
| falingtrea | 0:b37e4acdfa7b | 32 | |
| falingtrea | 0:b37e4acdfa7b | 33 | return; |
| falingtrea | 0:b37e4acdfa7b | 34 | } |
| falingtrea | 0:b37e4acdfa7b | 35 | |
| falingtrea | 0:b37e4acdfa7b | 36 | uint8_t ISL29011::init(void) |
| falingtrea | 0:b37e4acdfa7b | 37 | { |
| falingtrea | 0:b37e4acdfa7b | 38 | uint8_t result = 0; |
| falingtrea | 0:b37e4acdfa7b | 39 | |
| falingtrea | 0:b37e4acdfa7b | 40 | _i2c->frequency(400000); |
| falingtrea | 0:b37e4acdfa7b | 41 | |
| falingtrea | 0:b37e4acdfa7b | 42 | // Reset all registers to POR values |
| falingtrea | 0:b37e4acdfa7b | 43 | result = ISL29011::writeRegister(COMMAND1, 0x00); |
| falingtrea | 0:b37e4acdfa7b | 44 | |
| falingtrea | 0:b37e4acdfa7b | 45 | if (result == 0){ |
| falingtrea | 0:b37e4acdfa7b | 46 | if (_isl_int == NULL) |
| falingtrea | 0:b37e4acdfa7b | 47 | _polling_mode = true; |
| falingtrea | 0:b37e4acdfa7b | 48 | else _polling_mode = false; |
| falingtrea | 0:b37e4acdfa7b | 49 | |
| falingtrea | 0:b37e4acdfa7b | 50 | result = ISL29011::writeRegister(COMMAND2, 0x00); |
| falingtrea | 0:b37e4acdfa7b | 51 | result = ISL29011::writeRegister(INT_LT_LSB, 0x00); |
| falingtrea | 0:b37e4acdfa7b | 52 | result = ISL29011::writeRegister(INT_LT_MSB, 0x00); |
| falingtrea | 0:b37e4acdfa7b | 53 | result = ISL29011::writeRegister(INT_HT_LSB, 0xFF); |
| falingtrea | 0:b37e4acdfa7b | 54 | result = ISL29011::writeRegister(INT_HT_MSB, 0xFF); |
| falingtrea | 0:b37e4acdfa7b | 55 | } |
| falingtrea | 0:b37e4acdfa7b | 56 | |
| falingtrea | 0:b37e4acdfa7b | 57 | if(result != 0) |
| falingtrea | 0:b37e4acdfa7b | 58 | { |
| falingtrea | 0:b37e4acdfa7b | 59 | debug("ILS29011:init failed\n\r"); |
| falingtrea | 0:b37e4acdfa7b | 60 | } |
| falingtrea | 0:b37e4acdfa7b | 61 | |
| falingtrea | 0:b37e4acdfa7b | 62 | return result; |
| falingtrea | 0:b37e4acdfa7b | 63 | } |
| falingtrea | 0:b37e4acdfa7b | 64 | |
| falingtrea | 0:b37e4acdfa7b | 65 | /** Get the data |
| falingtrea | 0:b37e4acdfa7b | 66 | * @return The last valid LUX reading from the ambient light sensor |
| falingtrea | 0:b37e4acdfa7b | 67 | */ |
| falingtrea | 0:b37e4acdfa7b | 68 | uint16_t ISL29011::getData(void) |
| falingtrea | 0:b37e4acdfa7b | 69 | { |
| falingtrea | 0:b37e4acdfa7b | 70 | if (_polling_mode) |
| falingtrea | 0:b37e4acdfa7b | 71 | { |
| falingtrea | 0:b37e4acdfa7b | 72 | char datain[2]; |
| falingtrea | 0:b37e4acdfa7b | 73 | |
| falingtrea | 0:b37e4acdfa7b | 74 | ISL29011::readRegister(DATA_LSB, datain, 2); |
| falingtrea | 0:b37e4acdfa7b | 75 | _lux_data = (datain[1] << 8) | datain[0]; |
| falingtrea | 0:b37e4acdfa7b | 76 | } |
| falingtrea | 0:b37e4acdfa7b | 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 | { |
| falingtrea | 0:b37e4acdfa7b | 85 | uint8_t result = 0; |
| falingtrea | 0:b37e4acdfa7b | 86 | char datain[1]; |
| falingtrea | 0:b37e4acdfa7b | 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 | { |
| falingtrea | 0:b37e4acdfa7b | 102 | uint8_t result = 0; |
| falingtrea | 0:b37e4acdfa7b | 103 | char datain[1]; |
| falingtrea | 0:b37e4acdfa7b | 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 | |
| falingtrea | 0:b37e4acdfa7b | 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 | { |
| falingtrea | 0:b37e4acdfa7b | 119 | uint8_t result = 0; |
| falingtrea | 0:b37e4acdfa7b | 120 | char datain[1]; |
| falingtrea | 0:b37e4acdfa7b | 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 | |
| falingtrea | 0:b37e4acdfa7b | 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 | { |
| falingtrea | 0:b37e4acdfa7b | 136 | uint8_t result = 0; |
| falingtrea | 0:b37e4acdfa7b | 137 | char datain[1]; |
| falingtrea | 0:b37e4acdfa7b | 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 | |
| falingtrea | 0:b37e4acdfa7b | 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 | { |
| falingtrea | 0:b37e4acdfa7b | 153 | uint8_t result = 0; |
| falingtrea | 0:b37e4acdfa7b | 154 | char datain[1]; |
| falingtrea | 0:b37e4acdfa7b | 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 | |
| falingtrea | 0:b37e4acdfa7b | 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; |
| falingtrea | 0:b37e4acdfa7b | 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 |
| falingtrea | 0:b37e4acdfa7b | 177 | |
| falingtrea | 0:b37e4acdfa7b | 178 | if(result != 0) |
| falingtrea | 0:b37e4acdfa7b | 179 | { |
| falingtrea | 0:b37e4acdfa7b | 180 | debug("ISL29011:writeRegister failed\n\r"); |
| falingtrea | 0:b37e4acdfa7b | 181 | } |
| falingtrea | 0:b37e4acdfa7b | 182 | |
| falingtrea | 0:b37e4acdfa7b | 183 | return result; |
| falingtrea | 0:b37e4acdfa7b | 184 | } |
| falingtrea | 0:b37e4acdfa7b | 185 | |
| falingtrea | 0:b37e4acdfa7b | 186 | uint8_t ISL29011::readRegister(uint8_t const reg, char* data, uint8_t count) const |
| falingtrea | 0:b37e4acdfa7b | 187 | { |
| falingtrea | 0:b37e4acdfa7b | 188 | uint8_t result = 0; |
| falingtrea | 0:b37e4acdfa7b | 189 | char reg_out[1]; |
| falingtrea | 0:b37e4acdfa7b | 190 | |
| falingtrea | 0:b37e4acdfa7b | 191 | reg_out[0] = reg; |
| falingtrea | 0:b37e4acdfa7b | 192 | // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices |
| falingtrea | 0:b37e4acdfa7b | 193 | result |= _i2c->write(_i2c_addr,reg_out,1,true); |
| falingtrea | 0:b37e4acdfa7b | 194 | // __enable_irq(); // Just need to block during the transaction |
| falingtrea | 0:b37e4acdfa7b | 195 | |
| falingtrea | 0:b37e4acdfa7b | 196 | if(result != 0) |
| falingtrea | 0:b37e4acdfa7b | 197 | { |
| falingtrea | 0:b37e4acdfa7b | 198 | debug("ISL29011::readRegister failed write\n\r"); |
| falingtrea | 0:b37e4acdfa7b | 199 | return result; |
| falingtrea | 0:b37e4acdfa7b | 200 | } |
| falingtrea | 0:b37e4acdfa7b | 201 | |
| falingtrea | 0:b37e4acdfa7b | 202 | // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices |
| falingtrea | 0:b37e4acdfa7b | 203 | result |= _i2c->read(_i2c_addr,data,count,false); |
| falingtrea | 0:b37e4acdfa7b | 204 | // __enable_irq(); // Just need to block during the transaction |
| falingtrea | 0:b37e4acdfa7b | 205 | |
| falingtrea | 0:b37e4acdfa7b | 206 | if(result != 0) |
| falingtrea | 0:b37e4acdfa7b | 207 | { |
| falingtrea | 0:b37e4acdfa7b | 208 | debug("ISL29011::readRegister failed read\n\r"); |
| falingtrea | 0:b37e4acdfa7b | 209 | } |
| falingtrea | 0:b37e4acdfa7b | 210 | |
| falingtrea | 0:b37e4acdfa7b | 211 | return result; |
| falingtrea | 0:b37e4acdfa7b | 212 | } |
| falingtrea | 0:b37e4acdfa7b | 213 | |
| falingtrea | 0:b37e4acdfa7b | 214 |