From 880dd9cb0e91acdda7236bcf8b173fe42f27f975 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Fri, 12 May 2023 12:31:01 +0200 Subject: [PATCH] MAX3010X driver continued and to be continued ... --- .../app/app_drivers/i2c/MAX3010X.c | 160 +++++++++++++++--- .../app/app_drivers/i2c/MAX3010X.h | 6 +- src/W800_SDK_v1.00.10/app/gfx/gfx_task.c | 4 +- 3 files changed, 141 insertions(+), 29 deletions(-) diff --git a/src/W800_SDK_v1.00.10/app/app_drivers/i2c/MAX3010X.c b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/MAX3010X.c index 955870c..6c25764 100644 --- a/src/W800_SDK_v1.00.10/app/app_drivers/i2c/MAX3010X.c +++ b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/MAX3010X.c @@ -1,5 +1,7 @@ #include "i2c.h" #include "MAX3010X.h" +#include "app_utils.h" +#include "app_log.h" /* Device i2c address */ #define MAX3010X_I2C_ADDR 0x57 @@ -7,17 +9,23 @@ /* Device registers list */ /* Status Regs */ #define MAX3010X_INT_STATUS1_REG 0x00 + #define MAX3010X_INT_STATUS2_REG 0x01 +#define MAX3010X_DIE_TEMP_RDY_BIT_POS (0) + #define MAX3010X_INT_EN1_REG 0x02 + #define MAX3010X_INT_EN2_REG 0x03 +#define MAX3010X_DIE_TEMP_RDY_EN_INT_BIT_POS (1) + #define MAX3010X_FIFO_WR_PTR_REG 0x04 #define MAX3010X_FIFO_OVERFLOW_CNT_REG 0x05 #define MAX3010X_FIFO_RD_PTR_REG 0x06 #define MAX3010X_FIFO_DATA_REG 0x07 /* Configuration Regs */ #define MAX3010X_FIFO_CFG_REG 0x08 -#define MAX3010X_FIFO_CFG_FIFO_ROLLOVER_EN (4) -#define MAX3010X_FIFO_CFG_SMP_AVE_POS (5) +#define MAX3010X_FIFO_CFG_FIFO_ROLLOVER_EN_BIT_POS (4) +#define MAX3010X_FIFO_CFG_SMP_AVE_BIT_POS (5) #define MAX3010X_MODE_CFG_REG 0x09 #define MAX3010X_MODE_CFG_RST_BIT_POS (6) @@ -56,7 +64,18 @@ bool MAX3010X_soft_reset(void) // We set the reset bit and write the data back to the register data |= 1 << MAX3010X_MODE_CFG_RST_BIT_POS; - return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, data); + i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, data); + + uint8_t timeout = 0; + + do + { + i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, &data); + if((data & (1 << MAX3010X_MODE_CFG_RST_BIT_POS)) == 0) return true; + ms_delay(1); + }while(timeout++ < 100); + + return false; } bool MAX3010X_shutdown(void) @@ -90,20 +109,20 @@ bool MAX3010X_set_FIFO_average(MAX3010X_Sample_Average_e sampleAverage) if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_CFG_REG, &data)) return false; data &= 0x1F; - data |= sampleAverage << MAX3010X_FIFO_CFG_SMP_AVE_POS; + data |= sampleAverage << MAX3010X_FIFO_CFG_SMP_AVE_BIT_POS; return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_CFG_REG, data); } -bool MAX3010X_enable_FIFO_rollover(bool enabled) +bool MAX3010X_enable_FIFO_rollover(bool enable) { uint8_t data; if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_CFG_REG, &data)) return false; - if(enabled) data |= 1 << MAX3010X_FIFO_CFG_FIFO_ROLLOVER_EN; + if(enable) data |= 1 << MAX3010X_FIFO_CFG_FIFO_ROLLOVER_EN_BIT_POS; else - data &= ~(1 << MAX3010X_FIFO_CFG_FIFO_ROLLOVER_EN); + data &= ~(1 << MAX3010X_FIFO_CFG_FIFO_ROLLOVER_EN_BIT_POS); return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_CFG_REG, data); } @@ -207,8 +226,11 @@ bool MAX3010X_set_multi_LED_mode_slot(uint8_t slot, MAX3010X_SLOT_LED_e slotLED) bool MAX3010X_clear_FIFO(void) { + ms_delay(1); if(!i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_WR_PTR_REG, 0x00)) return false; + ms_delay(1); if(!i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_OVERFLOW_CNT_REG, 0x00)) return false; + ms_delay(1); if(!i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_RD_PTR_REG, 0x00)) return false; return true; @@ -216,30 +238,114 @@ bool MAX3010X_clear_FIFO(void) bool MAX3010X_configure(uint8_t powerLevel, MAX3010X_Sample_Average_e sampleAverage, MAX3010X_LED_Mode_e LEDMode, MAX3010X_Sample_Rate_e sampleRate, MAX3010X_LED_Pulse_Width_e LEDPulseWidth, MAX3010X_ADC_Range_e ADCRange) { - if(!MAX3010X_soft_reset()) return false; + if(!MAX3010X_soft_reset()) + { + APP_LOG_DEBUG("%d", __LINE__); + return false; + } - if(!MAX3010X_set_FIFO_average(sampleAverage)) return false; + if(!MAX3010X_set_FIFO_average(sampleAverage)) + { + APP_LOG_DEBUG("%d", __LINE__); + return false; + } - if(!MAX3010X_enable_FIFO_rollover(true)) return false; - - if(!MAX3010X_set_LED_mode(LEDMode)) return false; - - if(!MAX3010X_set_ADC_range(ADCRange)) return false; - - if(!MAX3010X_set_sample_rate(sampleRate)) return false; - - if(!MAX3010X_set_pulse_width(LEDPulseWidth)) return false; - - if(!MAX3010X_set_pulse_amplitude_red(powerLevel)) return false; - - if(!MAX3010X_set_pulse_amplitude_IR(powerLevel)) return false; - - if(!MAX3010X_set_multi_LED_mode_slot(1, MAX3010X_SLOT_LED_RED)) return false; + if(!MAX3010X_enable_FIFO_rollover(true)) + { + APP_LOG_DEBUG("%d", __LINE__); + return false; + } + + if(!MAX3010X_set_LED_mode(LEDMode)) + { + APP_LOG_DEBUG("%d", __LINE__); + return false; + } + + if(!MAX3010X_set_ADC_range(ADCRange)) + { + APP_LOG_DEBUG("%d", __LINE__); + return false; + } + + if(!MAX3010X_set_sample_rate(sampleRate)) + { + APP_LOG_DEBUG("%d", __LINE__); + return false; + } + + if(!MAX3010X_set_pulse_width(LEDPulseWidth)) + { + APP_LOG_DEBUG("%d", __LINE__); + return false; + } + ms_delay(1); + if(!MAX3010X_set_pulse_amplitude_red(powerLevel)) + { + APP_LOG_DEBUG("%d", __LINE__); + return false; + } + ms_delay(1); + if(!MAX3010X_set_pulse_amplitude_IR(powerLevel)) + { + APP_LOG_DEBUG("%d", __LINE__); + return false; + } + ms_delay(1); + if(!MAX3010X_set_multi_LED_mode_slot(1, MAX3010X_SLOT_LED_RED)) + { + APP_LOG_DEBUG("%d", __LINE__); + return false; + } if(LEDMode > MAX3010X_LED_MODE_RED_ONLY) - if(!MAX3010X_set_multi_LED_mode_slot(2, MAX3010X_SLOT_LED_IR)) return false; - - if(!MAX3010X_clear_FIFO()) return false; + { + ms_delay(1); + if(!MAX3010X_set_multi_LED_mode_slot(2, MAX3010X_SLOT_LED_IR)) + { + APP_LOG_DEBUG("%d", __LINE__); + return false; + } + } + + if(!MAX3010X_clear_FIFO()) + { + APP_LOG_DEBUG("%d", __LINE__); + return false; + } return true; } + +bool MAX3010X_enable_die_temperature_int(bool enable) +{ + uint8_t data; + + if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_INT_EN2_REG, &data)) return false; + + if(enable) data |= 1 << MAX3010X_DIE_TEMP_RDY_EN_INT_BIT_POS; + else + data &= ~(1 << MAX3010X_DIE_TEMP_RDY_EN_INT_BIT_POS); + + return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_INT_EN2_REG, data); +} + +float MAX3010X_read_temperature(void) +{ + if(!i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_DIE_TEMP_CFG_REG, 0x01)) return 0.0; + + uint8_t timeout = 0, data = 0; + int8_t temp = 0; + + do + { + i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_INT_STATUS2_REG, &data); + if(data & (1 << MAX3010X_DIE_TEMP_RDY_BIT_POS)) break; + ms_delay(1); + }while(timeout++ < 100); + + if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_DIE_TEMP_INT_REG, (uint8_t * const)&temp)) return 0.0; + if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_DIE_TEMP_FRACT_REG, &data)) return 0.0; + + return (float) temp + ((float) data * 0.0625); +} diff --git a/src/W800_SDK_v1.00.10/app/app_drivers/i2c/MAX3010X.h b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/MAX3010X.h index 387e5e7..bea3760 100644 --- a/src/W800_SDK_v1.00.10/app/app_drivers/i2c/MAX3010X.h +++ b/src/W800_SDK_v1.00.10/app/app_drivers/i2c/MAX3010X.h @@ -71,7 +71,7 @@ bool MAX3010X_wakeup(void); bool MAX3010X_set_FIFO_average(MAX3010X_Sample_Average_e sampleAverage); -bool MAX3010X_enable_FIFO_rollover(bool enabled); +bool MAX3010X_enable_FIFO_rollover(bool enable); bool MAX3010X_set_LED_mode(MAX3010X_LED_Mode_e LEDMode); @@ -91,4 +91,8 @@ bool MAX3010X_clear_FIFO(void); bool MAX3010X_configure(uint8_t powerLevel, MAX3010X_Sample_Average_e sampleAverage, MAX3010X_LED_Mode_e LEDMode, MAX3010X_Sample_Rate_e sampleRate, MAX3010X_LED_Pulse_Width_e LEDPulseWidth, MAX3010X_ADC_Range_e ADCRange); +bool MAX3010X_enable_die_temperature_int(bool enable); + +float MAX3010X_read_temperature(void); + #endif //MAX3010X_H \ No newline at end of file diff --git a/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c b/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c index b5e14d5..e6fe413 100644 --- a/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c +++ b/src/W800_SDK_v1.00.10/app/gfx/gfx_task.c @@ -681,7 +681,9 @@ void gfx_task(void *param) _battery_stats.battery_percentage); APP_LOG_DEBUG("MAX30102 init : %d", MAX3010X_init()); - APP_LOG_DEBUG("MAX30102 configure : %d", MAX3010X_configure(0x1F, MAX3010X_SAMPLE_AVERAGE_4, MAX3010X_LED_MODE_MULTI_LED, MAX3010X_SAMPLES_PER_SECONDS_400, MAX3010X_LED_PULSE_WIDTH_411, MAX3010X_ADC_RANGE_4096)); + APP_LOG_DEBUG("MAX30102 configure : %d", MAX3010X_configure(0x00, MAX3010X_SAMPLE_AVERAGE_4, MAX3010X_LED_MODE_MULTI_LED, MAX3010X_SAMPLES_PER_SECONDS_400, MAX3010X_LED_PULSE_WIDTH_411, MAX3010X_ADC_RANGE_4096)); + APP_LOG_DEBUG("MAX3010X enable temp int %d", MAX3010X_enable_die_temperature_int(true)); + APP_LOG_DEBUG("MAX3010X temperature : %.2f", MAX3010X_read_temperature()); }