MAX3010X driver continued and to be continued ...

This commit is contained in:
Th3maz1ng 2023-05-12 12:31:01 +02:00
parent 61d8f80551
commit 880dd9cb0e
3 changed files with 141 additions and 29 deletions

View File

@ -1,5 +1,7 @@
#include "i2c.h" #include "i2c.h"
#include "MAX3010X.h" #include "MAX3010X.h"
#include "app_utils.h"
#include "app_log.h"
/* Device i2c address */ /* Device i2c address */
#define MAX3010X_I2C_ADDR 0x57 #define MAX3010X_I2C_ADDR 0x57
@ -7,17 +9,23 @@
/* Device registers list */ /* Device registers list */
/* Status Regs */ /* Status Regs */
#define MAX3010X_INT_STATUS1_REG 0x00 #define MAX3010X_INT_STATUS1_REG 0x00
#define MAX3010X_INT_STATUS2_REG 0x01 #define MAX3010X_INT_STATUS2_REG 0x01
#define MAX3010X_DIE_TEMP_RDY_BIT_POS (0)
#define MAX3010X_INT_EN1_REG 0x02 #define MAX3010X_INT_EN1_REG 0x02
#define MAX3010X_INT_EN2_REG 0x03 #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_WR_PTR_REG 0x04
#define MAX3010X_FIFO_OVERFLOW_CNT_REG 0x05 #define MAX3010X_FIFO_OVERFLOW_CNT_REG 0x05
#define MAX3010X_FIFO_RD_PTR_REG 0x06 #define MAX3010X_FIFO_RD_PTR_REG 0x06
#define MAX3010X_FIFO_DATA_REG 0x07 #define MAX3010X_FIFO_DATA_REG 0x07
/* Configuration Regs */ /* Configuration Regs */
#define MAX3010X_FIFO_CFG_REG 0x08 #define MAX3010X_FIFO_CFG_REG 0x08
#define MAX3010X_FIFO_CFG_FIFO_ROLLOVER_EN (4) #define MAX3010X_FIFO_CFG_FIFO_ROLLOVER_EN_BIT_POS (4)
#define MAX3010X_FIFO_CFG_SMP_AVE_POS (5) #define MAX3010X_FIFO_CFG_SMP_AVE_BIT_POS (5)
#define MAX3010X_MODE_CFG_REG 0x09 #define MAX3010X_MODE_CFG_REG 0x09
#define MAX3010X_MODE_CFG_RST_BIT_POS (6) #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 // We set the reset bit and write the data back to the register
data |= 1 << MAX3010X_MODE_CFG_RST_BIT_POS; 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) 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; if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_CFG_REG, &data)) return false;
data &= 0x1F; 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); 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; uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_CFG_REG, &data)) return false; 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 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); 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) bool MAX3010X_clear_FIFO(void)
{ {
ms_delay(1);
if(!i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_WR_PTR_REG, 0x00)) return false; 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; 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; if(!i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_RD_PTR_REG, 0x00)) return false;
return true; 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) 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_enable_FIFO_rollover(true))
{
APP_LOG_DEBUG("%d", __LINE__);
return false;
}
if(!MAX3010X_set_LED_mode(LEDMode)) return false; if(!MAX3010X_set_LED_mode(LEDMode))
{
APP_LOG_DEBUG("%d", __LINE__);
return false;
}
if(!MAX3010X_set_ADC_range(ADCRange)) return false; if(!MAX3010X_set_ADC_range(ADCRange))
{
APP_LOG_DEBUG("%d", __LINE__);
return false;
}
if(!MAX3010X_set_sample_rate(sampleRate)) return false; if(!MAX3010X_set_sample_rate(sampleRate))
{
APP_LOG_DEBUG("%d", __LINE__);
return false;
}
if(!MAX3010X_set_pulse_width(LEDPulseWidth)) return false; if(!MAX3010X_set_pulse_width(LEDPulseWidth))
{
if(!MAX3010X_set_pulse_amplitude_red(powerLevel)) return false; APP_LOG_DEBUG("%d", __LINE__);
return false;
if(!MAX3010X_set_pulse_amplitude_IR(powerLevel)) return false; }
ms_delay(1);
if(!MAX3010X_set_multi_LED_mode_slot(1, MAX3010X_SLOT_LED_RED)) return false; 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(LEDMode > MAX3010X_LED_MODE_RED_ONLY)
if(!MAX3010X_set_multi_LED_mode_slot(2, MAX3010X_SLOT_LED_IR)) 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()) return false; if(!MAX3010X_clear_FIFO())
{
APP_LOG_DEBUG("%d", __LINE__);
return false;
}
return true; 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);
}

View File

@ -71,7 +71,7 @@ bool MAX3010X_wakeup(void);
bool MAX3010X_set_FIFO_average(MAX3010X_Sample_Average_e sampleAverage); 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); 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_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 #endif //MAX3010X_H

View File

@ -681,7 +681,9 @@ void gfx_task(void *param)
_battery_stats.battery_percentage); _battery_stats.battery_percentage);
APP_LOG_DEBUG("MAX30102 init : %d", MAX3010X_init()); 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());
} }