Hexiwear Heart rate sensor driver

Dependents:   Hexi_MAX30101 Hexiwear HexiwearFinal HexiwearFinal1

Fork of FXOS8700 by Aswin Sivakumar

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?

UserRevisionLine numberNew 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