Hexiwear Heart rate sensor driver
Dependents: Hexi_MAX30101 Hexiwear HexiwearFinal HexiwearFinal1
Fork of FXOS8700 by
MAX30101.h@4:3be008e67345, 2016-09-04 (annotated)
- Committer:
- DimiterK
- Date:
- Sun Sep 04 22:37:38 2016 +0000
- Revision:
- 4:3be008e67345
- Parent:
- 3:4bfb42d6c70c
First revision , not yet operational
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
DimiterK | 3:4bfb42d6c70c | 1 | #ifndef MAX30101_H |
DimiterK | 3:4bfb42d6c70c | 2 | #define MAX30101_H |
AswinSivakumar | 0:a4ffc3c3e770 | 3 | #include "mbed.h" |
AswinSivakumar | 0:a4ffc3c3e770 | 4 | |
DimiterK | 3:4bfb42d6c70c | 5 | #define MAX30101_I2C_ADDRESS (0xAE<<1) //pins SA0,SA1=0 |
DimiterK | 3:4bfb42d6c70c | 6 | |
DimiterK | 3:4bfb42d6c70c | 7 | #define MAXIM_BYTES_PER_ADC_VALUE ( 3 ) |
DimiterK | 3:4bfb42d6c70c | 8 | #define MAXIM_FIFO_DEPTH ( 32 ) |
DimiterK | 3:4bfb42d6c70c | 9 | |
DimiterK | 3:4bfb42d6c70c | 10 | #define MAX30101_InterruptStatus1 0x00 |
DimiterK | 3:4bfb42d6c70c | 11 | #define MAX30101_InterruptStatus2 0x01 |
DimiterK | 3:4bfb42d6c70c | 12 | #define MAX30101_InterruptEnable1 0x02 |
DimiterK | 3:4bfb42d6c70c | 13 | #define MAX30101_InterruptEnable2 0x03 |
DimiterK | 3:4bfb42d6c70c | 14 | |
DimiterK | 3:4bfb42d6c70c | 15 | #define MAX30101_FIFO_WR_PTR 0x04 |
DimiterK | 3:4bfb42d6c70c | 16 | #define MAX30101_FIFO_OV_PTR 0x05 |
DimiterK | 3:4bfb42d6c70c | 17 | #define MAX30101_FIFO_RD_PTR 0x06 |
DimiterK | 3:4bfb42d6c70c | 18 | #define MAX30101_FIFO_DATA 0x07 |
DimiterK | 3:4bfb42d6c70c | 19 | #define MAX30101_FIFOConfiguration 0x08 |
DimiterK | 3:4bfb42d6c70c | 20 | #define MAX30101_ModeConfiguration 0x09 |
DimiterK | 3:4bfb42d6c70c | 21 | #define MAX30101_SPO2Configuration 0x0A |
DimiterK | 3:4bfb42d6c70c | 22 | #define MAX30101_LED1RedPulseAmplitude 0x0C |
DimiterK | 3:4bfb42d6c70c | 23 | #define MAX30101_LED2IrPulseAmplitude 0x0D |
DimiterK | 3:4bfb42d6c70c | 24 | #define MAX30101_LED3GreenPulseAmplitude 0x0E |
DimiterK | 3:4bfb42d6c70c | 25 | #define MAX30101_ProximityModePulseAmplitude 0x10 |
DimiterK | 3:4bfb42d6c70c | 26 | #define MAX30101_MultiLEDModeControlTime2Time1 0x11 |
DimiterK | 3:4bfb42d6c70c | 27 | #define MAX30101_MultiLEDModeControlTime4Time3 0x12 |
DimiterK | 3:4bfb42d6c70c | 28 | #define MAX30101_DieTemperatureInteger 0x1F |
DimiterK | 3:4bfb42d6c70c | 29 | #define MAX30101_DieTemperatureFraction 0x20 |
DimiterK | 3:4bfb42d6c70c | 30 | #define MAX30101_DieTemperatureConfig 0x21 |
DimiterK | 3:4bfb42d6c70c | 31 | #define MAX30101_ProximityInterruptThreshold 0x30 |
DimiterK | 3:4bfb42d6c70c | 32 | #define MAX30101_RevisionID 0xFE |
DimiterK | 3:4bfb42d6c70c | 33 | #define MAX30101_DeviceID 0xFF |
DimiterK | 3:4bfb42d6c70c | 34 | |
DimiterK | 3:4bfb42d6c70c | 35 | /******************************************************************************/ |
DimiterK | 3:4bfb42d6c70c | 36 | #define A_FULL 0x80 |
DimiterK | 3:4bfb42d6c70c | 37 | #define PPG_RD 0x40 |
DimiterK | 3:4bfb42d6c70c | 38 | #define ALC_OVF 0x20 |
DimiterK | 3:4bfb42d6c70c | 39 | #define PROX_IN 0x10 |
DimiterK | 3:4bfb42d6c70c | 40 | #define PWR_RDY 0x01 |
DimiterK | 3:4bfb42d6c70c | 41 | |
DimiterK | 3:4bfb42d6c70c | 42 | #define DIE_TEMP_RDY 0x02 |
DimiterK | 3:4bfb42d6c70c | 43 | |
DimiterK | 3:4bfb42d6c70c | 44 | #define A_FULL_EN 0x80 |
DimiterK | 3:4bfb42d6c70c | 45 | #define PPG_RDY_EN 0x40 |
DimiterK | 3:4bfb42d6c70c | 46 | #define ALC_OVF_EN1 0x20 |
DimiterK | 3:4bfb42d6c70c | 47 | #define ALC_OVF_EN0 0x10 |
DimiterK | 3:4bfb42d6c70c | 48 | |
DimiterK | 3:4bfb42d6c70c | 49 | #define DIE_TEMP_RDY_EN 0x02 |
DimiterK | 3:4bfb42d6c70c | 50 | |
DimiterK | 3:4bfb42d6c70c | 51 | #define SHDN 0x80 |
DimiterK | 3:4bfb42d6c70c | 52 | #define RESET 0x40 |
DimiterK | 3:4bfb42d6c70c | 53 | #define MODE1 0x02 |
DimiterK | 3:4bfb42d6c70c | 54 | #define MODE0 0x01 |
DimiterK | 3:4bfb42d6c70c | 55 | |
DimiterK | 3:4bfb42d6c70c | 56 | #define SPO2_ADC_RGE1 0x40 |
DimiterK | 3:4bfb42d6c70c | 57 | #define SPO2_ADC_RGE0 0x20 |
DimiterK | 3:4bfb42d6c70c | 58 | #define SPO2_SR2 0x10 |
DimiterK | 3:4bfb42d6c70c | 59 | #define SPO2_SR1 0x08 |
DimiterK | 3:4bfb42d6c70c | 60 | #define SPO2_SR0 0x04 |
DimiterK | 3:4bfb42d6c70c | 61 | #define LED_PW1 0x02 |
DimiterK | 3:4bfb42d6c70c | 62 | #define LED_PW0 0x01 |
DimiterK | 3:4bfb42d6c70c | 63 | |
DimiterK | 3:4bfb42d6c70c | 64 | #define TEMP_EN 0x01 |
DimiterK | 3:4bfb42d6c70c | 65 | |
DimiterK | 3:4bfb42d6c70c | 66 | /******************************************************************************/ |
DimiterK | 3:4bfb42d6c70c | 67 | |
DimiterK | 3:4bfb42d6c70c | 68 | #define MAXIM_SLOT_NUM 2 |
DimiterK | 3:4bfb42d6c70c | 69 | |
DimiterK | 3:4bfb42d6c70c | 70 | typedef enum |
DimiterK | 3:4bfb42d6c70c | 71 | { |
DimiterK | 3:4bfb42d6c70c | 72 | modeHR = 0x2, |
DimiterK | 3:4bfb42d6c70c | 73 | modeSPO2 = 0x3, |
DimiterK | 3:4bfb42d6c70c | 74 | modeMultiLED = 0x7 |
DimiterK | 3:4bfb42d6c70c | 75 | |
DimiterK | 3:4bfb42d6c70c | 76 | } max30101_mode_t; |
DimiterK | 3:4bfb42d6c70c | 77 | |
DimiterK | 3:4bfb42d6c70c | 78 | typedef enum |
DimiterK | 3:4bfb42d6c70c | 79 | { |
DimiterK | 3:4bfb42d6c70c | 80 | ledPower_69 = 0x0, // ADC -> 15 bit |
DimiterK | 3:4bfb42d6c70c | 81 | ledPower_118 = 0x1, // ADC -> 16 bit |
DimiterK | 3:4bfb42d6c70c | 82 | ledPower_215 = 0x2, // ADC -> 17 bit |
DimiterK | 3:4bfb42d6c70c | 83 | ledPower_411 = 0x3 // ADC -> 18 bit |
DimiterK | 3:4bfb42d6c70c | 84 | |
DimiterK | 3:4bfb42d6c70c | 85 | } max30101_ledpwr_t; |
DimiterK | 3:4bfb42d6c70c | 86 | |
AswinSivakumar | 0:a4ffc3c3e770 | 87 | |
DimiterK | 3:4bfb42d6c70c | 88 | /** HR global status enum */ |
DimiterK | 3:4bfb42d6c70c | 89 | typedef enum |
DimiterK | 3:4bfb42d6c70c | 90 | { |
DimiterK | 3:4bfb42d6c70c | 91 | HEART_RATE_STATUS_SUCCESS, |
DimiterK | 3:4bfb42d6c70c | 92 | HEART_RATE_STATUS_ERROR |
DimiterK | 3:4bfb42d6c70c | 93 | |
DimiterK | 3:4bfb42d6c70c | 94 | } heartRate_status_t; |
DimiterK | 3:4bfb42d6c70c | 95 | |
DimiterK | 3:4bfb42d6c70c | 96 | typedef enum |
DimiterK | 3:4bfb42d6c70c | 97 | { |
DimiterK | 3:4bfb42d6c70c | 98 | sampleRate_50 = 0x0, |
DimiterK | 3:4bfb42d6c70c | 99 | sampleRate_100 = 0x1, |
DimiterK | 3:4bfb42d6c70c | 100 | sampleRate_200 = 0x2, |
DimiterK | 3:4bfb42d6c70c | 101 | sampleRate_400 = 0x3, |
DimiterK | 3:4bfb42d6c70c | 102 | sampleRate_800 = 0x4, |
DimiterK | 3:4bfb42d6c70c | 103 | sampleRate_1000 = 0x5, |
DimiterK | 3:4bfb42d6c70c | 104 | sampleRate_1600 = 0x6, |
DimiterK | 3:4bfb42d6c70c | 105 | sampleRate_3200 = 0x7 |
DimiterK | 3:4bfb42d6c70c | 106 | |
DimiterK | 3:4bfb42d6c70c | 107 | } max30101_sampleRate_t; |
DimiterK | 3:4bfb42d6c70c | 108 | |
DimiterK | 3:4bfb42d6c70c | 109 | typedef enum |
DimiterK | 3:4bfb42d6c70c | 110 | { |
DimiterK | 3:4bfb42d6c70c | 111 | LEDSlotNone = 0x0, |
DimiterK | 3:4bfb42d6c70c | 112 | LEDSlotRed = 0x1, |
DimiterK | 3:4bfb42d6c70c | 113 | LEDSlotIR = 0x2, |
DimiterK | 3:4bfb42d6c70c | 114 | LEDSlotGreen = 0x3 |
DimiterK | 3:4bfb42d6c70c | 115 | |
DimiterK | 3:4bfb42d6c70c | 116 | } max30101_LEDSlot_t; |
DimiterK | 3:4bfb42d6c70c | 117 | |
DimiterK | 3:4bfb42d6c70c | 118 | typedef enum |
DimiterK | 3:4bfb42d6c70c | 119 | { |
DimiterK | 3:4bfb42d6c70c | 120 | STATUS_MAXIM_SUCCESS, // success |
DimiterK | 3:4bfb42d6c70c | 121 | STATUS_MAXIM_ERROR, // fail |
DimiterK | 3:4bfb42d6c70c | 122 | STATUS_MAXIM_PROTOCOL_ERROR, // protocol failure |
DimiterK | 3:4bfb42d6c70c | 123 | STATUS_MAXIM_INIT_ERROR, // initialization error |
DimiterK | 3:4bfb42d6c70c | 124 | STATUS_MAXIM_PARAM_ERROR, // invalid parameter is given |
DimiterK | 3:4bfb42d6c70c | 125 | STATUS_MAXIM_OVF_ERROR, // sensor data overflow |
DimiterK | 3:4bfb42d6c70c | 126 | STATUS_MAXIM_TIMEOUT // timeout occured |
DimiterK | 3:4bfb42d6c70c | 127 | |
DimiterK | 3:4bfb42d6c70c | 128 | } max30101_status_t; |
AswinSivakumar | 0:a4ffc3c3e770 | 129 | |
DimiterK | 3:4bfb42d6c70c | 130 | typedef enum |
DimiterK | 3:4bfb42d6c70c | 131 | { |
DimiterK | 3:4bfb42d6c70c | 132 | adcRange2048 = 0x0, |
DimiterK | 3:4bfb42d6c70c | 133 | adcRange4096 = 0x1, |
DimiterK | 3:4bfb42d6c70c | 134 | adcRange8192 = 0x2, |
DimiterK | 3:4bfb42d6c70c | 135 | adcRange16384 = 0x3 |
DimiterK | 3:4bfb42d6c70c | 136 | |
DimiterK | 3:4bfb42d6c70c | 137 | } max30101_adcRange_t; |
DimiterK | 3:4bfb42d6c70c | 138 | |
DimiterK | 3:4bfb42d6c70c | 139 | typedef enum |
AswinSivakumar | 0:a4ffc3c3e770 | 140 | { |
DimiterK | 3:4bfb42d6c70c | 141 | ovsNone = 0x0, // no averaging |
DimiterK | 3:4bfb42d6c70c | 142 | ovs2 = 0x1, // average 2 samples |
DimiterK | 3:4bfb42d6c70c | 143 | ovs4 = 0x2, // average 4 samples |
DimiterK | 3:4bfb42d6c70c | 144 | ovs8 = 0x3, // average 8 samples |
DimiterK | 3:4bfb42d6c70c | 145 | ovs16 = 0x4, // average 16 samples |
DimiterK | 3:4bfb42d6c70c | 146 | ovs32 = 0x5 // average 32 samples |
DimiterK | 3:4bfb42d6c70c | 147 | |
DimiterK | 3:4bfb42d6c70c | 148 | } max30101_ovs_t; |
DimiterK | 3:4bfb42d6c70c | 149 | |
DimiterK | 3:4bfb42d6c70c | 150 | #define HR_SAMPLE_RATE ( 50 ) /** sample rate for MAXIM 30101 sensor */ |
DimiterK | 3:4bfb42d6c70c | 151 | |
DimiterK | 3:4bfb42d6c70c | 152 | |
DimiterK | 3:4bfb42d6c70c | 153 | class MAX30101 |
DimiterK | 3:4bfb42d6c70c | 154 | { |
DimiterK | 3:4bfb42d6c70c | 155 | public: |
DimiterK | 3:4bfb42d6c70c | 156 | /** |
DimiterK | 3:4bfb42d6c70c | 157 | * MAX30101 constructor |
DimiterK | 3:4bfb42d6c70c | 158 | * |
DimiterK | 3:4bfb42d6c70c | 159 | * @param sda SDA pin |
DimiterK | 3:4bfb42d6c70c | 160 | * @param sdl SCL pin |
DimiterK | 3:4bfb42d6c70c | 161 | * @param addr addr of the I2C peripheral |
DimiterK | 3:4bfb42d6c70c | 162 | */ |
DimiterK | 4:3be008e67345 | 163 | MAX30101(PinName sda, PinName scl); |
DimiterK | 3:4bfb42d6c70c | 164 | |
DimiterK | 3:4bfb42d6c70c | 165 | /** |
DimiterK | 3:4bfb42d6c70c | 166 | * MAX30101 destructor |
DimiterK | 3:4bfb42d6c70c | 167 | */ |
DimiterK | 3:4bfb42d6c70c | 168 | ~MAX30101(); |
DimiterK | 3:4bfb42d6c70c | 169 | |
DimiterK | 3:4bfb42d6c70c | 170 | void enable(void); |
DimiterK | 3:4bfb42d6c70c | 171 | |
DimiterK | 3:4bfb42d6c70c | 172 | void shutdown(void); |
AswinSivakumar | 0:a4ffc3c3e770 | 173 | |
DimiterK | 3:4bfb42d6c70c | 174 | max30101_status_t reset(void); |
DimiterK | 3:4bfb42d6c70c | 175 | |
DimiterK | 3:4bfb42d6c70c | 176 | void setMode(max30101_mode_t sensorMode); |
DimiterK | 3:4bfb42d6c70c | 177 | |
DimiterK | 3:4bfb42d6c70c | 178 | void setSPO2_ADC_range(void); |
AswinSivakumar | 0:a4ffc3c3e770 | 179 | |
DimiterK | 3:4bfb42d6c70c | 180 | void set_SPO2_sampleRange(void); |
DimiterK | 3:4bfb42d6c70c | 181 | |
DimiterK | 3:4bfb42d6c70c | 182 | void set_LED_PulseWidth(uint8_t pw); |
DimiterK | 3:4bfb42d6c70c | 183 | |
DimiterK | 3:4bfb42d6c70c | 184 | max30101_status_t readRawData(uint8_t* dataBuff, uint8_t* sampleNum ); |
DimiterK | 3:4bfb42d6c70c | 185 | float getTemp(void); |
DimiterK | 3:4bfb42d6c70c | 186 | |
DimiterK | 3:4bfb42d6c70c | 187 | float getDieTemp(void); |
AswinSivakumar | 0:a4ffc3c3e770 | 188 | |
DimiterK | 3:4bfb42d6c70c | 189 | uint8_t getRevisionID(void); |
DimiterK | 3:4bfb42d6c70c | 190 | |
DimiterK | 3:4bfb42d6c70c | 191 | uint8_t getChipID(void); |
DimiterK | 3:4bfb42d6c70c | 192 | |
DimiterK | 3:4bfb42d6c70c | 193 | private: |
DimiterK | 3:4bfb42d6c70c | 194 | I2C m_i2c; |
DimiterK | 3:4bfb42d6c70c | 195 | int m_addr; |
DimiterK | 3:4bfb42d6c70c | 196 | void readRegs(int addr, uint8_t * data, int len); |
DimiterK | 3:4bfb42d6c70c | 197 | void writeRegs(uint8_t * data, int len); |
DimiterK | 3:4bfb42d6c70c | 198 | |
DimiterK | 3:4bfb42d6c70c | 199 | uint8_t readRegister( uint8_t regaddr); |
DimiterK | 3:4bfb42d6c70c | 200 | void writeRegister(uint8_t regaddr, uint8_t data); |
DimiterK | 3:4bfb42d6c70c | 201 | |
DimiterK | 3:4bfb42d6c70c | 202 | // mode (HR, SpO2, or multi-led) |
DimiterK | 3:4bfb42d6c70c | 203 | max30101_mode_t mode; |
DimiterK | 3:4bfb42d6c70c | 204 | |
DimiterK | 3:4bfb42d6c70c | 205 | // multiLED slots |
DimiterK | 3:4bfb42d6c70c | 206 | max30101_LEDSlot_t LEDSlot[ MAXIM_SLOT_NUM ]; |
DimiterK | 3:4bfb42d6c70c | 207 | uint8_t activeSlots; |
DimiterK | 3:4bfb42d6c70c | 208 | |
DimiterK | 3:4bfb42d6c70c | 209 | // LED currents |
DimiterK | 3:4bfb42d6c70c | 210 | uint8_t LEDCurrentRed; |
DimiterK | 3:4bfb42d6c70c | 211 | uint8_t LEDCurrentIR; |
DimiterK | 3:4bfb42d6c70c | 212 | uint8_t LEDCurrentGreen; |
DimiterK | 3:4bfb42d6c70c | 213 | |
DimiterK | 3:4bfb42d6c70c | 214 | // timings |
DimiterK | 3:4bfb42d6c70c | 215 | max30101_sampleRate_t sampleRate; |
DimiterK | 3:4bfb42d6c70c | 216 | max30101_ledpwr_t pulseWidth; |
DimiterK | 3:4bfb42d6c70c | 217 | // ADC range |
DimiterK | 3:4bfb42d6c70c | 218 | max30101_adcRange_t range; |
DimiterK | 3:4bfb42d6c70c | 219 | // averaging |
DimiterK | 3:4bfb42d6c70c | 220 | max30101_ovs_t oversample; |
DimiterK | 3:4bfb42d6c70c | 221 | |
AswinSivakumar | 0:a4ffc3c3e770 | 222 | }; |
DimiterK | 3:4bfb42d6c70c | 223 | |
DimiterK | 3:4bfb42d6c70c | 224 | #endif |
AswinSivakumar | 0:a4ffc3c3e770 | 225 | |
DimiterK | 3:4bfb42d6c70c | 226 | |
DimiterK | 3:4bfb42d6c70c | 227 | |
DimiterK | 3:4bfb42d6c70c | 228 |