--- 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, ®_val)); +// i2c_dev_read_reg(&dev->i2c_dev, (uint8_t)APDS9930_ENABLE, ®_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, ®_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;