Multi-Hackers / ISL29011

Dependents:   mDotEVBM2X MTDOT-EVBDemo-DRH MTDOT-BOX-EVB-Factory-Firmware-LIB-108 MTDOT-UDKDemo_Senet ... more

Committer:
falingtrea
Date:
Mon Jul 06 21:08:42 2015 +0000
Revision:
1:f5b5a0477f46
Parent:
0:b37e4acdfa7b
Child:
2:71053376b55a
Ver 1.01 Removed "= NULL" reference from .cpp ISL29011 function call

Who changed what in which revision?

UserRevisionLine numberNew 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 */
falingtrea 0:b37e4acdfa7b 24
falingtrea 0:b37e4acdfa7b 25 #include "ISL29011.h"
falingtrea 0:b37e4acdfa7b 26 #include "mbed_debug.h"
falingtrea 0:b37e4acdfa7b 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();
falingtrea 0:b37e4acdfa7b 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;
falingtrea 0:b37e4acdfa7b 41
falingtrea 0:b37e4acdfa7b 42 _i2c->frequency(400000);
falingtrea 0:b37e4acdfa7b 43
falingtrea 0:b37e4acdfa7b 44 // Reset all registers to POR values
falingtrea 0:b37e4acdfa7b 45 result = ISL29011::writeRegister(COMMAND1, 0x00);
falingtrea 0:b37e4acdfa7b 46
falingtrea 0:b37e4acdfa7b 47 if (result == 0){
falingtrea 0:b37e4acdfa7b 48 if (_isl_int == NULL)
falingtrea 0:b37e4acdfa7b 49 _polling_mode = true;
falingtrea 0:b37e4acdfa7b 50 else _polling_mode = false;
falingtrea 0:b37e4acdfa7b 51
falingtrea 0:b37e4acdfa7b 52 result = ISL29011::writeRegister(COMMAND2, 0x00);
falingtrea 0:b37e4acdfa7b 53 result = ISL29011::writeRegister(INT_LT_LSB, 0x00);
falingtrea 0:b37e4acdfa7b 54 result = ISL29011::writeRegister(INT_LT_MSB, 0x00);
falingtrea 0:b37e4acdfa7b 55 result = ISL29011::writeRegister(INT_HT_LSB, 0xFF);
falingtrea 0:b37e4acdfa7b 56 result = ISL29011::writeRegister(INT_HT_MSB, 0xFF);
falingtrea 0:b37e4acdfa7b 57 }
falingtrea 0:b37e4acdfa7b 58
falingtrea 0:b37e4acdfa7b 59 if(result != 0)
falingtrea 0:b37e4acdfa7b 60 {
falingtrea 0:b37e4acdfa7b 61 debug("ILS29011:init failed\n\r");
falingtrea 0:b37e4acdfa7b 62 }
falingtrea 0:b37e4acdfa7b 63
falingtrea 0:b37e4acdfa7b 64 return result;
falingtrea 0:b37e4acdfa7b 65 }
falingtrea 0:b37e4acdfa7b 66
falingtrea 0:b37e4acdfa7b 67 /** Get the data
falingtrea 0:b37e4acdfa7b 68 * @return The last valid LUX reading from the ambient light sensor
falingtrea 0:b37e4acdfa7b 69 */
falingtrea 0:b37e4acdfa7b 70 uint16_t ISL29011::getData(void)
falingtrea 0:b37e4acdfa7b 71 {
falingtrea 0:b37e4acdfa7b 72 if (_polling_mode)
falingtrea 0:b37e4acdfa7b 73 {
falingtrea 0:b37e4acdfa7b 74 char datain[2];
falingtrea 0:b37e4acdfa7b 75
falingtrea 0:b37e4acdfa7b 76 ISL29011::readRegister(DATA_LSB, datain, 2);
falingtrea 0:b37e4acdfa7b 77 _lux_data = (datain[1] << 8) | datain[0];
falingtrea 0:b37e4acdfa7b 78 }
falingtrea 0:b37e4acdfa7b 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 {
falingtrea 0:b37e4acdfa7b 87 uint8_t result = 0;
falingtrea 0:b37e4acdfa7b 88 char datain[1];
falingtrea 0:b37e4acdfa7b 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 {
falingtrea 0:b37e4acdfa7b 104 uint8_t result = 0;
falingtrea 0:b37e4acdfa7b 105 char datain[1];
falingtrea 0:b37e4acdfa7b 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
falingtrea 0:b37e4acdfa7b 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 {
falingtrea 0:b37e4acdfa7b 121 uint8_t result = 0;
falingtrea 0:b37e4acdfa7b 122 char datain[1];
falingtrea 0:b37e4acdfa7b 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
falingtrea 0:b37e4acdfa7b 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 {
falingtrea 0:b37e4acdfa7b 138 uint8_t result = 0;
falingtrea 0:b37e4acdfa7b 139 char datain[1];
falingtrea 0:b37e4acdfa7b 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
falingtrea 0:b37e4acdfa7b 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 {
falingtrea 0:b37e4acdfa7b 155 uint8_t result = 0;
falingtrea 0:b37e4acdfa7b 156 char datain[1];
falingtrea 0:b37e4acdfa7b 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
falingtrea 0:b37e4acdfa7b 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;
falingtrea 0:b37e4acdfa7b 175
falingtrea 0:b37e4acdfa7b 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);
falingtrea 0:b37e4acdfa7b 178 // __enable_irq(); // Just need to block during the transaction
falingtrea 0:b37e4acdfa7b 179
falingtrea 0:b37e4acdfa7b 180 if(result != 0)
falingtrea 0:b37e4acdfa7b 181 {
falingtrea 0:b37e4acdfa7b 182 debug("ISL29011:writeRegister failed\n\r");
falingtrea 0:b37e4acdfa7b 183 }
falingtrea 0:b37e4acdfa7b 184
falingtrea 0:b37e4acdfa7b 185 return result;
falingtrea 0:b37e4acdfa7b 186 }
falingtrea 0:b37e4acdfa7b 187
falingtrea 0:b37e4acdfa7b 188 uint8_t ISL29011::readRegister(uint8_t const reg, char* data, uint8_t count) const
falingtrea 0:b37e4acdfa7b 189 {
falingtrea 0:b37e4acdfa7b 190 uint8_t result = 0;
falingtrea 0:b37e4acdfa7b 191 char reg_out[1];
falingtrea 0:b37e4acdfa7b 192
falingtrea 0:b37e4acdfa7b 193 reg_out[0] = reg;
falingtrea 0:b37e4acdfa7b 194 // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices
falingtrea 0:b37e4acdfa7b 195 result |= _i2c->write(_i2c_addr,reg_out,1,true);
falingtrea 0:b37e4acdfa7b 196 // __enable_irq(); // Just need to block during the transaction
falingtrea 0:b37e4acdfa7b 197
falingtrea 0:b37e4acdfa7b 198 if(result != 0)
falingtrea 0:b37e4acdfa7b 199 {
falingtrea 0:b37e4acdfa7b 200 debug("ISL29011::readRegister failed write\n\r");
falingtrea 0:b37e4acdfa7b 201 return result;
falingtrea 0:b37e4acdfa7b 202 }
falingtrea 0:b37e4acdfa7b 203
falingtrea 0:b37e4acdfa7b 204 // __disable_irq(); // Tickers and other timebase events can jack up the I2C bus for some devices
falingtrea 0:b37e4acdfa7b 205 result |= _i2c->read(_i2c_addr,data,count,false);
falingtrea 0:b37e4acdfa7b 206 // __enable_irq(); // Just need to block during the transaction
falingtrea 0:b37e4acdfa7b 207
falingtrea 0:b37e4acdfa7b 208 if(result != 0)
falingtrea 0:b37e4acdfa7b 209 {
falingtrea 0:b37e4acdfa7b 210 debug("ISL29011::readRegister failed read\n\r");
falingtrea 0:b37e4acdfa7b 211 }
falingtrea 0:b37e4acdfa7b 212
falingtrea 0:b37e4acdfa7b 213 return result;
falingtrea 0:b37e4acdfa7b 214 }
falingtrea 0:b37e4acdfa7b 215
falingtrea 0:b37e4acdfa7b 216