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

changeset 16
b3e96bbe4ce4
parent 12
bb72d448e282
child 17
1599e696d947
--- a/esp-idf-lib/components/apds9930/apds9930.c	Tue Apr 04 20:57:49 2023 +0200
+++ b/esp-idf-lib/components/apds9930/apds9930.c	Wed Apr 05 20:00:26 2023 +0200
@@ -19,7 +19,7 @@
 #include <esp_log.h>
 #include <esp_idf_lib_helpers.h>
 
-#define I2C_FREQ_HZ 1000000 // Max 1MHz for esp-idf
+#define I2C_FREQ_HZ 100000 // Max 400 KHz
 
 static const char *TAG = "apds9930";
 
@@ -72,23 +72,6 @@
 #define APDS9930_OFF			0
 #define APDS9930_ON			1
 
-/* Default values */
-#define APDS9930_DEFAULT_ATIME		0xED
-#define APDS9930_DEFAULT_WTIME		0xFF
-#define APDS9930_DEFAULT_PTIME		0xFF
-#define APDS9930_DEFAULT_PPULSE		0x08
-#define APDS9930_DEFAULT_POFFSET	0       // 0 offset
-#define APDS9930_DEFAULT_CONFIG		0
-#define APDS9930_DEFAULT_PDRIVE		APDS9930_LED_DRIVE_100MA
-#define APDS9930_DEFAULT_PDIODE		2
-#define APDS9930_DEFAULT_PGAIN		APDS9930_PGAIN_8X
-#define APDS9930_DEFAULT_AGAIN		APDS9930_AGAIN_1X
-#define APDS9930_DEFAULT_PILT		0       // Low proximity threshold
-#define APDS9930_DEFAULT_PIHT		50      // High proximity threshold
-#define APDS9930_DEFAULT_AILT		0xFFFF  // Force interrupt for calibration
-#define APDS9930_DEFAULT_AIHT		0
-#define APDS9930_DEFAULT_PERS		0x22    // 2 consecutive prox or ALS for int.
-
 /* Acceptable parameters for setMode */
 #define APDS9930_MODE_POWER		0
 #define APDS9930_MODE_AMBIENT_LIGHT	1
@@ -124,6 +107,29 @@
     } while (0)
 
 
+
+static inline esp_err_t read_reg_8_nolock(apds9930_t *dev, uint8_t reg, uint8_t *data)
+{
+    return i2c_dev_read_reg(&dev->i2c_dev, reg, data, 1);
+}
+
+static inline esp_err_t write_reg_8_nolock(apds9930_t *dev, uint8_t reg, uint8_t data)
+{
+    return i2c_dev_write_reg(&dev->i2c_dev, reg, &data, 1);
+}
+
+static esp_err_t read_reg_8(apds9930_t *dev, uint8_t reg, uint8_t *data)
+{
+    I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
+    I2C_DEV_CHECK(&dev->i2c_dev, read_reg_8_nolock(dev, reg, data));
+    I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
+
+    return ESP_OK;
+}
+
+
+
+
 inline static esp_err_t write_register8(i2c_dev_t *dev, uint8_t addr, uint8_t value)
 {
     return i2c_dev_write_reg(dev, addr, &value, 1);
@@ -167,25 +173,28 @@
     I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
 
     CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, APDS9930_ID, &dev->id, 1), "Sensor not found");
-
     if (dev->id != APDS9930_ID_1 && dev->id != APDS9930_ID_2 && dev->id != APDS9930_ID_3) {
 	CHECK_LOGE(dev, ESP_ERR_INVALID_VERSION,
 			"Invalid chip ID: expected: 0x%x or 0x%x or 0x%x got: 0x%x",
 			APDS9930_ID_1, APDS9930_ID_2, APDS9930_ID_3, dev->id);
     }
+    I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
 
     /* Set ENABLE register to 0 (disable all features) */
