Library for ISL29125 - I2C RGB ambient light sensor

Dependents:   ISL29125_demo FinalProject Final_NSR 4180FinalProject_copy ... more

Device documentation

Detailed information is available at Intersil

Calling the constructor

The constructor can be instantiaded in 3 ways:

Information

The first two pins (SDA and SCL) always need to be declared.

ISR mode

void RGBsensor_irq(void)    // User ISR
{
    ....
}

ISL29125 RGBsensor(PTE0, PTE1, PTD7, &RGBsensor_irq);          // sda, scl, irq, user isr

The user ISR is called whenever the upper/lower threshold is reached and/or when a conversion cycle is finished. The threshold (Threshold function) and end of conversion (IRQonCnvDone function) interrupts can be enabled separately.
In this mode, PTD7 is an interrupt input.

Limitation!

Calling the Read function at a high rate will result in a I2C failure.
Use a Ticker to call the Read function at regular intervals. Example : ISL29125_demo

SYNC mode

ISL29125 RGBsensor(PTE0, PTE1, PTD7);                        // sda, scl, sync input

In this mode, PTD7 is a digital output. Initially, the sensor is idle (no conversions) and can be started by calling the Run function.

Polling mode

ISL29125 RGBsensor(PTE0, PTE1);                              // sda, scl

In this mode, user defined functions are needed to poll the sensor status, read the sensor data, ....

