esp-idf-lib/components/apds9930/apds9930.c

changeset 21
df8564c9701e
parent 17
1599e696d947
child 37
50dbb626fbab
equal deleted inserted replaced
20:c3001154416f 21:df8564c9701e
116 static inline esp_err_t write_reg_8_nolock(apds9930_t *dev, uint8_t reg, uint8_t data) 116 static inline esp_err_t write_reg_8_nolock(apds9930_t *dev, uint8_t reg, uint8_t data)
117 { 117 {
118 return i2c_dev_write_reg(&dev->i2c_dev, reg, &data, 1); 118 return i2c_dev_write_reg(&dev->i2c_dev, reg, &data, 1);
119 } 119 }
120 120
121 static esp_err_t read_reg_8(apds9930_t *dev, uint8_t reg, uint8_t *data)
122 {
123 I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
124 I2C_DEV_CHECK(&dev->i2c_dev, read_reg_8_nolock(dev, reg, data));
125 I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
126
127 return ESP_OK;
128 }
129
130
131
132 121
133 inline static esp_err_t write_register8(i2c_dev_t *dev, uint8_t addr, uint8_t value) 122 inline static esp_err_t write_register8(i2c_dev_t *dev, uint8_t addr, uint8_t value)
134 { 123 {
135 return i2c_dev_write_reg(dev, addr, &value, 1); 124 return i2c_dev_write_reg(dev, addr, &value, 1);
136 } 125 }
233 222
234 esp_err_t apds9930_setMode(apds9930_t *dev, uint8_t mode, uint8_t enable) 223 esp_err_t apds9930_setMode(apds9930_t *dev, uint8_t mode, uint8_t enable)
235 { 224 {
236 uint8_t reg_val; 225 uint8_t reg_val;
237 226
238 // CHECK_ARG(dev); 227 CHECK_ARG(dev);
239 /* Read current ENABLE register */ 228 /* Read current ENABLE register */
240 I2C_DEV_TAKE_MUTEX(&dev->i2c_dev); 229 reg_val = apds9930_getMode(dev);
241 I2C_DEV_CHECK(&dev->i2c_dev, read_reg_8_nolock(dev, APDS9930_ENABLE | APDS9930_AUTO_INCREMENT, &reg_val));
242 // i2c_dev_read_reg(&dev->i2c_dev, (uint8_t)APDS9930_ENABLE, &reg_val, 1);
243 I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
244 ESP_LOGI(TAG, "apds9930_setMode(%d, %d) get=%02x", mode, enable, reg_val);
245 230
246 /* Change bit(s) in ENABLE register */ 231 /* Change bit(s) in ENABLE register */
247 enable = enable & 0x01; 232 enable = enable & 0x01;
248 if (mode <= 6) { 233 if (mode <= 6) {
249 if (enable) { 234 if (enable) {
257 } else { 242 } else {
258 reg_val = 0x00; 243 reg_val = 0x00;
259 } 244 }
260 } 245 }
261 246
262 ESP_LOGI(TAG, "apds9930_setMode write %02x", reg_val);
263 /* Write value back to ENABLE register */ 247 /* Write value back to ENABLE register */
264 I2C_DEV_TAKE_MUTEX(&dev->i2c_dev); 248 I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
265 I2C_DEV_CHECK(&dev->i2c_dev, write_reg_8_nolock(dev, APDS9930_ENABLE | APDS9930_AUTO_INCREMENT, reg_val)); 249 I2C_DEV_CHECK(&dev->i2c_dev, write_reg_8_nolock(dev, APDS9930_ENABLE | APDS9930_AUTO_INCREMENT, reg_val));
266 // CHECK_LOGE(dev, write_register8(&dev->i2c_dev, APDS9930_ENABLE, reg_val), "Enable register"); 250 I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
267 // CHECK_LOGE(dev, i2c_dev_write_reg(&dev->i2c_dev, (uint8_t)APDS9930_ENABLE, &reg_val, 1), "Enable register"); 251
268 I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
269
270 //vTaskDelay(12 / portTICK_PERIOD_MS);
271 return ESP_OK; 252 return ESP_OK;
272 } 253 }
273 254
274 255
275 esp_err_t apds9930_enableLightSensor(apds9930_t *dev, bool interrupts) 256 esp_err_t apds9930_enableLightSensor(apds9930_t *dev, bool interrupts)
408 } 389 }
409 390
410 391
411 esp_err_t apds9930_readCh0Light(apds9930_t *dev, uint16_t *val) 392 esp_err_t apds9930_readCh0Light(apds9930_t *dev, uint16_t *val)
412 { 393 {
413 uint8_t val_byte;
414 uint16_t val_word; 394 uint16_t val_word;
415 *val = 0; 395 *val = 0;
416 396
417 CHECK_ARG(dev); 397 CHECK_ARG(dev);
418 398
419 I2C_DEV_TAKE_MUTEX(&dev->i2c_dev); 399 I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
420 /* Read value from channel 0 */ 400 /* Read value from channel 0 */
421 CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, (uint8_t)APDS9930_Ch0DATAL | APDS9930_AUTO_INCREMENT, &val_byte, 1), "Read ch0 low"); 401 CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, (uint8_t)APDS9930_Ch0DATAL | APDS9930_AUTO_INCREMENT, &val_word, 2), "Read ch0");
422 ESP_LOGI(TAG, "l %02x", val_byte); 402 I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
423 *val = val_byte; 403 *val = val_word;
424 CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, (uint8_t)APDS9930_Ch0DATAH | APDS9930_AUTO_INCREMENT, &val_byte, 1), "Read ch0 high");
425 ESP_LOGI(TAG, "h %02x", val_byte);
426 *val += ((uint16_t)val_byte << 8);
427 I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
428 ESP_LOGI(TAG, "val %04x", *val);
429
430 CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, (uint8_t)APDS9930_Ch0DATAL | APDS9930_AUTO_INCREMENT, &val_word, 2), "Read ch0 16");
431 ESP_LOGI(TAG, "16 %04x", val_word);
432 404
433 return ESP_OK; 405 return ESP_OK;
434 } 406 }
435 407
436 408
437 esp_err_t apds9930_readCh1Light(apds9930_t *dev, uint16_t *val) 409 esp_err_t apds9930_readCh1Light(apds9930_t *dev, uint16_t *val)
438 { 410 {
439 uint8_t val_byte; 411 uint16_t val_word;
440 *val = 0; 412 *val = 0;
441 413
442 I2C_DEV_TAKE_MUTEX(&dev->i2c_dev); 414 I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
443 /* Read value from channel 1 */ 415 /* Read value from channel 1 */
444 CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, APDS9930_Ch1DATAL | APDS9930_AUTO_INCREMENT, &val_byte, 1), "Read ch1 low"); 416 CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, (uint8_t)APDS9930_Ch1DATAL | APDS9930_AUTO_INCREMENT, &val_word, 2), "Read ch1");
445 *val = val_byte; 417 I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
446 CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, APDS9930_Ch1DATAH | APDS9930_AUTO_INCREMENT, &val_byte, 1), "Read ch1 high"); 418 *val = val_word;
447 *val += ((uint16_t)val_byte << 8);
448 I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
449 419
450 return ESP_OK; 420 return ESP_OK;
451 } 421 }
452 422
453 /******************************************************************************* 423 /*******************************************************************************

mercurial