-    if ( !apds9930_setMode(dev, APDS9930_MODE_ALL, APDS9930_OFF) ) {
-        ESP_LOGE(TAG, "Regs off");
+    if (apds9930_setMode(dev, APDS9930_MODE_ALL, APDS9930_OFF) != ESP_OK) {
+        ESP_LOGE(TAG, "apds9930_init() error 'Regs off'");
 	err = ESP_ERR_INVALID_ARG;
     }
 
     /* Set default values for ambient light and proximity registers */
+    I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
     CHECK_LOGE(dev, write_register8(&dev->i2c_dev, APDS9930_ATIME, APDS9930_DEFAULT_ATIME), "Default atime");
     CHECK_LOGE(dev, write_register8(&dev->i2c_dev, APDS9930_WTIME, APDS9930_DEFAULT_WTIME), "Default wtime");
     CHECK_LOGE(dev, write_register8(&dev->i2c_dev, APDS9930_PPULSE, APDS9930_DEFAULT_PPULSE), "Default ppulse");
     CHECK_LOGE(dev, write_register8(&dev->i2c_dev, APDS9930_POFFSET, APDS9930_DEFAULT_POFFSET), "Default poffset");
     CHECK_LOGE(dev, write_register8(&dev->i2c_dev, APDS9930_CONFIG, APDS9930_DEFAULT_CONFIG), "Default config");
+    I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
+
     CHECK_LOGE(dev, apds9930_setLEDDrive(dev, APDS9930_DEFAULT_PDRIVE), "Default pdrive");
     CHECK_LOGE(dev, apds9930_setProximityGain(dev, APDS9930_DEFAULT_PGAIN), "Default pgain");
     CHECK_LOGE(dev, apds9930_setAmbientLightGain(dev, APDS9930_DEFAULT_AGAIN), "Default again");
@@ -194,9 +203,11 @@
     CHECK_LOGE(dev, apds9930_setProximityIntHighThreshold(dev, APDS9930_DEFAULT_PIHT), "Default PIHT");
     CHECK_LOGE(dev, apds9930_setLightIntLowThreshold(dev, APDS9930_DEFAULT_AILT), "Default ailt");
     CHECK_LOGE(dev, apds9930_setLightIntHighThreshold(dev, APDS9930_DEFAULT_AIHT), "Default aiht");
-    CHECK_LOGE(dev, write_register8(&dev->i2c_dev, APDS9930_PERS, APDS9930_DEFAULT_PERS), "Default pers");
 
+    I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
+    CHECK_LOGE(dev, write_register8(&dev->i2c_dev, APDS9930_PERS, APDS9930_DEFAULT_PERS), "Default pers");
     I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
+
     return err;
 }
 
@@ -208,9 +219,9 @@
 {
     uint8_t enable_value;
 
+    /* Read current ENABLE register */
     I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
-    /* Read current ENABLE register */
-    if (i2c_dev_read_reg(&dev->i2c_dev, APDS9930_ENABLE, &enable_value, 1) != ESP_OK) {
+    if (read_reg_8_nolock(dev, APDS9930_ENABLE, &enable_value) != ESP_OK) {
 	I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
         return APDS9930_ERROR;
     }
@@ -224,12 +235,13 @@
 {
     uint8_t reg_val;
 
-    CHECK_ARG(dev);
+//    CHECK_ARG(dev);
     /* Read current ENABLE register */
-    reg_val = apds9930_getMode(dev);
-    if( reg_val == APDS9930_ERROR ) {
-        return ESP_ERR_INVALID_RESPONSE;
-    }
+    I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
+    I2C_DEV_CHECK(&dev->i2c_dev, read_reg_8_nolock(dev, APDS9930_ENABLE, &reg_val));
+//    i2c_dev_read_reg(&dev->i2c_dev, (uint8_t)APDS9930_ENABLE, &reg_val, 1);
+    I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
+    ESP_LOGI(TAG, "apds9930_setMode(%d, %d) get=%02x", mode, enable, reg_val);
 
     /* Change bit(s) in ENABLE register */
     enable = enable & 0x01;
@@ -247,11 +259,15 @@
         }
     }
 
+    ESP_LOGI(TAG, "apds9930_setMode write %02x", reg_val);
     /* Write value back to ENABLE register */
     I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
-    CHECK_LOGE(dev, write_register8(&dev->i2c_dev, APDS9930_ENABLE, reg_val), "Enable register");
+    I2C_DEV_CHECK(&dev->i2c_dev, write_reg_8_nolock(dev, APDS9930_ENABLE, reg_val));
+//    CHECK_LOGE(dev, write_register8(&dev->i2c_dev, APDS9930_ENABLE, reg_val), "Enable register");
+//    CHECK_LOGE(dev, i2c_dev_write_reg(&dev->i2c_dev, (uint8_t)APDS9930_ENABLE, &reg_val, 1), "Enable register");
     I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
 
+//vTaskDelay(12 / portTICK_PERIOD_MS);
     return ESP_OK;
 }
 
