Example host software for the Maxim Integrated MAX30101 high sensitivity Heart Rate Monitor chip. Hosted on the MAX32630FTHR FeatherWing micro-controller board.

Dependencies:   MAX30101_Finger_Heart_Rate_SpO2_Monitor_Driver_Source_Code USBDevice max32630fthr

Fork of MAX30101_Heart_Rate_Sp02_Sensor_Chip by David Jung

Committer:
phonemacro
Date:
Sat Jul 21 07:11:45 2018 +0000
Revision:
0:ec8835052a84
Initial commit, branched off from MAXREFDES100, MAX32620HSP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phonemacro 0:ec8835052a84 1 /*******************************************************************************
phonemacro 0:ec8835052a84 2 / * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
phonemacro 0:ec8835052a84 3 *
phonemacro 0:ec8835052a84 4 * Permission is hereby granted, free of charge, to any person obtaining a
phonemacro 0:ec8835052a84 5 * copy of this software and associated documentation files (the "Software"),
phonemacro 0:ec8835052a84 6 * to deal in the Software without restriction, including without limitation
phonemacro 0:ec8835052a84 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
phonemacro 0:ec8835052a84 8 * and/or sell copies of the Software, and to permit persons to whom the
phonemacro 0:ec8835052a84 9 * Software is furnished to do so, subject to the following conditions:
phonemacro 0:ec8835052a84 10 *
phonemacro 0:ec8835052a84 11 * The above copyright notice and this permission notice shall be included
phonemacro 0:ec8835052a84 12 * in all copies or substantial portions of the Software.
phonemacro 0:ec8835052a84 13 *
phonemacro 0:ec8835052a84 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
phonemacro 0:ec8835052a84 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
phonemacro 0:ec8835052a84 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
phonemacro 0:ec8835052a84 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
phonemacro 0:ec8835052a84 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
phonemacro 0:ec8835052a84 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
phonemacro 0:ec8835052a84 20 * OTHER DEALINGS IN THE SOFTWARE.
phonemacro 0:ec8835052a84 21 *
phonemacro 0:ec8835052a84 22 * Except as contained in this notice, the name of Maxim Integrated
phonemacro 0:ec8835052a84 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
phonemacro 0:ec8835052a84 24 * Products, Inc. Branding Policy.
phonemacro 0:ec8835052a84 25 *
phonemacro 0:ec8835052a84 26 * The mere transfer of this software does not imply any licenses
phonemacro 0:ec8835052a84 27 * of trade secrets, proprietary technology, copyrights, patents,
phonemacro 0:ec8835052a84 28 * trademarks, maskwork rights, or any other form of intellectual
phonemacro 0:ec8835052a84 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
phonemacro 0:ec8835052a84 30 * ownership rights.
phonemacro 0:ec8835052a84 31 *******************************************************************************/
phonemacro 0:ec8835052a84 32 /**
phonemacro 0:ec8835052a84 33 * Maxim Integrated MAX30101 Oximeter chip
phonemacro 0:ec8835052a84 34 *
phonemacro 0:ec8835052a84 35 * IMPORTANT: The code below will also need MAX14720.cpp and MAX14720.h
phonemacro 0:ec8835052a84 36 *
phonemacro 0:ec8835052a84 37 * @code
phonemacro 0:ec8835052a84 38 * #include "mbed.h"
phonemacro 0:ec8835052a84 39 * #include "MAX14720.h"
phonemacro 0:ec8835052a84 40 * #include "MAX30101.h"
phonemacro 0:ec8835052a84 41 *
phonemacro 0:ec8835052a84 42 *
phonemacro 0:ec8835052a84 43 * /// define the HVOUT Boost Voltage default for the MAX14720 PMIC
phonemacro 0:ec8835052a84 44 * #define HVOUT_VOLTAGE 4500 // set to 4500 mV
phonemacro 0:ec8835052a84 45 *
phonemacro 0:ec8835052a84 46 * /// define all I2C addresses
phonemacro 0:ec8835052a84 47 * #define MAX14720_I2C_SLAVE_ADDR (0x54)
phonemacro 0:ec8835052a84 48 * #define MAX30101_I2C_SLAVE_ADDR (0xAE)
phonemacro 0:ec8835052a84 49 *
phonemacro 0:ec8835052a84 50 * /// Settings for the HR initialization
phonemacro 0:ec8835052a84 51 * #define FIFO_WATERLEVEL_MARK 15
phonemacro 0:ec8835052a84 52 * #define SAMPLE_AVG 2
phonemacro 0:ec8835052a84 53 * #define SAMPLE_RATE 1
phonemacro 0:ec8835052a84 54 * #define PULSE_WIDTH 2
phonemacro 0:ec8835052a84 55 * #define RED_LED_CURRENT 0x1F
phonemacro 0:ec8835052a84 56 *
phonemacro 0:ec8835052a84 57 * /// Buffer size for streaming data out.
phonemacro 0:ec8835052a84 58 * #define BUFFER_LENGTH 50
phonemacro 0:ec8835052a84 59 *
phonemacro 0:ec8835052a84 60 *
phonemacro 0:ec8835052a84 61 * /// I2C Master 2
phonemacro 0:ec8835052a84 62 * I2C i2c2(I2C2_SDA, I2C2_SCL); // used by MAX14720, MAX30101, LIS2DH
phonemacro 0:ec8835052a84 63 * /// SPI Master 0 with SPI0_SS for use with MAX30001
phonemacro 0:ec8835052a84 64 * SPI spi(SPI0_MOSI, SPI0_MISO, SPI0_SCK, SPI0_SS); // used by MAX30001
phonemacro 0:ec8835052a84 65 *
phonemacro 0:ec8835052a84 66 * /// PMIC
phonemacro 0:ec8835052a84 67 * MAX14720 max14720(&i2c2, MAX14720_I2C_SLAVE_ADDR);
phonemacro 0:ec8835052a84 68 * /// Optical Oximeter
phonemacro 0:ec8835052a84 69 * MAX30101 max30101(&i2c2, MAX30101_I2C_SLAVE_ADDR);
phonemacro 0:ec8835052a84 70 * InterruptIn max30101_Interrupt(P4_0);
phonemacro 0:ec8835052a84 71 *
phonemacro 0:ec8835052a84 72 * //@brief Creating a buffer to hold the data
phonemacro 0:ec8835052a84 73 * uint32_t oxiBuffer[BUFFER_LENGTH];
phonemacro 0:ec8835052a84 74 * int oxiIndex = 0;
phonemacro 0:ec8835052a84 75 * char data_trigger = 0;
phonemacro 0:ec8835052a84 76 *
phonemacro 0:ec8835052a84 77 *
phonemacro 0:ec8835052a84 78 * //@brief Creates a packet that will be streamed via USB Serial
phonemacro 0:ec8835052a84 79 * //@brief the packet created will be inserted into a fifo to be streamed at a later time
phonemacro 0:ec8835052a84 80 * //@param id Streaming ID
phonemacro 0:ec8835052a84 81 * //@param buffer Pointer to a uint32 array that contains the data to include in the packet
phonemacro 0:ec8835052a84 82 * //@param number Number of elements in the buffer
phonemacro 0:ec8835052a84 83 * //
phonemacro 0:ec8835052a84 84 * void StreamPacketUint32_ex(uint32_t id, uint32_t *buffer, uint32_t number) {
phonemacro 0:ec8835052a84 85 * int i;
phonemacro 0:ec8835052a84 86 * if (id == MAX30101_OXIMETER_DATA + 1) {
phonemacro 0:ec8835052a84 87 *
phonemacro 0:ec8835052a84 88 * for (i = 0; i < number; i++) {
phonemacro 0:ec8835052a84 89 * oxiBuffer[oxiIndex] = buffer[i];
phonemacro 0:ec8835052a84 90 * oxiIndex++;
phonemacro 0:ec8835052a84 91 *
phonemacro 0:ec8835052a84 92 * if (oxiIndex > BUFFER_LENGTH)
phonemacro 0:ec8835052a84 93 * {
phonemacro 0:ec8835052a84 94 * data_trigger = 1;
phonemacro 0:ec8835052a84 95 * oxiIndex = 0;
phonemacro 0:ec8835052a84 96 * }
phonemacro 0:ec8835052a84 97 * }
phonemacro 0:ec8835052a84 98 * }
phonemacro 0:ec8835052a84 99 * }
phonemacro 0:ec8835052a84 100 *
phonemacro 0:ec8835052a84 101 * int main() {
phonemacro 0:ec8835052a84 102 * // hold results for returning functions
phonemacro 0:ec8835052a84 103 * int result;
phonemacro 0:ec8835052a84 104 *
phonemacro 0:ec8835052a84 105 * // initialize HVOUT on the MAX14720 PMIC
phonemacro 0:ec8835052a84 106 * result = max14720.init();
phonemacro 0:ec8835052a84 107 * if (result == MAX14720_ERROR){
phonemacro 0:ec8835052a84 108 * printf("Error initializing MAX14720");
phonemacro 0:ec8835052a84 109 * }
phonemacro 0:ec8835052a84 110 * max14720.boostEn = MAX14720::BOOST_ENABLED;
phonemacro 0:ec8835052a84 111 * max14720.boostSetVoltage(HVOUT_VOLTAGE);
phonemacro 0:ec8835052a84 112 *
phonemacro 0:ec8835052a84 113 * // MAX30101 initialize interrupt
phonemacro 0:ec8835052a84 114 * max30101.onDataAvailable(&StreamPacketUint32_ex);
phonemacro 0:ec8835052a84 115 * max30101_Interrupt.fall(&MAX30101::MAX30101MidIntHandler);
phonemacro 0:ec8835052a84 116 *
phonemacro 0:ec8835052a84 117 * // This is the HR mode only (IR LED only)
phonemacro 0:ec8835052a84 118 * max30101.HRmode_init(FIFO_WATERLEVEL_MARK, SAMPLE_AVG, SAMPLE_RATE,PULSE_WIDTH, RED_LED_CURRENT);
phonemacro 0:ec8835052a84 119 *
phonemacro 0:ec8835052a84 120 * printf("Please wait for data to start streaming\n");
phonemacro 0:ec8835052a84 121 * fflush(stdout);
phonemacro 0:ec8835052a84 122 *
phonemacro 0:ec8835052a84 123 * while (1) {
phonemacro 0:ec8835052a84 124 * if(data_trigger == 1)
phonemacro 0:ec8835052a84 125 * {
phonemacro 0:ec8835052a84 126 * printf("%ld ", oxiBuffer[oxiIndex]); // Print the ECG data on a serial port terminal software
phonemacro 0:ec8835052a84 127 * fflush(stdout);
phonemacro 0:ec8835052a84 128 * }
phonemacro 0:ec8835052a84 129 * }
phonemacro 0:ec8835052a84 130 * }
phonemacro 0:ec8835052a84 131 * @endcode
phonemacro 0:ec8835052a84 132 *
phonemacro 0:ec8835052a84 133 */
phonemacro 0:ec8835052a84 134
phonemacro 0:ec8835052a84 135 #ifndef _MAX30101_H_
phonemacro 0:ec8835052a84 136 #define _MAX30101_H_
phonemacro 0:ec8835052a84 137
phonemacro 0:ec8835052a84 138 #include "mbed.h"
phonemacro 0:ec8835052a84 139
phonemacro 0:ec8835052a84 140 #define MAX30101_RAW_DATA_SIZE 3 * 4 * 32
phonemacro 0:ec8835052a84 141 #define MAX30101_PROC_DATA_SIZE 4 * 32
phonemacro 0:ec8835052a84 142
phonemacro 0:ec8835052a84 143 #define MAX30101_OXIMETER_DATA 0x10
phonemacro 0:ec8835052a84 144
phonemacro 0:ec8835052a84 145 #define CHUNK_SIZE 252
phonemacro 0:ec8835052a84 146
phonemacro 0:ec8835052a84 147 ///< MAX30101 Register addresses
phonemacro 0:ec8835052a84 148
phonemacro 0:ec8835052a84 149 #define MAX30101_INT_PORT 4
phonemacro 0:ec8835052a84 150 #define MAX30101_INT_PIN 0
phonemacro 0:ec8835052a84 151 #define MAX30101_MASTER_NUM 2
phonemacro 0:ec8835052a84 152
phonemacro 0:ec8835052a84 153 /**
phonemacro 0:ec8835052a84 154 * Maxim Integrated MAX30101 Oximeter chip
phonemacro 0:ec8835052a84 155 */
phonemacro 0:ec8835052a84 156 class MAX30101 {
phonemacro 0:ec8835052a84 157 public:
phonemacro 0:ec8835052a84 158 float max30101_final_temp; ///< Global declaration
phonemacro 0:ec8835052a84 159 uint32_t max30101_buffer[MAX30101_PROC_DATA_SIZE]; ///< final Processed data
phonemacro 0:ec8835052a84 160 char max30101_rawData[MAX30101_RAW_DATA_SIZE]; ///< raw data from the chip
phonemacro 0:ec8835052a84 161
phonemacro 0:ec8835052a84 162 typedef enum { ///< MAX30101 Register addresses
phonemacro 0:ec8835052a84 163
phonemacro 0:ec8835052a84 164 ///< Status
phonemacro 0:ec8835052a84 165 REG_INT_STAT_1 = 0x00,
phonemacro 0:ec8835052a84 166 REG_INT_STAT_2 = 0x01,
phonemacro 0:ec8835052a84 167 REG_INT_EN_1 = 0x02,
phonemacro 0:ec8835052a84 168 REG_INT_EN_2 = 0x03,
phonemacro 0:ec8835052a84 169
phonemacro 0:ec8835052a84 170 REG_FIFO_W_PTR = 0x04,
phonemacro 0:ec8835052a84 171 REG_FIFO_OVF_CNT = 0x05,
phonemacro 0:ec8835052a84 172 REG_FIFO_R_PTR = 0x06,
phonemacro 0:ec8835052a84 173 REG_FIFO_DATA = 0x07,
phonemacro 0:ec8835052a84 174 ///< Configuration
phonemacro 0:ec8835052a84 175 REG_FIFO_CFG = 0x08,
phonemacro 0:ec8835052a84 176 REG_MODE_CFG = 0x09,
phonemacro 0:ec8835052a84 177 REG_SPO2_CFG = 0x0A,
phonemacro 0:ec8835052a84 178 REG_LED1_PA = 0x0C,
phonemacro 0:ec8835052a84 179 REG_LED2_PA = 0x0D,
phonemacro 0:ec8835052a84 180 REG_LED3_PA = 0x0E,
phonemacro 0:ec8835052a84 181 REG_PILOT_PA = 0x10,
phonemacro 0:ec8835052a84 182 REG_SLT2_SLT1 = 0x11,
phonemacro 0:ec8835052a84 183 REG_SLT4_SLT3 = 0x12,
phonemacro 0:ec8835052a84 184 ///< Die Temp
phonemacro 0:ec8835052a84 185 REG_TINT = 0x1F,
phonemacro 0:ec8835052a84 186 REG_TFRAC = 0x20,
phonemacro 0:ec8835052a84 187 REG_TEMP_EN = 0x21,
phonemacro 0:ec8835052a84 188 ///< Proximity Func
phonemacro 0:ec8835052a84 189 REG_PROX_INT_THR = 0x30,
phonemacro 0:ec8835052a84 190 /* Part ID */
phonemacro 0:ec8835052a84 191 REG_REV_ID = 0xFE,
phonemacro 0:ec8835052a84 192 REG_ID = 0xFF,
phonemacro 0:ec8835052a84 193 } MAX30101_REG_map_t;
phonemacro 0:ec8835052a84 194
phonemacro 0:ec8835052a84 195 /**********/
phonemacro 0:ec8835052a84 196 /* STATUS */
phonemacro 0:ec8835052a84 197 /**********/
phonemacro 0:ec8835052a84 198 /// @brief STATUS1 (0x00)
phonemacro 0:ec8835052a84 199 typedef union max30101_Interrupt_Status_1_reg {
phonemacro 0:ec8835052a84 200 char all;
phonemacro 0:ec8835052a84 201 struct {
phonemacro 0:ec8835052a84 202 char pwr_rdy : 1;
phonemacro 0:ec8835052a84 203 char reserved : 3;
phonemacro 0:ec8835052a84 204 char prox_int : 1;
phonemacro 0:ec8835052a84 205 char alc_ovf : 1;
phonemacro 0:ec8835052a84 206 char ppg_rdy : 1;
phonemacro 0:ec8835052a84 207 char a_full : 1;
phonemacro 0:ec8835052a84 208 } bit;
phonemacro 0:ec8835052a84 209 } max30101_Interrupt_Status_1_t;
phonemacro 0:ec8835052a84 210
phonemacro 0:ec8835052a84 211 /// @brief STATUS2 (0x01)
phonemacro 0:ec8835052a84 212 typedef union max30101_Interrupt_Status_2_reg {
phonemacro 0:ec8835052a84 213 char all;
phonemacro 0:ec8835052a84 214 struct {
phonemacro 0:ec8835052a84 215 char reserved1 : 1;
phonemacro 0:ec8835052a84 216 char die_temp_rdy : 1;
phonemacro 0:ec8835052a84 217 char reserved2 : 6;
phonemacro 0:ec8835052a84 218 } bit;
phonemacro 0:ec8835052a84 219 } max30101_Interrupt_Status_2_t;
phonemacro 0:ec8835052a84 220
phonemacro 0:ec8835052a84 221 /// @brief INTERRUPT_ENABLE1 (0x02)
phonemacro 0:ec8835052a84 222 typedef union max30101_Interrupt_Enable_1_reg {
phonemacro 0:ec8835052a84 223 char all;
phonemacro 0:ec8835052a84 224 struct {
phonemacro 0:ec8835052a84 225 char reserved1 : 4;
phonemacro 0:ec8835052a84 226 char prox_int_en : 1;
phonemacro 0:ec8835052a84 227 char alc_ovf_en : 1;
phonemacro 0:ec8835052a84 228 char ppg_rdy_en : 1;
phonemacro 0:ec8835052a84 229 char a_full_en : 1;
phonemacro 0:ec8835052a84 230 } bit;
phonemacro 0:ec8835052a84 231 } max30101_Interrupt_Enable_1_t;
phonemacro 0:ec8835052a84 232
phonemacro 0:ec8835052a84 233 /// @brief INTERRUPT_ENABLE2 (0x03)
phonemacro 0:ec8835052a84 234 typedef union max30101_Interrupt_Enable_2_reg {
phonemacro 0:ec8835052a84 235 char all;
phonemacro 0:ec8835052a84 236 struct {
phonemacro 0:ec8835052a84 237 char reserved1 : 1;
phonemacro 0:ec8835052a84 238 char die_temp_rdy_en : 1;
phonemacro 0:ec8835052a84 239 char reserved2 : 6;
phonemacro 0:ec8835052a84 240 } bit;
phonemacro 0:ec8835052a84 241 } max30101_Interrupt_Enable_2_t;
phonemacro 0:ec8835052a84 242
phonemacro 0:ec8835052a84 243 /*********/
phonemacro 0:ec8835052a84 244 /* FIFO */
phonemacro 0:ec8835052a84 245 /*********/
phonemacro 0:ec8835052a84 246 // 0x04
phonemacro 0:ec8835052a84 247 /// @brief FIFO_WR_PTR (0x04)
phonemacro 0:ec8835052a84 248 typedef union max30101_fifo_wr_ptr_reg {
phonemacro 0:ec8835052a84 249 char all;
phonemacro 0:ec8835052a84 250 struct {
phonemacro 0:ec8835052a84 251 char fifo_wr_ptr : 5;
phonemacro 0:ec8835052a84 252 char reserved1 : 3;
phonemacro 0:ec8835052a84 253 } bit;
phonemacro 0:ec8835052a84 254 } max30101_fifo_wr_ptr_t;
phonemacro 0:ec8835052a84 255
phonemacro 0:ec8835052a84 256 /// @brief OVF_COUNTER (0x05)
phonemacro 0:ec8835052a84 257 typedef union max30101_ovf_counter_reg {
phonemacro 0:ec8835052a84 258 char all;
phonemacro 0:ec8835052a84 259 struct {
phonemacro 0:ec8835052a84 260 char fifo_ovf_counter : 5;
phonemacro 0:ec8835052a84 261 char reserved1 : 3;
phonemacro 0:ec8835052a84 262 } bit;
phonemacro 0:ec8835052a84 263 } max30101_ovf_counter_reg_t;
phonemacro 0:ec8835052a84 264
phonemacro 0:ec8835052a84 265 /// @brief FIFO_READ_PTR (0x06)
phonemacro 0:ec8835052a84 266 typedef union max30101_fifo_rd_ptr_reg {
phonemacro 0:ec8835052a84 267 char all;
phonemacro 0:ec8835052a84 268 struct {
phonemacro 0:ec8835052a84 269 char fifo_rd_ptr : 5;
phonemacro 0:ec8835052a84 270 char reserved1 : 3;
phonemacro 0:ec8835052a84 271 } bit;
phonemacro 0:ec8835052a84 272 } max30101_fifo_rd_ptr_t;
phonemacro 0:ec8835052a84 273
phonemacro 0:ec8835052a84 274 /********************/
phonemacro 0:ec8835052a84 275 /* Configuration */
phonemacro 0:ec8835052a84 276 /********************/
phonemacro 0:ec8835052a84 277 // 0x08
phonemacro 0:ec8835052a84 278 /// @brief FIFO_CONFIGURATION (0x08)
phonemacro 0:ec8835052a84 279 typedef union max30101_fifo_configuration_reg {
phonemacro 0:ec8835052a84 280 char all;
phonemacro 0:ec8835052a84 281 struct {
phonemacro 0:ec8835052a84 282 char fifo_a_full : 4;
phonemacro 0:ec8835052a84 283 char fifo_roll_over_en : 1;
phonemacro 0:ec8835052a84 284 char smp_ave : 3;
phonemacro 0:ec8835052a84 285 } bit;
phonemacro 0:ec8835052a84 286 } max30101_fifo_configuration_t;
phonemacro 0:ec8835052a84 287
phonemacro 0:ec8835052a84 288 /// @brief MODE_CONFIGURATION (0x09)
phonemacro 0:ec8835052a84 289 typedef union max30101_mode_configuration_reg {
phonemacro 0:ec8835052a84 290 char all;
phonemacro 0:ec8835052a84 291 struct {
phonemacro 0:ec8835052a84 292 char mode : 3;
phonemacro 0:ec8835052a84 293 char reserved1 : 3;
phonemacro 0:ec8835052a84 294 char reset : 1;
phonemacro 0:ec8835052a84 295 char shdn : 1;
phonemacro 0:ec8835052a84 296 } bit;
phonemacro 0:ec8835052a84 297 } max30101_mode_configuration_t;
phonemacro 0:ec8835052a84 298
phonemacro 0:ec8835052a84 299 /// @brief SPO2_CONGIGURATION (0x0A)
phonemacro 0:ec8835052a84 300 typedef union max30101_spo2_configuration_reg {
phonemacro 0:ec8835052a84 301 char all;
phonemacro 0:ec8835052a84 302 struct {
phonemacro 0:ec8835052a84 303 char led_pw : 2;
phonemacro 0:ec8835052a84 304 char spo2_sr : 3;
phonemacro 0:ec8835052a84 305 char spo2_adc_rge : 2;
phonemacro 0:ec8835052a84 306 char reserved1 : 1;
phonemacro 0:ec8835052a84 307 } bit;
phonemacro 0:ec8835052a84 308 } max30101_spo2_configuration_t;
phonemacro 0:ec8835052a84 309
phonemacro 0:ec8835052a84 310 typedef union max30101_multiLED_mode_ctrl_1_reg {
phonemacro 0:ec8835052a84 311 char all;
phonemacro 0:ec8835052a84 312 struct {
phonemacro 0:ec8835052a84 313 char slot1 : 3;
phonemacro 0:ec8835052a84 314 char reserved : 1;
phonemacro 0:ec8835052a84 315 char slot2 : 3;
phonemacro 0:ec8835052a84 316 char reserved1 : 1;
phonemacro 0:ec8835052a84 317 } bit;
phonemacro 0:ec8835052a84 318 } max30101_multiLED_mode_ctrl_1_t;
phonemacro 0:ec8835052a84 319
phonemacro 0:ec8835052a84 320 typedef union max30101_multiLED_mode_ctrl_2_reg {
phonemacro 0:ec8835052a84 321 char all;
phonemacro 0:ec8835052a84 322 struct {
phonemacro 0:ec8835052a84 323 char slot3 : 3;
phonemacro 0:ec8835052a84 324 char reserved : 1;
phonemacro 0:ec8835052a84 325 char slot4 : 3;
phonemacro 0:ec8835052a84 326 char reserved1 : 1;
phonemacro 0:ec8835052a84 327 } bit;
phonemacro 0:ec8835052a84 328 } max30101_multiLED_mode_ctrl_2_t;
phonemacro 0:ec8835052a84 329
phonemacro 0:ec8835052a84 330 /********************/
phonemacro 0:ec8835052a84 331 /* Die Temperature */
phonemacro 0:ec8835052a84 332 /********************/
phonemacro 0:ec8835052a84 333
phonemacro 0:ec8835052a84 334 char max30101_tinit;
phonemacro 0:ec8835052a84 335
phonemacro 0:ec8835052a84 336 char max30101_tfrac;
phonemacro 0:ec8835052a84 337
phonemacro 0:ec8835052a84 338 typedef union max30101_die_temp_config {
phonemacro 0:ec8835052a84 339 char all;
phonemacro 0:ec8835052a84 340 struct {
phonemacro 0:ec8835052a84 341 char temp_en : 1;
phonemacro 0:ec8835052a84 342 char reserved : 7;
phonemacro 0:ec8835052a84 343 } bit;
phonemacro 0:ec8835052a84 344 } max30101_die_temp_config_t;
phonemacro 0:ec8835052a84 345
phonemacro 0:ec8835052a84 346 /***** Function Prototypes *****/
phonemacro 0:ec8835052a84 347
phonemacro 0:ec8835052a84 348 char max30101_prox_int_thresh;
phonemacro 0:ec8835052a84 349
phonemacro 0:ec8835052a84 350 /**
phonemacro 0:ec8835052a84 351 * @brief MAX30101 constructor.
phonemacro 0:ec8835052a84 352 * @param sda mbed pin to use for SDA line of I2C interface.
phonemacro 0:ec8835052a84 353 * @param scl mbed pin to use for SCL line of I2C interface.
phonemacro 0:ec8835052a84 354 */
phonemacro 0:ec8835052a84 355 MAX30101(PinName sda, PinName scl, int slaveAddress);
phonemacro 0:ec8835052a84 356
phonemacro 0:ec8835052a84 357 /**
phonemacro 0:ec8835052a84 358 * @brief MAX30101 constructor.
phonemacro 0:ec8835052a84 359 * @param i2c I2C object to use.
phonemacro 0:ec8835052a84 360 */
phonemacro 0:ec8835052a84 361 MAX30101(I2C *i2c, int slaveAddress);
phonemacro 0:ec8835052a84 362
phonemacro 0:ec8835052a84 363 /**
phonemacro 0:ec8835052a84 364 * @brief MAX30101 destructor.
phonemacro 0:ec8835052a84 365 */
phonemacro 0:ec8835052a84 366 ~MAX30101(void);
phonemacro 0:ec8835052a84 367
phonemacro 0:ec8835052a84 368 /**
phonemacro 0:ec8835052a84 369 * @brief Allows reading from MAX30101 register
phonemacro 0:ec8835052a84 370 * @param reg: is the register address, to read from (look at max30101.h and the
phonemacro 0:ec8835052a84 371 * data sheet for details)
phonemacro 0:ec8835052a84 372 * @param value: is the pointer to the value read from the register
phonemacro 0:ec8835052a84 373 * @returns 0-if no error. A non-zero value indicates an error.
phonemacro 0:ec8835052a84 374 */
phonemacro 0:ec8835052a84 375 int i2c_reg_read(MAX30101_REG_map_t reg, char *value);
phonemacro 0:ec8835052a84 376
phonemacro 0:ec8835052a84 377 /**
phonemacro 0:ec8835052a84 378 * @brief Allows writing to MAX30101 register
phonemacro 0:ec8835052a84 379 * @param reg: is the register address, to read from (look at max30101.h and
phonemacro 0:ec8835052a84 380 * the data sheet for details)
phonemacro 0:ec8835052a84 381 * @param value: is the value to write to the register
phonemacro 0:ec8835052a84 382 * @returns 0-if if no error. A non-zero value indicates an error.
phonemacro 0:ec8835052a84 383 */
phonemacro 0:ec8835052a84 384 int i2c_reg_write(MAX30101_REG_map_t reg, char value);
phonemacro 0:ec8835052a84 385
phonemacro 0:ec8835052a84 386 /**
phonemacro 0:ec8835052a84 387 * @brief This function sets up for the SpO2 mode. The data is returned in
phonemacro 0:ec8835052a84 388 * the callback function
phonemacro 0:ec8835052a84 389 * @brief max30101_int_handler in global array: buffer[]. SP mode handles two LED (Red,IR) data. Hence it
phonemacro 0:ec8835052a84 390 * @brief can fill up the FIFO up to a maximum of 3bytes/sample x 32 x 2 = 192bytes.
phonemacro 0:ec8835052a84 391 * @param fifo_waterlevel_mark: corresponds to FIFO_A_FULL, In FIFO Configuration Register (0x08)
phonemacro 0:ec8835052a84 392 * @param sample_avg: corresponds to SMP_AVE, in FIFO Configuration Register (0x08)
phonemacro 0:ec8835052a84 393 * @param sample_rate: corresponds to SPO2_SR, IN SpO2 Configuration Register (0x0A)
phonemacro 0:ec8835052a84 394 * @param pulse_width: corresponds to LED_PW in SpO2 Configuration register(0x0A)
phonemacro 0:ec8835052a84 395 * @param red_led_current: corresponds to LED1_PA register (0x0C). Please see data sheet for values
phonemacro 0:ec8835052a84 396 * @param ir_led_current: corresponds to LED2_PA register (0x0D). Please see data sheet for values
phonemacro 0:ec8835052a84 397 * @returns 0-if everything is good. A non-zero value indicates an error.
phonemacro 0:ec8835052a84 398 */
phonemacro 0:ec8835052a84 399 int SpO2mode_init(uint8_t fifo_waterlevel_mark, uint8_t sample_avg,
phonemacro 0:ec8835052a84 400 uint8_t sample_rate, uint8_t pulse_width,
phonemacro 0:ec8835052a84 401 uint8_t red_led_current, uint8_t ir_led_current);
phonemacro 0:ec8835052a84 402
phonemacro 0:ec8835052a84 403 /**
phonemacro 0:ec8835052a84 404 * @brief This function will stop the SpO2 mode and turn off all operating LED�s.
phonemacro 0:ec8835052a84 405 * @return 0-if if no error. A non-zero value indicates an error.
phonemacro 0:ec8835052a84 406 */
phonemacro 0:ec8835052a84 407 int SpO2mode_stop(void);
phonemacro 0:ec8835052a84 408
phonemacro 0:ec8835052a84 409 /**
phonemacro 0:ec8835052a84 410 * @brief This function sets up for the HR mode. The data is returned in thecallback function
phonemacro 0:ec8835052a84 411 * @brief max30101_int_handler in global array: buffer[].HR mode handles one LED (Red) data. Hence it can fill
phonemacro 0:ec8835052a84 412 * @brief up the FIFO up to a maximum of 3bytes/sample x 32 = 96bytes.
phonemacro 0:ec8835052a84 413 * @brief fifo_waterlevel_mark: corresponds to FIFO_A_FULL, In FIFO Configuration Register (0x08)
phonemacro 0:ec8835052a84 414 * @param sample_avg: corresponds to SMP_AVE, in FIFO Configuration Register (0x08)
phonemacro 0:ec8835052a84 415 * @param sample_rate:corresponds to SPO2_SR, IN SpO2 Configuration Register (0x0A)
phonemacro 0:ec8835052a84 416 * @param pulse_width: corresponds to LED_PW in SpO2 Configuration Register(0x0A)
phonemacro 0:ec8835052a84 417 * @param red_led_current: corresponds to LED1_PA register (0x0C). Please see data sheet for values
phonemacro 0:ec8835052a84 418 * @returns 0-if if no error. A non-zero value indicates an error.
phonemacro 0:ec8835052a84 419 */
phonemacro 0:ec8835052a84 420 int HRmode_init(uint8_t fifo_waterlevel_mark, uint8_t sample_avg,
phonemacro 0:ec8835052a84 421 uint8_t sample_rate, uint8_t pulse_width,
phonemacro 0:ec8835052a84 422 uint8_t red_led_current);
phonemacro 0:ec8835052a84 423
phonemacro 0:ec8835052a84 424 /**
phonemacro 0:ec8835052a84 425 * @brief This function will stop the HR mode and turn off all operating
phonemacro 0:ec8835052a84 426 * LED’s.
phonemacro 0:ec8835052a84 427 * @return 0-if if no error. A non-zero value indicates an error.
phonemacro 0:ec8835052a84 428 */
phonemacro 0:ec8835052a84 429 int HRmode_stop(void);
phonemacro 0:ec8835052a84 430
phonemacro 0:ec8835052a84 431 /**
phonemacro 0:ec8835052a84 432 *@brief This function sets up for the Multi-mode. The data is returned in the callback function max30101_int_handler in global array:
phonemacro 0:ec8835052a84 433 *@brief buffer[]. Multi-LED mode can handle 1 to 4 LED combinations. Hence it can fill up the FIFO up to a maximum of
phonemacro 0:ec8835052a84 434 *@brief 3bytes/sample x 32 x 4 = 384bytes.
phonemacro 0:ec8835052a84 435 *@param fifo_waterlevel_mark: corresponds to FIFO_A_FULL, In FIFO Configuration Register (0x08)
phonemacro 0:ec8835052a84 436 *@param sample_avg: corresponds to SMP_AVE, in FIFO Configuration Register (0x08)
phonemacro 0:ec8835052a84 437 *@param sample_rate:corresponds to SPO2_SR, IN SpO2 Configuration Register (0x0A)
phonemacro 0:ec8835052a84 438 *@param pulse_width: corresponds to LED_PW in SpO2 Configuration register(0x0A)
phonemacro 0:ec8835052a84 439 *@param red_led_current: corresponds to LED1_PA register (0x0C). Please see data sheet for values
phonemacro 0:ec8835052a84 440 *@param ir_led_current: corresponds to LED2_PA register (0x0D). Please see data sheet for values
phonemacro 0:ec8835052a84 441 *@param green_led_current: corresponds to LED3_PA register (0x0E). Please see data sheet for values
phonemacro 0:ec8835052a84 442 *@param slot_1,…,slot_4: corresponds to Multi-LED Mode control Registers (0x11-0x12).
phonemacro 0:ec8835052a84 443 *@returns 0-if if no error. A non-zero value indicates an error.
phonemacro 0:ec8835052a84 444 */
phonemacro 0:ec8835052a84 445 int Multimode_init(uint8_t fifo_waterlevel_mark, uint8_t sample_avg,
phonemacro 0:ec8835052a84 446 uint8_t sample_rate, uint8_t pulse_width,
phonemacro 0:ec8835052a84 447 uint8_t red_led_current, uint8_t ir_led_current,
phonemacro 0:ec8835052a84 448 uint8_t green_led_current, uint8_t slot_1, uint8_t slot_2,
phonemacro 0:ec8835052a84 449 uint8_t slot_3, uint8_t slot_4);
phonemacro 0:ec8835052a84 450
phonemacro 0:ec8835052a84 451 /**
phonemacro 0:ec8835052a84 452 * @brief This function will stop the Multi-mode and turn off all operating LED’s.
phonemacro 0:ec8835052a84 453 * @returns 0-if if no error. A non-zero value indicates an error.
phonemacro 0:ec8835052a84 454 */
phonemacro 0:ec8835052a84 455 int Multimode_stop(void);
phonemacro 0:ec8835052a84 456
phonemacro 0:ec8835052a84 457 /**
phonemacro 0:ec8835052a84 458 * @brief This is a function that sets up for temperature read and should be called after one of the mode
phonemacro 0:ec8835052a84 459 * @brief has been setup. The data is returned in the callback function max30101_int_handler. This
phonemacro 0:ec8835052a84 460 * @brief function needs to be called every time temperature reading is required.
phonemacro 0:ec8835052a84 461 * @brief Call the temp function after one of the MODES have been started
phonemacro 0:ec8835052a84 462 * @brief Note that the temp is disabled after one read... also, it is not necessary
phonemacro 0:ec8835052a84 463 * @brief to read the temp frequently...
phonemacro 0:ec8835052a84 464 * @returns 0-if if no error. A non-zero value indicates an error.
phonemacro 0:ec8835052a84 465 */
phonemacro 0:ec8835052a84 466 int tempread(void);
phonemacro 0:ec8835052a84 467
phonemacro 0:ec8835052a84 468 /**
phonemacro 0:ec8835052a84 469 *@brief This is a callback function which collects the data from the FIFO of the MAX30101 in a 32-bit
phonemacro 0:ec8835052a84 470 *@brief unsigned global array called max30101_buffer[]. Upon every interrupt from the MAX30101, this
phonemacro 0:ec8835052a84 471 *@brief function is called to service the FIFO of the MAX30101. This callback function also services the
phonemacro 0:ec8835052a84 472 *@brief interrupt for the temp data. The temp data is collected in a floating point global variable
phonemacro 0:ec8835052a84 473 *@brief final_temp.
phonemacro 0:ec8835052a84 474 *@param max30101_buffer[], global uint32_t
phonemacro 0:ec8835052a84 475 *@returns 0-if everything is good. A non-zero value indicates an error.
phonemacro 0:ec8835052a84 476 */
phonemacro 0:ec8835052a84 477 int int_handler(void);
phonemacro 0:ec8835052a84 478
phonemacro 0:ec8835052a84 479 /**
phonemacro 0:ec8835052a84 480 * @brief encapsulates the int_handler above
phonemacro 0:ec8835052a84 481 */
phonemacro 0:ec8835052a84 482 static void MidIntHandler(void);
phonemacro 0:ec8835052a84 483
phonemacro 0:ec8835052a84 484 /**
phonemacro 0:ec8835052a84 485 * @brief type definition for data interrupt
phonemacro 0:ec8835052a84 486 */
phonemacro 0:ec8835052a84 487 typedef void (*DataCallbackFunction)(uint32_t id, uint32_t *buffer,
phonemacro 0:ec8835052a84 488 uint32_t length);
phonemacro 0:ec8835052a84 489 /**
phonemacro 0:ec8835052a84 490 * @brief type definition for general interrupt
phonemacro 0:ec8835052a84 491 */
phonemacro 0:ec8835052a84 492 typedef void (*InterruptFunction)();
phonemacro 0:ec8835052a84 493
phonemacro 0:ec8835052a84 494 /**
phonemacro 0:ec8835052a84 495 * @brief Used to connect a callback for when interrupt data is available
phonemacro 0:ec8835052a84 496 */
phonemacro 0:ec8835052a84 497 void onInterrupt(InterruptFunction _onInterrupt);
phonemacro 0:ec8835052a84 498
phonemacro 0:ec8835052a84 499 /**
phonemacro 0:ec8835052a84 500 * @brief Used to connect a callback for when interrupt data is available
phonemacro 0:ec8835052a84 501 */
phonemacro 0:ec8835052a84 502 void onDataAvailable(DataCallbackFunction _onDataAvailable);
phonemacro 0:ec8835052a84 503
phonemacro 0:ec8835052a84 504 static MAX30101 *instance;
phonemacro 0:ec8835052a84 505
phonemacro 0:ec8835052a84 506 private:
phonemacro 0:ec8835052a84 507 /**
phonemacro 0:ec8835052a84 508 * @brief Used to notify an external function that interrupt data is available
phonemacro 0:ec8835052a84 509 * @param id type of data available
phonemacro 0:ec8835052a84 510 * @param buffer 32-bit buffer that points to the data
phonemacro 0:ec8835052a84 511 * @param length length of 32-bit elements available
phonemacro 0:ec8835052a84 512 */
phonemacro 0:ec8835052a84 513 void dataAvailable(uint32_t id, uint32_t *buffer, uint32_t length);
phonemacro 0:ec8835052a84 514
phonemacro 0:ec8835052a84 515
phonemacro 0:ec8835052a84 516 /**
phonemacro 0:ec8835052a84 517 * @brief Executed on interrupt (callback function at the end of the interrupt)
phonemacro 0:ec8835052a84 518 * @param id type of data available
phonemacro 0:ec8835052a84 519 * @param buffer 32-bit buffer that points to the data
phonemacro 0:ec8835052a84 520 * @param length length of 32-bit elements available
phonemacro 0:ec8835052a84 521 */
phonemacro 0:ec8835052a84 522 void interruptPostCallback(void);
phonemacro 0:ec8835052a84 523
phonemacro 0:ec8835052a84 524 /// callback function when interrupt data is available
phonemacro 0:ec8835052a84 525 DataCallbackFunction onDataAvailableCallback;
phonemacro 0:ec8835052a84 526
phonemacro 0:ec8835052a84 527 /// callback function when interrupt data is available
phonemacro 0:ec8835052a84 528 InterruptFunction onInterruptCallback;
phonemacro 0:ec8835052a84 529
phonemacro 0:ec8835052a84 530 /**
phonemacro 0:ec8835052a84 531 * @brief Read from an I2C device (Read I2c wrapper method)
phonemacro 0:ec8835052a84 532 * @param slaveAddress slave address to use with transaction
phonemacro 0:ec8835052a84 533 * @param writeData pointer of data to write
phonemacro 0:ec8835052a84 534 * @param writeCount number of data to write
phonemacro 0:ec8835052a84 535 * @param readData pointer to buffer to read to
phonemacro 0:ec8835052a84 536 * @param readCount number of bytes to read
phonemacro 0:ec8835052a84 537 */
phonemacro 0:ec8835052a84 538
phonemacro 0:ec8835052a84 539 int I2CM_Read(int slaveAddress, char *writeData, char writeCount, char *readData, char readCount);
phonemacro 0:ec8835052a84 540
phonemacro 0:ec8835052a84 541 /**
phonemacro 0:ec8835052a84 542 * @brief Write to an I2C device (I2C wrapper method)
phonemacro 0:ec8835052a84 543 * @param slaveAddress slave address to use with transaction
phonemacro 0:ec8835052a84 544 * @param writeData1 pointer of data to write
phonemacro 0:ec8835052a84 545 * @param writeCount1 number of data to write
phonemacro 0:ec8835052a84 546 * @param writeData2 pointer to buffer to read to
phonemacro 0:ec8835052a84 547 * @param writeCount2 number of bytes to read
phonemacro 0:ec8835052a84 548 */
phonemacro 0:ec8835052a84 549 int I2CM_Write(int slaveAddress, char *writeData1, char writeCount1, char *writeData2, char writeCount2);
phonemacro 0:ec8835052a84 550
phonemacro 0:ec8835052a84 551 /// @brief pointer to I2C object
phonemacro 0:ec8835052a84 552 I2C *i2c;
phonemacro 0:ec8835052a84 553
phonemacro 0:ec8835052a84 554 /// @brief flag to track if this object is the owner (created) the I2C object
phonemacro 0:ec8835052a84 555 bool i2c_owner;
phonemacro 0:ec8835052a84 556
phonemacro 0:ec8835052a84 557 /// @brief Device slave address
phonemacro 0:ec8835052a84 558 int slaveAddress;
phonemacro 0:ec8835052a84 559 };
phonemacro 0:ec8835052a84 560
phonemacro 0:ec8835052a84 561 /**
phonemacro 0:ec8835052a84 562 * @brief Resets the I2C block, when needed
phonemacro 0:ec8835052a84 563 */
phonemacro 0:ec8835052a84 564 extern void I2CM_Init_Reset(uint8_t index, int speed);
phonemacro 0:ec8835052a84 565
phonemacro 0:ec8835052a84 566
phonemacro 0:ec8835052a84 567
phonemacro 0:ec8835052a84 568 #endif /* _MAX30101_H_ */