Continued to work on the MAX3010X driver, setup function is complete, still a lot to port/implement

This commit is contained in:
anschrammh 2023-05-11 07:18:11 +02:00
parent 23d3c47374
commit 42c01e1d08
2 changed files with 176 additions and 0 deletions

View File

@ -59,6 +59,30 @@ bool MAX3010X_soft_reset(void)
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, data); return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, data);
} }
bool MAX3010X_shutdown(void)
{
uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, &data)) return false;
// We set the shutdown bit and write the data back to the register
data |= 1 << MAX3010X_MODE_CFG_SHDN_BIT_POS;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, data);
}
bool MAX3010X_wakeup(void)
{
uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, &data)) return false;
// We clear the shutdown bit and write the data back to the register
data &= ~(1 << MAX3010X_MODE_CFG_SHDN_BIT_POS);
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, data);
}
bool MAX3010X_set_FIFO_average(MAX3010X_Sample_Average_e sampleAverage) bool MAX3010X_set_FIFO_average(MAX3010X_Sample_Average_e sampleAverage)
{ {
uint8_t data; uint8_t data;
@ -84,6 +108,112 @@ bool MAX3010X_enable_FIFO_rollover(bool enabled)
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_set_LED_mode(MAX3010X_LED_Mode_e LEDMode)
{
uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, &data)) return false;
data &= 0xF8;
data |= LEDMode;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MODE_CFG_REG, data);
}
bool MAX3010X_set_ADC_range(MAX3010X_ADC_Range_e ADCRange)
{
uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_SPO2_CFG_REG, &data)) return false;
data &= 0x9F;
data |= ADCRange << 5;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_SPO2_CFG_REG, data);
}
bool MAX3010X_set_sample_rate(MAX3010X_Sample_Rate_e sampleRate)
{
uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_SPO2_CFG_REG, &data)) return false;
data &= 0xE3;
data |= sampleRate << 2;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_SPO2_CFG_REG, data);
}
bool MAX3010X_set_pulse_width(MAX3010X_LED_Pulse_Width_e LEDPulseWidth)
{
uint8_t data;
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_SPO2_CFG_REG, &data)) return false;
data &= 0xFC;
data |= LEDPulseWidth;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_SPO2_CFG_REG, data);
}
bool MAX3010X_set_pulse_amplitude_red(uint8_t powerLevel)
{
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_LED1_PULSE_AMP_REG, powerLevel);
}
bool MAX3010X_set_pulse_amplitude_IR(uint8_t powerLevel)
{
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_LED2_PULSE_AMP_REG, powerLevel);
}
bool MAX3010X_set_multi_LED_mode_slot(uint8_t slot, MAX3010X_SLOT_LED_e slotLED)
{
uint8_t data;
switch(slot)
{
case 1:
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT1_2_REG, &data)) return false;
data &= 0xF8;
data |= slotLED;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT1_2_REG, data);
case 2:
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT1_2_REG, &data)) return false;
data &= 0x8F;
data |= slotLED << 4;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT1_2_REG, data);
case 3:
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT3_4_REG, &data)) return false;
data &= 0xF8;
data |= slotLED;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT3_4_REG, data);
case 4:
if(!i2c_read_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT3_4_REG, &data)) return false;
data &= 0x8F;
data |= slotLED << 4;
return i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_MULTI_LED_MODE_CTRL_SLOT3_4_REG, data);
default:
return false;
}
}
bool MAX3010X_clear_FIFO(void)
{
if(!i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_WR_PTR_REG, 0x00)) return false;
if(!i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_OVERFLOW_CNT_REG, 0x00)) return false;
if(!i2c_write_reg(MAX3010X_I2C_ADDR, MAX3010X_FIFO_RD_PTR_REG, 0x00)) return false;
return true;
}
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()) return false;
@ -92,5 +222,24 @@ bool MAX3010X_configure(uint8_t powerLevel, MAX3010X_Sample_Average_e sampleAver
if(!MAX3010X_enable_FIFO_rollover(true)) 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(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;
return true; return true;
} }

View File

@ -46,6 +46,13 @@ typedef enum MAX3010X_ADC_Range
MAX3010X_ADC_RANGE_16384 = 0x03, MAX3010X_ADC_RANGE_16384 = 0x03,
} MAX3010X_ADC_Range_e; } MAX3010X_ADC_Range_e;
typedef enum MAX3010X_SLOT_LED
{
MAX3010X_SLOT_LED_NONE = 0x00,
MAX3010X_SLOT_LED_RED = 0x01,
MAX3010X_SLOT_LED_IR = 0x02,
} MAX3010X_SLOT_LED_e;
/** /**
* @brief Initializes the MAX3010X sensor. This must be called before any other API functions. * @brief Initializes the MAX3010X sensor. This must be called before any other API functions.
@ -58,10 +65,30 @@ bool MAX3010X_init(void);
bool MAX3010X_soft_reset(void); bool MAX3010X_soft_reset(void);
bool MAX3010X_shutdown(void);
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 enabled);
bool MAX3010X_set_LED_mode(MAX3010X_LED_Mode_e LEDMode);
bool MAX3010X_set_ADC_range(MAX3010X_ADC_Range_e ADCRange);
bool MAX3010X_set_sample_rate(MAX3010X_Sample_Rate_e sampleRate);
bool MAX3010X_set_pulse_width(MAX3010X_LED_Pulse_Width_e LEDPulseWidth);
bool MAX3010X_set_pulse_amplitude_red(uint8_t powerLevel);
bool MAX3010X_set_pulse_amplitude_IR(uint8_t powerLevel);
bool MAX3010X_set_multi_LED_mode_slot(uint8_t slot, MAX3010X_SLOT_LED_e slotLED);
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);
#endif //MAX3010X_H #endif //MAX3010X_H