@@ -395,17 +411,24 @@
 esp_err_t apds9930_readCh0Light(apds9930_t *dev, uint16_t *val)
 {
     uint8_t val_byte;
+    uint16_t val_word;
     *val = 0;
 
     CHECK_ARG(dev);
 
     I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
     /* Read value from channel 0 */
-    CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, APDS9930_Ch0DATAL, &val_byte, 1), "Read ch0 low");
+    CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, (uint8_t)APDS9930_Ch0DATAL, &val_byte, 1), "Read ch0 low");
+    ESP_LOGI(TAG, "l %02x", val_byte);
     *val = val_byte;
-    CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, APDS9930_Ch0DATAH, &val_byte, 1), "Read ch0 high");
+    CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, (uint8_t)APDS9930_Ch0DATAH, &val_byte, 1), "Read ch0 high");
+    ESP_LOGI(TAG, "h %02x", val_byte);
     *val += ((uint16_t)val_byte << 8);
     I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
+    ESP_LOGI(TAG, "val %04x", *val);
+
+    CHECK_LOGE(dev, i2c_dev_read_reg(&dev->i2c_dev, (uint8_t)APDS9930_Ch0DATAL, &val_word, 2), "Read ch0 16");
+    ESP_LOGI(TAG, "16 %04x", val_word);
 
     return ESP_OK;
 }
@@ -684,7 +707,7 @@
     CHECK_LOGE(dev, i2c_dev_write_reg(&dev->i2c_dev, APDS9930_CONTROL, &val, 1), "Write control");
     I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
 
-    return true;
+    return ESP_OK;
 }
 
 
@@ -894,14 +917,9 @@
     uint8_t	val = APDS9930_CLEAR_ALS_INT;
 
     I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
-    /* This should write to the chip without register address */
-    CHECK_LOGE(dev, i2c_dev_write(&dev->i2c_dev, NULL, 0, &val, 1), "Clear ALS_INT");
+    I2C_DEV_CHECK(&dev->i2c_dev, i2c_dev_write(&dev->i2c_dev, NULL, 0, &val, 1));
     I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
 
-//    if( !wireWriteByte(CLEAR_ALS_INT) ) {
-//      return false;
-    //}
-
     return ESP_OK;
 }
 
@@ -911,7 +929,7 @@
     uint8_t	val = APDS9930_CLEAR_PROX_INT;
 
     I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
-    CHECK_LOGE(dev, i2c_dev_write(&dev->i2c_dev, NULL, 0, &val, 1), "Clear PROX_INT");
+    I2C_DEV_CHECK(&dev->i2c_dev, i2c_dev_write(&dev->i2c_dev, NULL, 0, &val, 1));
     I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
 
     return ESP_OK;
@@ -923,7 +941,7 @@
     uint8_t	val = APDS9930_CLEAR_ALL_INTS;
 
     I2C_DEV_TAKE_MUTEX(&dev->i2c_dev);
-    CHECK_LOGE(dev, i2c_dev_write(&dev->i2c_dev, NULL, 0, &val, 1), "Clear ALL_INTS");
+    I2C_DEV_CHECK(&dev->i2c_dev, i2c_dev_write(&dev->i2c_dev, NULL, 0, &val, 1));
     I2C_DEV_GIVE_MUTEX(&dev->i2c_dev);
 
     return ESP_OK;

mercurial