Committer:
frankvnk
Date:
Wed May 28 20:15:39 2014 +0000
Revision:
4:ae36914adb6d
Parent:
0:59ae5a71c902
Update doxygen

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:59ae5a71c902 1 /******************************************************************************************************************************
frankvnk 0:59ae5a71c902 2 ***** *****
frankvnk 0:59ae5a71c902 3 ***** Name: ISL29125.cpp *****
frankvnk 0:59ae5a71c902 4 ***** Date: 06/04/2014 *****
frankvnk 0:59ae5a71c902 5 ***** Auth: Frank Vannieuwkerke *****
frankvnk 0:59ae5a71c902 6 ***** Func: library for Intersil ISL29125 RGB Ambient light sensor with IR blocking filter *****
frankvnk 0:59ae5a71c902 7 ***** *****
frankvnk 0:59ae5a71c902 8 ***** Additional info is available at *****
frankvnk 0:59ae5a71c902 9 ***** http://www.intersil.com/en/products/optoelectronics/ambient-light-sensors/light-to-digital-sensors/ISL29125.html *****
frankvnk 0:59ae5a71c902 10 ***** *****
frankvnk 0:59ae5a71c902 11 ******************************************************************************************************************************/
frankvnk 0:59ae5a71c902 12
frankvnk 0:59ae5a71c902 13 #include "ISL29125.h"
frankvnk 0:59ae5a71c902 14
frankvnk 0:59ae5a71c902 15 InterruptIn *_irqpin;
frankvnk 0:59ae5a71c902 16 DigitalOut *_syncpin;
frankvnk 0:59ae5a71c902 17
frankvnk 0:59ae5a71c902 18 // ISL29125 I2C address
frankvnk 0:59ae5a71c902 19 #define ISL29125_I2C_ADDR 0x88 // I2C address
frankvnk 0:59ae5a71c902 20
frankvnk 0:59ae5a71c902 21 // ISL29125 registers
frankvnk 0:59ae5a71c902 22 // ------------------
frankvnk 0:59ae5a71c902 23 #define ISL29125_REG_WHOAMI 0x00 // Read : device ID - should return 0x7D.
frankvnk 0:59ae5a71c902 24 // Write 0x46 : reset all registers to default.
frankvnk 0:59ae5a71c902 25 #define ISL29125_REG_CFG1 0x01 // Operating mode, sensing range and start ADC.
frankvnk 0:59ae5a71c902 26 #define ISL29125_REG_CFG2 0x02 // Active IR compensation.
frankvnk 0:59ae5a71c902 27 #define ISL29125_REG_CFG3 0x03 // Interrupt threshold assignment, IRQ persist control, IRQ on conversion done.
frankvnk 0:59ae5a71c902 28 #define ISL29125_REG_ITL_LO 0x04 // Interrupt Treshold Low value, low byte
frankvnk 0:59ae5a71c902 29 #define ISL29125_REG_ITL_HI 0x05 // Interrupt Treshold Low value, high byte
frankvnk 0:59ae5a71c902 30 #define ISL29125_REG_ITH_LO 0x06 // Interrupt Treshold High value, low byte
frankvnk 0:59ae5a71c902 31 #define ISL29125_REG_ITH_HI 0x07 // Interrupt Treshold High value, high byte
frankvnk 0:59ae5a71c902 32 #define ISL29125_REG_STATUS 0x08 // Status register : Interrupt, conversion done, brownout, R/G/B conversion busy.
frankvnk 0:59ae5a71c902 33 #define ISL29125_REG_DATA_GLO 0x09 // Green data low byte.
frankvnk 0:59ae5a71c902 34 #define ISL29125_REG_DATA_GHI 0x0A // Green data high byte.
frankvnk 0:59ae5a71c902 35 #define ISL29125_REG_DATA_RLO 0x0B // Red data low byte.
frankvnk 0:59ae5a71c902 36 #define ISL29125_REG_DATA_RHI 0x0C // RED data high byte.
frankvnk 0:59ae5a71c902 37 #define ISL29125_REG_DATA_BLO 0x0D // Blue data low byte.
frankvnk 0:59ae5a71c902 38 #define ISL29125_REG_DATA_BHI 0x0E // Blue data high byte.
frankvnk 0:59ae5a71c902 39
frankvnk 0:59ae5a71c902 40 // ISL29125 register fields
frankvnk 0:59ae5a71c902 41 // ------------------------
frankvnk 0:59ae5a71c902 42 // Device register 0x00
frankvnk 0:59ae5a71c902 43 #define ISL29125_RESET 0x46 // Software reset command.
frankvnk 0:59ae5a71c902 44 #define ISL29125_WHOAMI 0x7D // Device ID
frankvnk 0:59ae5a71c902 45
frankvnk 0:59ae5a71c902 46
frankvnk 0:59ae5a71c902 47 // Config register 0x01
frankvnk 0:59ae5a71c902 48 // RGB conversion operating modes (bits 0..2) - see header file for values
frankvnk 0:59ae5a71c902 49 #define ISL29125_MODE_MASK 0xF8
frankvnk 0:59ae5a71c902 50 // RGB data sensing range (bit 3)
frankvnk 0:59ae5a71c902 51 // 0 : full scale range = 375 lux
frankvnk 0:59ae5a71c902 52 // 1 : full scale range = 10000 lux
frankvnk 0:59ae5a71c902 53 #define ISL29125_RNG_MASK 0xF7
frankvnk 0:59ae5a71c902 54 // ADC resolution (bit 4)
frankvnk 0:59ae5a71c902 55 // 0 : 16-bit resolution
frankvnk 0:59ae5a71c902 56 // 1 : 12-bit resolution
frankvnk 0:59ae5a71c902 57 #define ISL29125_BITS_MASK 0xEF
frankvnk 0:59ae5a71c902 58 // INT pin mode (bit 5)
frankvnk 0:59ae5a71c902 59 // 0 : INT pin is SYNC input - ADC starts at rising edge of INT.
frankvnk 0:59ae5a71c902 60 // 1 : INT pin is IRQ output.
frankvnk 0:59ae5a71c902 61 #define ISL29125_SYNC_MASK 0xDF
frankvnk 0:59ae5a71c902 62 #define ISL29125_SYNC_SHIFT 5
frankvnk 0:59ae5a71c902 63
frankvnk 0:59ae5a71c902 64
frankvnk 0:59ae5a71c902 65 // Config register 0x02 - Active IR compensation (bit 0..5 = fine adjust, bit 7 = coarse adjust)
frankvnk 0:59ae5a71c902 66 #define ISL29125_IR_CMP_MASK 0xBF
frankvnk 0:59ae5a71c902 67 #define ISL29125_IRC_MAX 0xBF // max. out IR compensation value (as per the datasheet specs)
frankvnk 0:59ae5a71c902 68
frankvnk 0:59ae5a71c902 69
frankvnk 0:59ae5a71c902 70 // Config register 0x03 - IRQ
frankvnk 0:59ae5a71c902 71 // IRQ assignment (bits 0,1) - see header file for values
frankvnk 0:59ae5a71c902 72 #define ISL29125_INTSEL_MASK 0xFC
frankvnk 0:59ae5a71c902 73 // IRQ persist control (bits 2,3) - activate IRQ after n consecutive transients(register value) : 1(0), 2(1), 4(2) or 8(3)
frankvnk 0:59ae5a71c902 74 #define ISL29125_PRST_MASK 0xF3
frankvnk 0:59ae5a71c902 75 // IRQ when conversion is done (bit 4)
frankvnk 0:59ae5a71c902 76 // Enable conversion done IRQ
frankvnk 0:59ae5a71c902 77 // Clear this bit to disable conversion done IRQ
frankvnk 0:59ae5a71c902 78 #define ISL29125_CONVEN_MASK 0xEF
frankvnk 0:59ae5a71c902 79 #define ISL29125_CONVEN_SHIFT 4
frankvnk 0:59ae5a71c902 80
frankvnk 0:59ae5a71c902 81
frankvnk 0:59ae5a71c902 82 // Status register 0x08
frankvnk 0:59ae5a71c902 83 // Interrupt status (1 when triggered)
frankvnk 0:59ae5a71c902 84 #define ISL29125_RGBTHF_SHIFT 0
frankvnk 0:59ae5a71c902 85 #define ISL29125_RGBTHF (1 << ISL29125_RGBTHF_SHIFT)
frankvnk 0:59ae5a71c902 86 // Conversion status (1 when done)
frankvnk 0:59ae5a71c902 87 #define ISL29125_CONVENF_SHIFT 1
frankvnk 0:59ae5a71c902 88 #define ISL29125_CONVENF (1 << ISL29125_CONVENF_SHIFT)
frankvnk 0:59ae5a71c902 89 // Brownout status (1 when brownout occured)
frankvnk 0:59ae5a71c902 90 #define ISL29125_BOUTF_SHIFT 2
frankvnk 0:59ae5a71c902 91 #define ISL29125_BOUTF (1 << ISL29125_BOUTF_SHIFT)
frankvnk 0:59ae5a71c902 92 // RGB conversion progress - see header file for values
frankvnk 0:59ae5a71c902 93 #define ISL29125_RGBCF_MASK 0x30
frankvnk 0:59ae5a71c902 94 #define ISL29125_RGBCF_SHIFT 4
frankvnk 0:59ae5a71c902 95
frankvnk 0:59ae5a71c902 96 ISL29125::ISL29125(PinName sda, PinName scl, PinName irqsync, void (*fptr)(void)) : _i2c(sda, scl)
frankvnk 0:59ae5a71c902 97 {
frankvnk 0:59ae5a71c902 98 uint8_t cmd[2]; // cmd[0] = register address, cmd[1] = data
frankvnk 0:59ae5a71c902 99 _i2c.frequency(400000);
frankvnk 0:59ae5a71c902 100 _ismode = 0;
frankvnk 0:59ae5a71c902 101 // Set the ISL29125 in a known state : perform Software Reset
frankvnk 0:59ae5a71c902 102 cmd[0] = ISL29125_REG_WHOAMI;
frankvnk 0:59ae5a71c902 103 cmd[1] = ISL29125_RESET;
frankvnk 0:59ae5a71c902 104 writeRegs(cmd, 2);
frankvnk 0:59ae5a71c902 105 // Init the ISL29125 : Enable RGB operating mode, sensing range = 10000 lux, 16 bit resolution
frankvnk 0:59ae5a71c902 106 // Following registers remain at the default reset values :
frankvnk 0:59ae5a71c902 107 // Register 0x03 - Interrupt source (none), persist control (1) , INT when conversion (0).
frankvnk 0:59ae5a71c902 108 // Register 0x04, 0x05 - Low threshold interrupt : 0x0000
frankvnk 0:59ae5a71c902 109 // Register 0x06, 0x07 - High threshold interrupt : 0xFFFF
frankvnk 0:59ae5a71c902 110 cmd[0] = ISL29125_REG_CFG1;
frankvnk 0:59ae5a71c902 111 cmd[1] = (uint8_t)(ISL29125_RGB | ~ISL29125_RNG_MASK);
frankvnk 0:59ae5a71c902 112 // When irqsync is nonzero and no fptr is declared, use Sync mode (only start ADC on rising edge at sync output)
frankvnk 0:59ae5a71c902 113 if((irqsync != NC) && (fptr == NULL))
frankvnk 0:59ae5a71c902 114 {
frankvnk 0:59ae5a71c902 115 _ismode = 2;
frankvnk 0:59ae5a71c902 116 cmd[1] |= ~ISL29125_SYNC_MASK;
frankvnk 0:59ae5a71c902 117 _syncpin = new DigitalOut(irqsync); // Create DigitalOut pin
frankvnk 0:59ae5a71c902 118 _syncpin->write(0);
frankvnk 0:59ae5a71c902 119 }
frankvnk 0:59ae5a71c902 120 writeRegs(cmd, 2);
frankvnk 0:59ae5a71c902 121 // Max. out IR compensation value (as per the datasheet specs)
frankvnk 0:59ae5a71c902 122 cmd[0] = ISL29125_REG_CFG2;
frankvnk 0:59ae5a71c902 123 cmd[1] = ISL29125_IRC_MAX;
frankvnk 0:59ae5a71c902 124 writeRegs(cmd, 2);
frankvnk 0:59ae5a71c902 125 // When both irqsync and fptr are nonzero, we use InterruptIn: irqsync pin is interrupt input and Attach local ISR (calls user-ISR).
frankvnk 0:59ae5a71c902 126 if((irqsync != NC) && (fptr != NULL))
frankvnk 0:59ae5a71c902 127 {
frankvnk 0:59ae5a71c902 128 _ismode = 1;
frankvnk 0:59ae5a71c902 129 _irqpin = new InterruptIn(irqsync); // Create InterruptIn pin
frankvnk 0:59ae5a71c902 130 _irqpin->fall(this, &ISL29125::_alsISR); // Attach falling interrupt to local ISR
frankvnk 0:59ae5a71c902 131 _fptr.attach(fptr); // Attach function pointer to user function
frankvnk 0:59ae5a71c902 132 }
frankvnk 0:59ae5a71c902 133 }
frankvnk 0:59ae5a71c902 134
frankvnk 0:59ae5a71c902 135 uint8_t ISL29125::Status(void)
frankvnk 0:59ae5a71c902 136 {
frankvnk 0:59ae5a71c902 137 return (readReg( ISL29125_REG_STATUS));
frankvnk 0:59ae5a71c902 138 }
frankvnk 0:59ae5a71c902 139
frankvnk 0:59ae5a71c902 140 uint8_t ISL29125::WhoAmI(void)
frankvnk 0:59ae5a71c902 141 {
frankvnk 0:59ae5a71c902 142 return (readReg( ISL29125_REG_WHOAMI));
frankvnk 0:59ae5a71c902 143 }
frankvnk 0:59ae5a71c902 144
frankvnk 0:59ae5a71c902 145 bool ISL29125::Read(uint8_t color, uint16_t * data) {
frankvnk 0:59ae5a71c902 146 uint8_t i, addr = 0, reg_cnt = 2, res[6];
frankvnk 0:59ae5a71c902 147 if(Status() & ISL29125_CONVENF) // Only return data when a conversion is finished.
frankvnk 0:59ae5a71c902 148 {
frankvnk 0:59ae5a71c902 149 switch (color)
frankvnk 0:59ae5a71c902 150 {
frankvnk 0:59ae5a71c902 151 case ISL29125_R:
frankvnk 0:59ae5a71c902 152 addr = ISL29125_REG_DATA_RLO;
frankvnk 0:59ae5a71c902 153 break;
frankvnk 0:59ae5a71c902 154 case ISL29125_G:
frankvnk 0:59ae5a71c902 155 addr = ISL29125_REG_DATA_GLO;
frankvnk 0:59ae5a71c902 156 break;
frankvnk 0:59ae5a71c902 157 case ISL29125_B:
frankvnk 0:59ae5a71c902 158 addr = ISL29125_REG_DATA_BLO;
frankvnk 0:59ae5a71c902 159 break;
frankvnk 0:59ae5a71c902 160 case ISL29125_RGB:
frankvnk 0:59ae5a71c902 161 addr = ISL29125_REG_DATA_GLO;
frankvnk 0:59ae5a71c902 162 reg_cnt = 6;
frankvnk 0:59ae5a71c902 163 break;
frankvnk 0:59ae5a71c902 164 default:
frankvnk 0:59ae5a71c902 165 return(0);
frankvnk 0:59ae5a71c902 166 }
frankvnk 0:59ae5a71c902 167 readRegs(addr, res, reg_cnt);
frankvnk 0:59ae5a71c902 168 for(i=0 ; i<reg_cnt-1 ; i+=2)
frankvnk 0:59ae5a71c902 169 *(data+(i/2)) = (res[i+1] << 8) | (res[i]);
frankvnk 0:59ae5a71c902 170 return (1);
frankvnk 0:59ae5a71c902 171 }
frankvnk 0:59ae5a71c902 172 else return(0);
frankvnk 0:59ae5a71c902 173 }
frankvnk 0:59ae5a71c902 174
frankvnk 0:59ae5a71c902 175 uint16_t ISL29125::Threshold(uint8_t reg, uint16_t thres) {
frankvnk 0:59ae5a71c902 176 if(reg == ISL29125_LTH_R || reg == ISL29125_HTH_R)
frankvnk 0:59ae5a71c902 177 {
frankvnk 0:59ae5a71c902 178 uint8_t res[2];
frankvnk 0:59ae5a71c902 179 readRegs(reg*2, res, 2);
frankvnk 0:59ae5a71c902 180 return(res[1] << 8 | res[0]);
frankvnk 0:59ae5a71c902 181 }
frankvnk 0:59ae5a71c902 182 else
frankvnk 0:59ae5a71c902 183 {
frankvnk 0:59ae5a71c902 184 uint8_t data[3];
frankvnk 0:59ae5a71c902 185 data[0] = reg;
frankvnk 0:59ae5a71c902 186 data[1] = thres & 0xff;
frankvnk 0:59ae5a71c902 187 data[2] = (thres >> 8) & 0xff;
frankvnk 0:59ae5a71c902 188 writeRegs(data, 3);
frankvnk 0:59ae5a71c902 189 }
frankvnk 0:59ae5a71c902 190 return(thres);
frankvnk 0:59ae5a71c902 191 }
frankvnk 0:59ae5a71c902 192
frankvnk 0:59ae5a71c902 193 uint8_t ISL29125::RGBmode(uint8_t RGBmode) {
frankvnk 0:59ae5a71c902 194 if(RGBmode == 0xff)
frankvnk 0:59ae5a71c902 195 {
frankvnk 0:59ae5a71c902 196 return(readReg( ISL29125_REG_CFG1) & ~ISL29125_MODE_MASK);
frankvnk 0:59ae5a71c902 197 }
frankvnk 0:59ae5a71c902 198 else
frankvnk 0:59ae5a71c902 199 {
frankvnk 0:59ae5a71c902 200 if((RGBmode != ISL29125_G) && (RGBmode != ISL29125_R) && (RGBmode != ISL29125_B) &&
frankvnk 0:59ae5a71c902 201 (RGBmode != ISL29125_RG) && (RGBmode != ISL29125_BG) && (RGBmode != ISL29125_RGB) &&
frankvnk 0:59ae5a71c902 202 (RGBmode != ISL29125_STBY) && (RGBmode != ISL29125_OFF)) return(0xff);
frankvnk 0:59ae5a71c902 203 uint8_t data[2];
frankvnk 0:59ae5a71c902 204 data[0] = ISL29125_REG_CFG1;
frankvnk 0:59ae5a71c902 205 data[1] = (readReg( ISL29125_REG_CFG1) & ISL29125_MODE_MASK) | RGBmode;
frankvnk 0:59ae5a71c902 206 writeRegs(data, 2);
frankvnk 0:59ae5a71c902 207 }
frankvnk 0:59ae5a71c902 208 return(RGBmode);
frankvnk 0:59ae5a71c902 209 }
frankvnk 0:59ae5a71c902 210
frankvnk 0:59ae5a71c902 211 uint8_t ISL29125::Range(uint8_t range) {
frankvnk 0:59ae5a71c902 212 if(range == 0xff)
frankvnk 0:59ae5a71c902 213 {
frankvnk 0:59ae5a71c902 214 return(readReg( ISL29125_REG_CFG1) & ~ISL29125_RNG_MASK);
frankvnk 0:59ae5a71c902 215 }
frankvnk 0:59ae5a71c902 216 else
frankvnk 0:59ae5a71c902 217 {
frankvnk 0:59ae5a71c902 218 uint8_t data[2];
frankvnk 0:59ae5a71c902 219 if((range != ISL29125_375LX) && (range != ISL29125_10KLX)) return(0xff);
frankvnk 0:59ae5a71c902 220 data[0] = ISL29125_REG_CFG1;
frankvnk 0:59ae5a71c902 221 data[1] = (readReg( ISL29125_REG_CFG1) & ISL29125_RNG_MASK) | range;
frankvnk 0:59ae5a71c902 222 writeRegs(data, 2);
frankvnk 0:59ae5a71c902 223 }
frankvnk 0:59ae5a71c902 224 return(range);
frankvnk 0:59ae5a71c902 225 }
frankvnk 0:59ae5a71c902 226
frankvnk 0:59ae5a71c902 227 uint8_t ISL29125::Resolution(uint8_t resol) {
frankvnk 0:59ae5a71c902 228 if(resol == 0xff)
frankvnk 0:59ae5a71c902 229 {
frankvnk 0:59ae5a71c902 230 return(readReg( ISL29125_REG_CFG1) & ~ISL29125_BITS_MASK);
frankvnk 0:59ae5a71c902 231 }
frankvnk 0:59ae5a71c902 232 else
frankvnk 0:59ae5a71c902 233 {
frankvnk 0:59ae5a71c902 234 uint8_t data[2];
frankvnk 0:59ae5a71c902 235 if((resol != ISL29125_16BIT) && (resol != ISL29125_12BIT)) return(0xff);
frankvnk 0:59ae5a71c902 236 data[0] = ISL29125_REG_CFG1;
frankvnk 0:59ae5a71c902 237 data[1] = (readReg( ISL29125_REG_CFG1) & ISL29125_BITS_MASK) | resol;
frankvnk 0:59ae5a71c902 238 writeRegs(data, 2);
frankvnk 0:59ae5a71c902 239 }
frankvnk 0:59ae5a71c902 240 return(resol);
frankvnk 0:59ae5a71c902 241 }
frankvnk 0:59ae5a71c902 242
frankvnk 0:59ae5a71c902 243 uint8_t ISL29125::Persist(uint8_t persist) {
frankvnk 0:59ae5a71c902 244 if(persist == 0xff)
frankvnk 0:59ae5a71c902 245 {
frankvnk 0:59ae5a71c902 246 return(readReg( ISL29125_REG_CFG3) & ~ISL29125_PRST_MASK);
frankvnk 0:59ae5a71c902 247 }
frankvnk 0:59ae5a71c902 248 else
frankvnk 0:59ae5a71c902 249 {
frankvnk 0:59ae5a71c902 250 uint8_t data[2];
frankvnk 0:59ae5a71c902 251 if((persist != ISL29125_PERS1) && (persist != ISL29125_PERS2) && (persist != ISL29125_PERS4) && (persist != ISL29125_PERS8)) return(0xff);
frankvnk 0:59ae5a71c902 252 data[0] = ISL29125_REG_CFG3;
frankvnk 0:59ae5a71c902 253 data[1] = (readReg( ISL29125_REG_CFG3) & ISL29125_PRST_MASK) | persist;
frankvnk 0:59ae5a71c902 254 writeRegs(data, 2);
frankvnk 0:59ae5a71c902 255 }
frankvnk 0:59ae5a71c902 256 return(persist);
frankvnk 0:59ae5a71c902 257 }
frankvnk 0:59ae5a71c902 258
frankvnk 0:59ae5a71c902 259 uint8_t ISL29125::IRQonCnvDone(uint8_t irqen) {
frankvnk 0:59ae5a71c902 260 uint8_t tmprgb;
frankvnk 0:59ae5a71c902 261 uint8_t data[2];
frankvnk 0:59ae5a71c902 262 if(irqen == 0xff)
frankvnk 0:59ae5a71c902 263 {
frankvnk 0:59ae5a71c902 264 return((readReg( ISL29125_REG_CFG3) & ~ISL29125_CONVEN_MASK) >> ISL29125_CONVEN_SHIFT);
frankvnk 0:59ae5a71c902 265 }
frankvnk 0:59ae5a71c902 266 else
frankvnk 0:59ae5a71c902 267 {
frankvnk 0:59ae5a71c902 268 if((irqen != true) && (irqen != false)) return(0xff);
frankvnk 0:59ae5a71c902 269 tmprgb = RGBmode(); // Save current ADC operating mode
frankvnk 0:59ae5a71c902 270 RGBmode(ISL29125_OFF); // Stop ADC conversion (changing IRQonCnvDone while ADC is running results in i2c failure)
frankvnk 0:59ae5a71c902 271 data[0] = ISL29125_REG_CFG3;
frankvnk 0:59ae5a71c902 272 data[1] = (readReg( ISL29125_REG_CFG3) & ISL29125_CONVEN_MASK) | (irqen << ISL29125_CONVEN_SHIFT);
frankvnk 0:59ae5a71c902 273 writeRegs(data, 2);
frankvnk 0:59ae5a71c902 274 RGBmode(tmprgb); // Restore ADC operating mode
frankvnk 0:59ae5a71c902 275 }
frankvnk 0:59ae5a71c902 276 return(irqen);
frankvnk 0:59ae5a71c902 277 }
frankvnk 0:59ae5a71c902 278
frankvnk 0:59ae5a71c902 279 uint8_t ISL29125::IRQonColor(uint8_t RGBmode) {
frankvnk 0:59ae5a71c902 280 if(RGBmode == 0xff)
frankvnk 0:59ae5a71c902 281 {
frankvnk 0:59ae5a71c902 282 return(readReg( ISL29125_REG_CFG3) & ~ISL29125_INTSEL_MASK);
frankvnk 0:59ae5a71c902 283 }
frankvnk 0:59ae5a71c902 284 else
frankvnk 0:59ae5a71c902 285 {
frankvnk 0:59ae5a71c902 286 uint8_t data[2];
frankvnk 0:59ae5a71c902 287 if((RGBmode != ISL29125_G) && (RGBmode != ISL29125_R) && (RGBmode != ISL29125_B) && (RGBmode != ISL29125_OFF)) return(0xff);
frankvnk 0:59ae5a71c902 288 data[0] = ISL29125_REG_CFG3;
frankvnk 0:59ae5a71c902 289 data[1] = (readReg( ISL29125_REG_CFG3) & ISL29125_INTSEL_MASK) | RGBmode;
frankvnk 0:59ae5a71c902 290 writeRegs(data, 2);
frankvnk 0:59ae5a71c902 291 }
frankvnk 0:59ae5a71c902 292 return(RGBmode);
frankvnk 0:59ae5a71c902 293 }
frankvnk 0:59ae5a71c902 294
frankvnk 0:59ae5a71c902 295 uint8_t ISL29125::IRcomp(uint8_t ircomp) {
frankvnk 0:59ae5a71c902 296 if(ircomp == 0xff)
frankvnk 0:59ae5a71c902 297 {
frankvnk 0:59ae5a71c902 298 return(readReg( ISL29125_REG_CFG2) & ISL29125_IR_CMP_MASK);
frankvnk 0:59ae5a71c902 299 }
frankvnk 0:59ae5a71c902 300 else
frankvnk 0:59ae5a71c902 301 {
frankvnk 0:59ae5a71c902 302 uint8_t data[2];
frankvnk 0:59ae5a71c902 303 if(((ircomp > 63) && (ircomp < 128)) || (ircomp > 191)) return(0xff); // Range must be between 0..63 or 128..191
frankvnk 0:59ae5a71c902 304 data[0] = ISL29125_REG_CFG2;
frankvnk 0:59ae5a71c902 305 data[1] = ircomp & ISL29125_IR_CMP_MASK;
frankvnk 0:59ae5a71c902 306 writeRegs(data, 2);
frankvnk 0:59ae5a71c902 307 }
frankvnk 0:59ae5a71c902 308 return(ircomp);
frankvnk 0:59ae5a71c902 309 }
frankvnk 0:59ae5a71c902 310
frankvnk 0:59ae5a71c902 311 bool ISL29125::Run(void) {
frankvnk 0:59ae5a71c902 312 if(_ismode == 2) // Only allow write to sync pin when irqsync pin was declared without the ISR pointer.
frankvnk 0:59ae5a71c902 313 {
frankvnk 0:59ae5a71c902 314 _syncpin->write(1);
frankvnk 0:59ae5a71c902 315 return(1);
frankvnk 0:59ae5a71c902 316 }
frankvnk 0:59ae5a71c902 317 return(0);
frankvnk 0:59ae5a71c902 318 }
frankvnk 0:59ae5a71c902 319
frankvnk 0:59ae5a71c902 320 void ISL29125::_alsISR(void)
frankvnk 0:59ae5a71c902 321 {
frankvnk 0:59ae5a71c902 322 Status();
frankvnk 0:59ae5a71c902 323 _fptr.call();
frankvnk 0:59ae5a71c902 324 }
frankvnk 0:59ae5a71c902 325
frankvnk 0:59ae5a71c902 326 void ISL29125::i2cfail(void)
frankvnk 0:59ae5a71c902 327 {
frankvnk 0:59ae5a71c902 328 printf("I2C fail\r\n");
frankvnk 0:59ae5a71c902 329 while(1);
frankvnk 0:59ae5a71c902 330 }
frankvnk 0:59ae5a71c902 331
frankvnk 0:59ae5a71c902 332 void ISL29125::readRegs(uint8_t addr, uint8_t * data, uint8_t len) {
frankvnk 0:59ae5a71c902 333 char t[1] = {addr};
frankvnk 0:59ae5a71c902 334 if(_i2c.write(ISL29125_I2C_ADDR, t, 1, true)) i2cfail();
frankvnk 0:59ae5a71c902 335 if(_i2c.read(ISL29125_I2C_ADDR, (char *)data, len)) i2cfail();
frankvnk 0:59ae5a71c902 336 }
frankvnk 0:59ae5a71c902 337
frankvnk 0:59ae5a71c902 338 uint8_t ISL29125::readReg(uint8_t addr) {
frankvnk 0:59ae5a71c902 339 char t[1] = {addr};
frankvnk 0:59ae5a71c902 340 if(_i2c.write(ISL29125_I2C_ADDR, t, 1)) i2cfail();
frankvnk 0:59ae5a71c902 341 if(_i2c.read(ISL29125_I2C_ADDR, t, 1)) i2cfail();
frankvnk 0:59ae5a71c902 342 return t[0];
frankvnk 0:59ae5a71c902 343 }
frankvnk 0:59ae5a71c902 344
frankvnk 0:59ae5a71c902 345 void ISL29125::writeRegs(uint8_t * data, uint8_t len) {
frankvnk 0:59ae5a71c902 346 if(_i2c.write(ISL29125_I2C_ADDR, (char *)data, len)) i2cfail();
frankvnk 0:59ae5a71c902 347 }