MAX3010X driver continued and to be continued ...
This commit is contained in:
parent
61d8f80551
commit
880dd9cb0e
@ -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))
|
||||||
|
{
|
||||||
if(!MAX3010X_set_LED_mode(LEDMode)) return false;
|
APP_LOG_DEBUG("%d", __LINE__);
|
||||||
|
return false;
|
||||||
if(!MAX3010X_set_ADC_range(ADCRange)) return false;
|
}
|
||||||
|
|
||||||
if(!MAX3010X_set_sample_rate(sampleRate)) return false;
|
if(!MAX3010X_set_LED_mode(LEDMode))
|
||||||
|
{
|
||||||
if(!MAX3010X_set_pulse_width(LEDPulseWidth)) return false;
|
APP_LOG_DEBUG("%d", __LINE__);
|
||||||
|
return false;
|
||||||
if(!MAX3010X_set_pulse_amplitude_red(powerLevel)) return false;
|
}
|
||||||
|
|
||||||
if(!MAX3010X_set_pulse_amplitude_IR(powerLevel)) return false;
|
if(!MAX3010X_set_ADC_range(ADCRange))
|
||||||
|
{
|
||||||
if(!MAX3010X_set_multi_LED_mode_slot(1, MAX3010X_SLOT_LED_RED)) return false;
|
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(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_clear_FIFO()) return false;
|
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;
|
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);
|
||||||
|
}
|
||||||
|
@ -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
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user