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

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
phonemacro 0:ec8835052a84 34 #include "mbed.h"
phonemacro 0:ec8835052a84 35 #include "MAX30101.h"
phonemacro 0:ec8835052a84 36
phonemacro 0:ec8835052a84 37 MAX30101 *MAX30101::instance = NULL;
phonemacro 0:ec8835052a84 38
phonemacro 0:ec8835052a84 39 //******************************************************************************
phonemacro 0:ec8835052a84 40 MAX30101::MAX30101(PinName sda, PinName scl, int slaveAddress):
phonemacro 0:ec8835052a84 41 slaveAddress(slaveAddress) {
phonemacro 0:ec8835052a84 42 i2c = new I2C(sda, scl);
phonemacro 0:ec8835052a84 43 i2c_owner = true;
phonemacro 0:ec8835052a84 44 i2c->frequency(400000);
phonemacro 0:ec8835052a84 45 onInterruptCallback = NULL;
phonemacro 0:ec8835052a84 46 onDataAvailableCallback = NULL;
phonemacro 0:ec8835052a84 47 instance = this;
phonemacro 0:ec8835052a84 48 }
phonemacro 0:ec8835052a84 49
phonemacro 0:ec8835052a84 50 //******************************************************************************
phonemacro 0:ec8835052a84 51 MAX30101::MAX30101(I2C *_i2c, int slaveAddress) :
phonemacro 0:ec8835052a84 52 slaveAddress(slaveAddress) {
phonemacro 0:ec8835052a84 53 i2c = _i2c;
phonemacro 0:ec8835052a84 54 i2c_owner = false;
phonemacro 0:ec8835052a84 55 i2c->frequency(400000);
phonemacro 0:ec8835052a84 56 onInterruptCallback = NULL;
phonemacro 0:ec8835052a84 57 onDataAvailableCallback = NULL;
phonemacro 0:ec8835052a84 58 instance = this;
phonemacro 0:ec8835052a84 59 }
phonemacro 0:ec8835052a84 60
phonemacro 0:ec8835052a84 61 //******************************************************************************
phonemacro 0:ec8835052a84 62 MAX30101::~MAX30101(void) {
phonemacro 0:ec8835052a84 63 if (i2c_owner) {
phonemacro 0:ec8835052a84 64 delete i2c;
phonemacro 0:ec8835052a84 65 }
phonemacro 0:ec8835052a84 66 }
phonemacro 0:ec8835052a84 67
phonemacro 0:ec8835052a84 68 //******************************************************************************
phonemacro 0:ec8835052a84 69 int MAX30101::int_handler(void) {
phonemacro 0:ec8835052a84 70 uint16_t index, i;
phonemacro 0:ec8835052a84 71 uint16_t rx_bytes, second_rx_bytes;
phonemacro 0:ec8835052a84 72 char temp_int;
phonemacro 0:ec8835052a84 73 char temp_frac;
phonemacro 0:ec8835052a84 74 uint16_t num_active_led;
phonemacro 0:ec8835052a84 75 uint32_t sample;
phonemacro 0:ec8835052a84 76 int loop = 1;
phonemacro 0:ec8835052a84 77 static uint8_t cntr_int = 0;
phonemacro 0:ec8835052a84 78
phonemacro 0:ec8835052a84 79 max30101_Interrupt_Status_1_t Interrupt_Status_1;
phonemacro 0:ec8835052a84 80 max30101_Interrupt_Status_2_t Interrupt_Status_2;
phonemacro 0:ec8835052a84 81 max30101_mode_configuration_t mode_configuration;
phonemacro 0:ec8835052a84 82 max30101_multiLED_mode_ctrl_1_t multiLED_mode_ctrl_1;
phonemacro 0:ec8835052a84 83 max30101_multiLED_mode_ctrl_2_t multiLED_mode_ctrl_2;
phonemacro 0:ec8835052a84 84 max30101_spo2_configuration_t spo2_configuration;
phonemacro 0:ec8835052a84 85 max30101_fifo_configuration_t fifo_configuration;
phonemacro 0:ec8835052a84 86
phonemacro 0:ec8835052a84 87 cntr_int++;
phonemacro 0:ec8835052a84 88
phonemacro 0:ec8835052a84 89 while (loop) {
phonemacro 0:ec8835052a84 90 if (i2c_reg_read(REG_INT_STAT_1, &Interrupt_Status_1.all) != 0) { ///< Read Interrupt flag bits
phonemacro 0:ec8835052a84 91 return -1;
phonemacro 0:ec8835052a84 92 }
phonemacro 0:ec8835052a84 93
phonemacro 0:ec8835052a84 94 if (i2c_reg_read(REG_INT_STAT_2, &Interrupt_Status_2.all) != 0) { ///< Read Interrupt flag bits
phonemacro 0:ec8835052a84 95 return -1;
phonemacro 0:ec8835052a84 96 }
phonemacro 0:ec8835052a84 97
phonemacro 0:ec8835052a84 98 /* Read all the relevant register bits */
phonemacro 0:ec8835052a84 99 if (i2c_reg_read(REG_MODE_CFG, &mode_configuration.all) != 0) {
phonemacro 0:ec8835052a84 100 return -1;
phonemacro 0:ec8835052a84 101 }
phonemacro 0:ec8835052a84 102
phonemacro 0:ec8835052a84 103
phonemacro 0:ec8835052a84 104 if (i2c_reg_read(REG_SLT2_SLT1, &multiLED_mode_ctrl_1.all) != 0) {
phonemacro 0:ec8835052a84 105 return -1;
phonemacro 0:ec8835052a84 106 }
phonemacro 0:ec8835052a84 107
phonemacro 0:ec8835052a84 108
phonemacro 0:ec8835052a84 109 if (i2c_reg_read(REG_SLT4_SLT3, &multiLED_mode_ctrl_2.all) != 0) {
phonemacro 0:ec8835052a84 110 return -1;
phonemacro 0:ec8835052a84 111 }
phonemacro 0:ec8835052a84 112
phonemacro 0:ec8835052a84 113
phonemacro 0:ec8835052a84 114 if (i2c_reg_read(REG_SPO2_CFG, &spo2_configuration.all) != 0) {
phonemacro 0:ec8835052a84 115 return -1;
phonemacro 0:ec8835052a84 116 }
phonemacro 0:ec8835052a84 117
phonemacro 0:ec8835052a84 118
phonemacro 0:ec8835052a84 119 if (i2c_reg_read(REG_FIFO_CFG, &fifo_configuration.all) != 0) {
phonemacro 0:ec8835052a84 120 return -1;
phonemacro 0:ec8835052a84 121 }
phonemacro 0:ec8835052a84 122
phonemacro 0:ec8835052a84 123
phonemacro 0:ec8835052a84 124
phonemacro 0:ec8835052a84 125 if (Interrupt_Status_1.bit.a_full) {
phonemacro 0:ec8835052a84 126 ///< Read the sample(s)
phonemacro 0:ec8835052a84 127 char reg = REG_FIFO_DATA;
phonemacro 0:ec8835052a84 128
phonemacro 0:ec8835052a84 129 num_active_led = 0;
phonemacro 0:ec8835052a84 130
phonemacro 0:ec8835052a84 131 if (mode_configuration.bit.mode == 0x02) {///< Heart Rate mode, i.e. 1 led
phonemacro 0:ec8835052a84 132 num_active_led = 1;
phonemacro 0:ec8835052a84 133 } else if (mode_configuration.bit.mode == 0x03) { ///< SpO2 mode, i.e. 2 led
phonemacro 0:ec8835052a84 134 num_active_led = 2;
phonemacro 0:ec8835052a84 135 } else if (mode_configuration.bit.mode == 0x07) { ///< Multi-LED mode, i.e. 1-4 led
phonemacro 0:ec8835052a84 136 if (multiLED_mode_ctrl_1.bit.slot1 != 0) {
phonemacro 0:ec8835052a84 137 num_active_led++;
phonemacro 0:ec8835052a84 138 }
phonemacro 0:ec8835052a84 139
phonemacro 0:ec8835052a84 140 if (multiLED_mode_ctrl_1.bit.slot2 != 0) {
phonemacro 0:ec8835052a84 141 num_active_led++;
phonemacro 0:ec8835052a84 142 }
phonemacro 0:ec8835052a84 143
phonemacro 0:ec8835052a84 144 if (multiLED_mode_ctrl_2.bit.slot3 != 0) {
phonemacro 0:ec8835052a84 145 num_active_led++;
phonemacro 0:ec8835052a84 146 }
phonemacro 0:ec8835052a84 147
phonemacro 0:ec8835052a84 148 if (multiLED_mode_ctrl_2.bit.slot4 != 0) {
phonemacro 0:ec8835052a84 149 num_active_led++;
phonemacro 0:ec8835052a84 150 }
phonemacro 0:ec8835052a84 151 }
phonemacro 0:ec8835052a84 152 ///< 3bytes/LED x Number of Active LED x FIFO level selected
phonemacro 0:ec8835052a84 153 rx_bytes = 3 * num_active_led * (32-fifo_configuration.bit.fifo_a_full);
phonemacro 0:ec8835052a84 154
phonemacro 0:ec8835052a84 155 second_rx_bytes = rx_bytes;
phonemacro 0:ec8835052a84 156
phonemacro 0:ec8835052a84 157 /**
phonemacro 0:ec8835052a84 158 * @brief:
phonemacro 0:ec8835052a84 159 * The FIFO Size is determined by the Sample size. The number of bytes
phonemacro 0:ec8835052a84 160 * in a Sample is dictated by number of LED's
phonemacro 0:ec8835052a84 161 *
phonemacro 0:ec8835052a84 162 * #LED Selected Bytes in "1" sample
phonemacro 0:ec8835052a84 163 * 1 3
phonemacro 0:ec8835052a84 164 * 2 6
phonemacro 0:ec8835052a84 165 * 3 9
phonemacro 0:ec8835052a84 166 * 4 12
phonemacro 0:ec8835052a84 167 *
phonemacro 0:ec8835052a84 168 * The I2C API function limits the number of bytes to read, to 256 (i.e.
phonemacro 0:ec8835052a84 169 * char). Therefore, when set for Multiple LED's and the FIFO
phonemacro 0:ec8835052a84 170 * size is set to 32. It would mean there is more than 256 bytes.
phonemacro 0:ec8835052a84 171 * In that case two I2C reads have to be made. However It is important
phonemacro 0:ec8835052a84 172 * to note that each "Sample" must be read completely and reading only
phonemacro 0:ec8835052a84 173 * partial number of bytes from a sample will result in erroneous data.
phonemacro 0:ec8835052a84 174 *
phonemacro 0:ec8835052a84 175 *
phonemacro 0:ec8835052a84 176 * For example:
phonemacro 0:ec8835052a84 177 * Num of LED selected = 3 and FIFO size is set to 32 (i.e. 0 value in
phonemacro 0:ec8835052a84 178 * register), then the number of bytes will be
phonemacro 0:ec8835052a84 179 * 3bytes/Led * 3led's * 32 = 288 bytes in all. Since there are
phonemacro 0:ec8835052a84 180 * 3 LED's each sample will contain (3 * 3) 9bytes.
phonemacro 0:ec8835052a84 181 * Therefore Sample 1 = 9bytes, Sample 2 = 18,... Sample 28 = 252.
phonemacro 0:ec8835052a84 182 * Therefore the first I2C read should be 252 bytes and the second
phonemacro 0:ec8835052a84 183 * read should be 288-252 = 36.
phonemacro 0:ec8835052a84 184 *
phonemacro 0:ec8835052a84 185 * It turns out that this size issue comes up only when number of LED
phonemacro 0:ec8835052a84 186 * selected is 3 or 4 and choosing 252bytes
phonemacro 0:ec8835052a84 187 * for the first I2C read would work for both Number of LED selection.
phonemacro 0:ec8835052a84 188 */
phonemacro 0:ec8835052a84 189
phonemacro 0:ec8835052a84 190 if (rx_bytes <= CHUNK_SIZE) {
phonemacro 0:ec8835052a84 191 I2CM_Read(slaveAddress, &reg, 1, &max30101_rawData[0],
phonemacro 0:ec8835052a84 192 (char)rx_bytes /*total_databytes_1*/);
phonemacro 0:ec8835052a84 193 } else {
phonemacro 0:ec8835052a84 194 I2CM_Read(slaveAddress, &reg, 1, &max30101_rawData[0], CHUNK_SIZE);
phonemacro 0:ec8835052a84 195
phonemacro 0:ec8835052a84 196 second_rx_bytes = second_rx_bytes - CHUNK_SIZE;
phonemacro 0:ec8835052a84 197 I2CM_Read(slaveAddress, &reg, 1, &max30101_rawData[CHUNK_SIZE],
phonemacro 0:ec8835052a84 198 (char)second_rx_bytes);
phonemacro 0:ec8835052a84 199 }
phonemacro 0:ec8835052a84 200
phonemacro 0:ec8835052a84 201 index = 0;
phonemacro 0:ec8835052a84 202
phonemacro 0:ec8835052a84 203 for (i = 0; i < rx_bytes; i += 3) {
phonemacro 0:ec8835052a84 204 sample = ((uint32_t)(max30101_rawData[i] & 0x03) << 16) | (max30101_rawData[i + 1] << 8) | max30101_rawData[i + 2];
phonemacro 0:ec8835052a84 205
phonemacro 0:ec8835052a84 206 ///< Right shift the data based on the LED_PW setting
phonemacro 0:ec8835052a84 207 sample = sample >> (3 - spo2_configuration.bit.led_pw); // 0=shift 3, 1=shift 2, 2=shift 1, 3=no shift
phonemacro 0:ec8835052a84 208
phonemacro 0:ec8835052a84 209 max30101_buffer[index++] = sample;
phonemacro 0:ec8835052a84 210 }
phonemacro 0:ec8835052a84 211
phonemacro 0:ec8835052a84 212 onDataAvailableCallback(MAX30101_OXIMETER_DATA + num_active_led, max30101_buffer, index);
phonemacro 0:ec8835052a84 213 }
phonemacro 0:ec8835052a84 214
phonemacro 0:ec8835052a84 215
phonemacro 0:ec8835052a84 216 ///< This interrupt handles the temperature interrupt
phonemacro 0:ec8835052a84 217 if (Interrupt_Status_2.bit.die_temp_rdy) {
phonemacro 0:ec8835052a84 218 char reg;
phonemacro 0:ec8835052a84 219
phonemacro 0:ec8835052a84 220 reg = REG_TINT;
phonemacro 0:ec8835052a84 221 if (I2CM_Read(slaveAddress, &reg, 1, &temp_int, 1) != 0) {
phonemacro 0:ec8835052a84 222 return -1;
phonemacro 0:ec8835052a84 223 }
phonemacro 0:ec8835052a84 224
phonemacro 0:ec8835052a84 225 reg = REG_TFRAC;
phonemacro 0:ec8835052a84 226 if (I2CM_Read(slaveAddress, &reg, 1, &temp_frac, 1) != 0) {
phonemacro 0:ec8835052a84 227 return -1;
phonemacro 0:ec8835052a84 228 }
phonemacro 0:ec8835052a84 229
phonemacro 0:ec8835052a84 230 max30101_final_temp = (int8_t)temp_int + 0.0625f * temp_frac;
phonemacro 0:ec8835052a84 231
phonemacro 0:ec8835052a84 232 if (i2c_reg_write(REG_TEMP_EN, 0x00) != 0) { ///< Die Temperature Config, Temp disable... after one read...
phonemacro 0:ec8835052a84 233 return -1;
phonemacro 0:ec8835052a84 234 }
phonemacro 0:ec8835052a84 235 }
phonemacro 0:ec8835052a84 236
phonemacro 0:ec8835052a84 237 if (i2c_reg_read(REG_INT_STAT_1, &Interrupt_Status_1.all) != 0) { ///< Read Interrupt flag bits
phonemacro 0:ec8835052a84 238
phonemacro 0:ec8835052a84 239 return -1;
phonemacro 0:ec8835052a84 240 }
phonemacro 0:ec8835052a84 241 if (Interrupt_Status_1.bit.a_full != 1) {
phonemacro 0:ec8835052a84 242 loop = 0;
phonemacro 0:ec8835052a84 243 }
phonemacro 0:ec8835052a84 244 }
phonemacro 0:ec8835052a84 245
phonemacro 0:ec8835052a84 246 interruptPostCallback();
phonemacro 0:ec8835052a84 247
phonemacro 0:ec8835052a84 248
phonemacro 0:ec8835052a84 249 return 0;
phonemacro 0:ec8835052a84 250 }
phonemacro 0:ec8835052a84 251
phonemacro 0:ec8835052a84 252 //******************************************************************************
phonemacro 0:ec8835052a84 253 int MAX30101::SpO2mode_init(uint8_t fifo_waterlevel_mark, uint8_t sample_avg,
phonemacro 0:ec8835052a84 254 uint8_t sample_rate, uint8_t pulse_width,
phonemacro 0:ec8835052a84 255 uint8_t red_led_current, uint8_t ir_led_current) {
phonemacro 0:ec8835052a84 256
phonemacro 0:ec8835052a84 257 char status;
phonemacro 0:ec8835052a84 258
phonemacro 0:ec8835052a84 259 max30101_mode_configuration_t mode_configuration;
phonemacro 0:ec8835052a84 260 max30101_fifo_configuration_t fifo_configuration;
phonemacro 0:ec8835052a84 261 max30101_spo2_configuration_t spo2_configuration;
phonemacro 0:ec8835052a84 262 max30101_Interrupt_Enable_1_t Interrupt_Enable_1;
phonemacro 0:ec8835052a84 263
phonemacro 0:ec8835052a84 264 mode_configuration.all = 0;
phonemacro 0:ec8835052a84 265 mode_configuration.bit.reset = 1;
phonemacro 0:ec8835052a84 266 if (i2c_reg_write(REG_MODE_CFG, mode_configuration.all) != 0) // Reset the device
phonemacro 0:ec8835052a84 267 {
phonemacro 0:ec8835052a84 268 return -1;
phonemacro 0:ec8835052a84 269 }
phonemacro 0:ec8835052a84 270
phonemacro 0:ec8835052a84 271 ///< Give it some settle time (100ms)
phonemacro 0:ec8835052a84 272 wait(1.0 / 10.0); ///< Let things settle down a bit
phonemacro 0:ec8835052a84 273
phonemacro 0:ec8835052a84 274 fifo_configuration.all = 0;
phonemacro 0:ec8835052a84 275 fifo_configuration.bit.smp_ave = sample_avg; ///< Sample averaging;
phonemacro 0:ec8835052a84 276 fifo_configuration.bit.fifo_roll_over_en = 1; ///< FIFO Roll over enabled
phonemacro 0:ec8835052a84 277 fifo_configuration.bit.fifo_a_full = fifo_waterlevel_mark; ///< Interrupt when certain level is filled
phonemacro 0:ec8835052a84 278
phonemacro 0:ec8835052a84 279 if (i2c_reg_write(REG_FIFO_CFG, fifo_configuration.all) != 0) {
phonemacro 0:ec8835052a84 280 return -1;
phonemacro 0:ec8835052a84 281 }
phonemacro 0:ec8835052a84 282
phonemacro 0:ec8835052a84 283 spo2_configuration.bit.spo2_adc_rge = 0x2; ///< ADC Range 8192 fullscale
phonemacro 0:ec8835052a84 284 spo2_configuration.bit.spo2_sr = sample_rate; ///< 100 Samp/sec.
phonemacro 0:ec8835052a84 285 spo2_configuration.bit.led_pw = pulse_width; ///< Pulse Width=411us and ADC Resolution=18
phonemacro 0:ec8835052a84 286 if (i2c_reg_write(REG_SPO2_CFG, spo2_configuration.all) != 0) {
phonemacro 0:ec8835052a84 287 return -1;
phonemacro 0:ec8835052a84 288 }
phonemacro 0:ec8835052a84 289
phonemacro 0:ec8835052a84 290 if (i2c_reg_write(REG_LED1_PA, red_led_current) != 0) {
phonemacro 0:ec8835052a84 291 return -1;
phonemacro 0:ec8835052a84 292 }
phonemacro 0:ec8835052a84 293
phonemacro 0:ec8835052a84 294 if (i2c_reg_write(REG_LED2_PA, ir_led_current) != 0) {
phonemacro 0:ec8835052a84 295 return -1;
phonemacro 0:ec8835052a84 296 }
phonemacro 0:ec8835052a84 297
phonemacro 0:ec8835052a84 298 /************/
phonemacro 0:ec8835052a84 299
phonemacro 0:ec8835052a84 300 if (i2c_reg_read(REG_INT_STAT_1, &status) != 0) ///< Clear INT1 by reading the status
phonemacro 0:ec8835052a84 301 {
phonemacro 0:ec8835052a84 302 return -1;
phonemacro 0:ec8835052a84 303 }
phonemacro 0:ec8835052a84 304
phonemacro 0:ec8835052a84 305 if (i2c_reg_read(REG_INT_STAT_2, &status) != 0) ///< Clear INT2 by reading the status
phonemacro 0:ec8835052a84 306 {
phonemacro 0:ec8835052a84 307 return -1;
phonemacro 0:ec8835052a84 308 }
phonemacro 0:ec8835052a84 309
phonemacro 0:ec8835052a84 310 if (i2c_reg_write(REG_FIFO_W_PTR, 0x00) != 0) ///< Clear FIFO ptr
phonemacro 0:ec8835052a84 311 {
phonemacro 0:ec8835052a84 312 return -1;
phonemacro 0:ec8835052a84 313 }
phonemacro 0:ec8835052a84 314
phonemacro 0:ec8835052a84 315 if (i2c_reg_write(REG_FIFO_OVF_CNT, 0x00) != 0) ///< Clear FIFO ptr
phonemacro 0:ec8835052a84 316 {
phonemacro 0:ec8835052a84 317 return -1;
phonemacro 0:ec8835052a84 318 }
phonemacro 0:ec8835052a84 319
phonemacro 0:ec8835052a84 320 if (i2c_reg_write(REG_FIFO_R_PTR, 0x00) != 0) ///< Clear FIFO ptr
phonemacro 0:ec8835052a84 321 {
phonemacro 0:ec8835052a84 322 return -1;
phonemacro 0:ec8835052a84 323 }
phonemacro 0:ec8835052a84 324
phonemacro 0:ec8835052a84 325 Interrupt_Enable_1.all = 0;
phonemacro 0:ec8835052a84 326 Interrupt_Enable_1.bit.a_full_en = 1; ///< Enable FIFO almost full interrupt
phonemacro 0:ec8835052a84 327 if (i2c_reg_write(REG_INT_EN_1, Interrupt_Enable_1.all) != 0) {
phonemacro 0:ec8835052a84 328 return -1;
phonemacro 0:ec8835052a84 329 }
phonemacro 0:ec8835052a84 330
phonemacro 0:ec8835052a84 331 mode_configuration.all = 0;
phonemacro 0:ec8835052a84 332 mode_configuration.bit.mode = 0x03; ///< SpO2 mode
phonemacro 0:ec8835052a84 333 if (i2c_reg_write(REG_MODE_CFG, mode_configuration.all) != 0) {
phonemacro 0:ec8835052a84 334 return -1;
phonemacro 0:ec8835052a84 335 }
phonemacro 0:ec8835052a84 336
phonemacro 0:ec8835052a84 337 return 0;
phonemacro 0:ec8835052a84 338 }
phonemacro 0:ec8835052a84 339
phonemacro 0:ec8835052a84 340 //******************************************************************************
phonemacro 0:ec8835052a84 341 int MAX30101::SpO2mode_stop(void) {
phonemacro 0:ec8835052a84 342
phonemacro 0:ec8835052a84 343 max30101_Interrupt_Enable_1_t Interrupt_Enable_1;
phonemacro 0:ec8835052a84 344 max30101_mode_configuration_t mode_configuration;
phonemacro 0:ec8835052a84 345 uint8_t led1_pa;
phonemacro 0:ec8835052a84 346 uint8_t led2_pa;
phonemacro 0:ec8835052a84 347
phonemacro 0:ec8835052a84 348 Interrupt_Enable_1.all = 0;
phonemacro 0:ec8835052a84 349 Interrupt_Enable_1.bit.a_full_en = 0; ///< Disable FIFO almost full interrupt
phonemacro 0:ec8835052a84 350 if (i2c_reg_write(REG_INT_EN_1, Interrupt_Enable_1.all) != 0) {
phonemacro 0:ec8835052a84 351 return -1;
phonemacro 0:ec8835052a84 352 }
phonemacro 0:ec8835052a84 353
phonemacro 0:ec8835052a84 354 mode_configuration.all = 0;
phonemacro 0:ec8835052a84 355 mode_configuration.bit.mode = 0x00; ///< SpO2 mode off
phonemacro 0:ec8835052a84 356 if (i2c_reg_write(REG_MODE_CFG, mode_configuration.all) != 0) {
phonemacro 0:ec8835052a84 357 return -1;
phonemacro 0:ec8835052a84 358 }
phonemacro 0:ec8835052a84 359
phonemacro 0:ec8835052a84 360 led1_pa = 0; ///< RED LED current, 0.0
phonemacro 0:ec8835052a84 361 if (i2c_reg_write(REG_LED1_PA, led1_pa) != 0) {
phonemacro 0:ec8835052a84 362 return -1;
phonemacro 0:ec8835052a84 363 }
phonemacro 0:ec8835052a84 364
phonemacro 0:ec8835052a84 365 led2_pa = 0; ///< IR LED current, 0.0
phonemacro 0:ec8835052a84 366 if (i2c_reg_write(REG_LED2_PA, led2_pa) != 0) {
phonemacro 0:ec8835052a84 367 return -1;
phonemacro 0:ec8835052a84 368 }
phonemacro 0:ec8835052a84 369
phonemacro 0:ec8835052a84 370 return 0;
phonemacro 0:ec8835052a84 371 }
phonemacro 0:ec8835052a84 372
phonemacro 0:ec8835052a84 373 //******************************************************************************
phonemacro 0:ec8835052a84 374 int MAX30101::HRmode_init(uint8_t fifo_waterlevel_mark, uint8_t sample_avg,
phonemacro 0:ec8835052a84 375 uint8_t sample_rate, uint8_t pulse_width,
phonemacro 0:ec8835052a84 376 uint8_t red_led_current) {
phonemacro 0:ec8835052a84 377
phonemacro 0:ec8835052a84 378 /*uint8_t*/ char status;
phonemacro 0:ec8835052a84 379
phonemacro 0:ec8835052a84 380 max30101_mode_configuration_t mode_configuration;
phonemacro 0:ec8835052a84 381 max30101_fifo_configuration_t fifo_configuration;
phonemacro 0:ec8835052a84 382 max30101_spo2_configuration_t spo2_configuration;
phonemacro 0:ec8835052a84 383 max30101_Interrupt_Enable_1_t Interrupt_Enable_1;
phonemacro 0:ec8835052a84 384
phonemacro 0:ec8835052a84 385 mode_configuration.all = 0;
phonemacro 0:ec8835052a84 386 mode_configuration.bit.reset = 1;
phonemacro 0:ec8835052a84 387 if (i2c_reg_write(REG_MODE_CFG, mode_configuration.all) != 0) ///< Reset the device, Mode = don't use...
phonemacro 0:ec8835052a84 388 {
phonemacro 0:ec8835052a84 389 return -1;
phonemacro 0:ec8835052a84 390 }
phonemacro 0:ec8835052a84 391
phonemacro 0:ec8835052a84 392 ///< Give it some settle time (100ms)
phonemacro 0:ec8835052a84 393 wait(1.0 / 10.0); ///< Let things settle down a bit
phonemacro 0:ec8835052a84 394
phonemacro 0:ec8835052a84 395 fifo_configuration.all = 0;
phonemacro 0:ec8835052a84 396 fifo_configuration.bit.smp_ave = sample_avg; ///< Sample averaging;
phonemacro 0:ec8835052a84 397 fifo_configuration.bit.fifo_roll_over_en = 1; ///< FIFO Roll over enabled
phonemacro 0:ec8835052a84 398 fifo_configuration.bit.fifo_a_full = fifo_waterlevel_mark; ///< Interrupt when certain level is filled
phonemacro 0:ec8835052a84 399 if (i2c_reg_write(REG_FIFO_CFG, fifo_configuration.all) != 0) {
phonemacro 0:ec8835052a84 400 return -1;
phonemacro 0:ec8835052a84 401 }
phonemacro 0:ec8835052a84 402
phonemacro 0:ec8835052a84 403 spo2_configuration.bit.spo2_adc_rge = 0x2; ///< ADC Range 8192 fullscale
phonemacro 0:ec8835052a84 404 spo2_configuration.bit.spo2_sr = sample_rate; ///< 100 Samp/sec.
phonemacro 0:ec8835052a84 405 spo2_configuration.bit.led_pw = pulse_width; ///< Pulse Width=411us and ADC Resolution=18
phonemacro 0:ec8835052a84 406 if (i2c_reg_write(REG_SPO2_CFG, spo2_configuration.all) != 0) {
phonemacro 0:ec8835052a84 407 return -1;
phonemacro 0:ec8835052a84 408 }
phonemacro 0:ec8835052a84 409
phonemacro 0:ec8835052a84 410 if (i2c_reg_write(REG_LED1_PA, red_led_current) != 0) {
phonemacro 0:ec8835052a84 411 return -1;
phonemacro 0:ec8835052a84 412 }
phonemacro 0:ec8835052a84 413
phonemacro 0:ec8835052a84 414 /************/
phonemacro 0:ec8835052a84 415
phonemacro 0:ec8835052a84 416 if (i2c_reg_read(REG_INT_STAT_1, &status) != 0) ///< Clear INT1 by reading the status
phonemacro 0:ec8835052a84 417 {
phonemacro 0:ec8835052a84 418 return -1;
phonemacro 0:ec8835052a84 419 }
phonemacro 0:ec8835052a84 420
phonemacro 0:ec8835052a84 421 if (i2c_reg_read(REG_INT_STAT_2, &status) != 0) ///< Clear INT2 by reading the status
phonemacro 0:ec8835052a84 422 {
phonemacro 0:ec8835052a84 423 return -1;
phonemacro 0:ec8835052a84 424 }
phonemacro 0:ec8835052a84 425
phonemacro 0:ec8835052a84 426 if (i2c_reg_write(REG_FIFO_W_PTR, 0x00) != 0) ///< Clear FIFO ptr
phonemacro 0:ec8835052a84 427 {
phonemacro 0:ec8835052a84 428 return -1;
phonemacro 0:ec8835052a84 429 }
phonemacro 0:ec8835052a84 430
phonemacro 0:ec8835052a84 431 if (i2c_reg_write(REG_FIFO_OVF_CNT, 0x00) != 0) ///< Clear FIFO ptr
phonemacro 0:ec8835052a84 432 {
phonemacro 0:ec8835052a84 433 return -1;
phonemacro 0:ec8835052a84 434 }
phonemacro 0:ec8835052a84 435
phonemacro 0:ec8835052a84 436 if (i2c_reg_write(REG_FIFO_R_PTR, 0x00) != 0) ///< Clear FIFO ptr
phonemacro 0:ec8835052a84 437 {
phonemacro 0:ec8835052a84 438 return -1;
phonemacro 0:ec8835052a84 439 }
phonemacro 0:ec8835052a84 440
phonemacro 0:ec8835052a84 441 Interrupt_Enable_1.all = 0;
phonemacro 0:ec8835052a84 442 Interrupt_Enable_1.bit.a_full_en = 1;
phonemacro 0:ec8835052a84 443
phonemacro 0:ec8835052a84 444 // Interrupt
phonemacro 0:ec8835052a84 445 if (i2c_reg_write(REG_INT_EN_1, Interrupt_Enable_1.all) != 0) {
phonemacro 0:ec8835052a84 446 return -1;
phonemacro 0:ec8835052a84 447 }
phonemacro 0:ec8835052a84 448
phonemacro 0:ec8835052a84 449 mode_configuration.all = 0;
phonemacro 0:ec8835052a84 450 mode_configuration.bit.mode = 0x02; ///< HR mode
phonemacro 0:ec8835052a84 451 if (i2c_reg_write(REG_MODE_CFG, mode_configuration.all) != 0) {
phonemacro 0:ec8835052a84 452 return -1;
phonemacro 0:ec8835052a84 453 }
phonemacro 0:ec8835052a84 454
phonemacro 0:ec8835052a84 455 return 0;
phonemacro 0:ec8835052a84 456 }
phonemacro 0:ec8835052a84 457
phonemacro 0:ec8835052a84 458 //******************************************************************************
phonemacro 0:ec8835052a84 459 int MAX30101::HRmode_stop(void) {
phonemacro 0:ec8835052a84 460
phonemacro 0:ec8835052a84 461 max30101_Interrupt_Enable_1_t Interrupt_Enable_1;
phonemacro 0:ec8835052a84 462 max30101_mode_configuration_t mode_configuration;
phonemacro 0:ec8835052a84 463
phonemacro 0:ec8835052a84 464 Interrupt_Enable_1.all = 0;
phonemacro 0:ec8835052a84 465 Interrupt_Enable_1.bit.a_full_en = 0; ///< Disable FIFO almost full interrupt
phonemacro 0:ec8835052a84 466 if (i2c_reg_write(REG_INT_EN_1, Interrupt_Enable_1.all) != 0) {
phonemacro 0:ec8835052a84 467 return -1;
phonemacro 0:ec8835052a84 468 }
phonemacro 0:ec8835052a84 469
phonemacro 0:ec8835052a84 470 mode_configuration.all = 0;
phonemacro 0:ec8835052a84 471 mode_configuration.bit.mode = 0x00; ///< HR mode off
phonemacro 0:ec8835052a84 472 if (i2c_reg_write(REG_MODE_CFG, mode_configuration.all) != 0) {
phonemacro 0:ec8835052a84 473 return -1;
phonemacro 0:ec8835052a84 474 }
phonemacro 0:ec8835052a84 475
phonemacro 0:ec8835052a84 476 if (i2c_reg_write(REG_LED1_PA, 0) != 0) {
phonemacro 0:ec8835052a84 477 return -1;
phonemacro 0:ec8835052a84 478 }
phonemacro 0:ec8835052a84 479
phonemacro 0:ec8835052a84 480 return 0;
phonemacro 0:ec8835052a84 481 }
phonemacro 0:ec8835052a84 482
phonemacro 0:ec8835052a84 483 //******************************************************************************
phonemacro 0:ec8835052a84 484 int MAX30101::Multimode_init(uint8_t fifo_waterlevel_mark, uint8_t sample_avg,
phonemacro 0:ec8835052a84 485 uint8_t sample_rate, uint8_t pulse_width,
phonemacro 0:ec8835052a84 486 uint8_t red_led_current, uint8_t ir_led_current,
phonemacro 0:ec8835052a84 487 uint8_t green_led_current, uint8_t slot_1,
phonemacro 0:ec8835052a84 488 uint8_t slot_2, uint8_t slot_3, uint8_t slot_4) {
phonemacro 0:ec8835052a84 489
phonemacro 0:ec8835052a84 490 char status;
phonemacro 0:ec8835052a84 491 max30101_mode_configuration_t mode_configuration;
phonemacro 0:ec8835052a84 492 max30101_fifo_configuration_t fifo_configuration;
phonemacro 0:ec8835052a84 493 max30101_spo2_configuration_t spo2_configuration;
phonemacro 0:ec8835052a84 494 max30101_multiLED_mode_ctrl_1_t multiLED_mode_ctrl_1;
phonemacro 0:ec8835052a84 495 max30101_multiLED_mode_ctrl_2_t multiLED_mode_ctrl_2;
phonemacro 0:ec8835052a84 496 max30101_Interrupt_Enable_1_t Interrupt_Enable_1;
phonemacro 0:ec8835052a84 497
phonemacro 0:ec8835052a84 498 mode_configuration.all = 0;
phonemacro 0:ec8835052a84 499 mode_configuration.bit.reset = 1;
phonemacro 0:ec8835052a84 500 if (i2c_reg_write(REG_MODE_CFG, mode_configuration.all) != 0) ///< Reset the device, Mode = don't use...
phonemacro 0:ec8835052a84 501 {
phonemacro 0:ec8835052a84 502 return -1;
phonemacro 0:ec8835052a84 503 }
phonemacro 0:ec8835052a84 504
phonemacro 0:ec8835052a84 505 /* Give it some settle time (100ms) */ ///< Let things settle down a bit
phonemacro 0:ec8835052a84 506 wait(1.0 / 10.0);
phonemacro 0:ec8835052a84 507
phonemacro 0:ec8835052a84 508 fifo_configuration.all = 0;
phonemacro 0:ec8835052a84 509 fifo_configuration.bit.smp_ave = sample_avg; ///< Sample averaging;
phonemacro 0:ec8835052a84 510 fifo_configuration.bit.fifo_roll_over_en = 1; ///< FIFO Roll over enabled
phonemacro 0:ec8835052a84 511 fifo_configuration.bit.fifo_a_full =
phonemacro 0:ec8835052a84 512 fifo_waterlevel_mark; ///< Interrupt when certain level is filled
phonemacro 0:ec8835052a84 513 if (i2c_reg_write(REG_FIFO_CFG, fifo_configuration.all) != 0) {
phonemacro 0:ec8835052a84 514 return -1;
phonemacro 0:ec8835052a84 515 }
phonemacro 0:ec8835052a84 516
phonemacro 0:ec8835052a84 517 spo2_configuration.bit.spo2_adc_rge = 0x2; ///< ADC Range 8192 fullscale
phonemacro 0:ec8835052a84 518 spo2_configuration.bit.spo2_sr = sample_rate; ///< 100 Samp/sec.
phonemacro 0:ec8835052a84 519 spo2_configuration.bit.led_pw = pulse_width; ///< Pulse Width=411us and ADC Resolution=18
phonemacro 0:ec8835052a84 520 if (i2c_reg_write(REG_SPO2_CFG, spo2_configuration.all) != 0) {
phonemacro 0:ec8835052a84 521 return -1;
phonemacro 0:ec8835052a84 522 }
phonemacro 0:ec8835052a84 523
phonemacro 0:ec8835052a84 524 if (i2c_reg_write(REG_LED1_PA, red_led_current) != 0) {
phonemacro 0:ec8835052a84 525 return -1;
phonemacro 0:ec8835052a84 526 }
phonemacro 0:ec8835052a84 527
phonemacro 0:ec8835052a84 528 if (i2c_reg_write(REG_LED2_PA, ir_led_current) != 0) {
phonemacro 0:ec8835052a84 529 return -1;
phonemacro 0:ec8835052a84 530 }
phonemacro 0:ec8835052a84 531
phonemacro 0:ec8835052a84 532 if (i2c_reg_write(REG_LED3_PA, green_led_current) != 0) {
phonemacro 0:ec8835052a84 533 return -1;
phonemacro 0:ec8835052a84 534 }
phonemacro 0:ec8835052a84 535
phonemacro 0:ec8835052a84 536 ///< 0x01=Red(LED1), 0x02=IR(LED2), 0x03=Green(LED3) : Use LEDn_PA to adjust the intensity
phonemacro 0:ec8835052a84 537 ///< 0x05=Red , 0x06=IR , 0x07=Green : Use PILOT_PA to adjust the intensity DO NOT USE THIS ROW...
phonemacro 0:ec8835052a84 538
phonemacro 0:ec8835052a84 539 multiLED_mode_ctrl_1.bit.slot1 = slot_1;
phonemacro 0:ec8835052a84 540 multiLED_mode_ctrl_1.bit.slot2 = slot_2;
phonemacro 0:ec8835052a84 541 if (i2c_reg_write(REG_SLT2_SLT1, multiLED_mode_ctrl_1.all)) {
phonemacro 0:ec8835052a84 542 return -1;
phonemacro 0:ec8835052a84 543 }
phonemacro 0:ec8835052a84 544
phonemacro 0:ec8835052a84 545 multiLED_mode_ctrl_2.all = 0;
phonemacro 0:ec8835052a84 546 multiLED_mode_ctrl_2.bit.slot3 = slot_3;
phonemacro 0:ec8835052a84 547 multiLED_mode_ctrl_2.bit.slot4 = slot_4;
phonemacro 0:ec8835052a84 548 if (i2c_reg_write(REG_SLT4_SLT3, multiLED_mode_ctrl_2.all)) {
phonemacro 0:ec8835052a84 549 return -1;
phonemacro 0:ec8835052a84 550 }
phonemacro 0:ec8835052a84 551
phonemacro 0:ec8835052a84 552 /************/
phonemacro 0:ec8835052a84 553
phonemacro 0:ec8835052a84 554 if (i2c_reg_read(REG_INT_STAT_1, &status) != 0) ///< Clear INT1 by reading the status
phonemacro 0:ec8835052a84 555 {
phonemacro 0:ec8835052a84 556 return -1;
phonemacro 0:ec8835052a84 557 }
phonemacro 0:ec8835052a84 558
phonemacro 0:ec8835052a84 559 if (i2c_reg_read(REG_INT_STAT_2, &status) != 0) ///< Clear INT2 by reading the status
phonemacro 0:ec8835052a84 560 {
phonemacro 0:ec8835052a84 561 return -1;
phonemacro 0:ec8835052a84 562 }
phonemacro 0:ec8835052a84 563
phonemacro 0:ec8835052a84 564 if (i2c_reg_write(REG_FIFO_W_PTR, 0x00) != 0) ///< Clear FIFO ptr
phonemacro 0:ec8835052a84 565 {
phonemacro 0:ec8835052a84 566 return -1;
phonemacro 0:ec8835052a84 567 }
phonemacro 0:ec8835052a84 568
phonemacro 0:ec8835052a84 569 if (i2c_reg_write(REG_FIFO_OVF_CNT, 0x00) != 0) ///< Clear FIFO ptr
phonemacro 0:ec8835052a84 570 {
phonemacro 0:ec8835052a84 571 return -1;
phonemacro 0:ec8835052a84 572 }
phonemacro 0:ec8835052a84 573
phonemacro 0:ec8835052a84 574 if (i2c_reg_write(REG_FIFO_R_PTR, 0x00) != 0) ///< Clear FIFO ptr
phonemacro 0:ec8835052a84 575 {
phonemacro 0:ec8835052a84 576 return -1;
phonemacro 0:ec8835052a84 577 }
phonemacro 0:ec8835052a84 578
phonemacro 0:ec8835052a84 579 Interrupt_Enable_1.all = 0;
phonemacro 0:ec8835052a84 580 Interrupt_Enable_1.bit.a_full_en = 1; ///< Enable FIFO almost full interrupt
phonemacro 0:ec8835052a84 581 if (i2c_reg_write(REG_INT_EN_1, Interrupt_Enable_1.all) != 0) {
phonemacro 0:ec8835052a84 582 return -1;
phonemacro 0:ec8835052a84 583 }
phonemacro 0:ec8835052a84 584
phonemacro 0:ec8835052a84 585 mode_configuration.all = 0;
phonemacro 0:ec8835052a84 586 mode_configuration.bit.mode = 0x07; ///< Multi-LED mode
phonemacro 0:ec8835052a84 587 if (i2c_reg_write(REG_MODE_CFG, mode_configuration.all) != 0) {
phonemacro 0:ec8835052a84 588 return -1;
phonemacro 0:ec8835052a84 589 }
phonemacro 0:ec8835052a84 590
phonemacro 0:ec8835052a84 591 return 0;
phonemacro 0:ec8835052a84 592 }
phonemacro 0:ec8835052a84 593
phonemacro 0:ec8835052a84 594 //******************************************************************************
phonemacro 0:ec8835052a84 595 int MAX30101::Multimode_stop(void) {
phonemacro 0:ec8835052a84 596
phonemacro 0:ec8835052a84 597 max30101_Interrupt_Enable_1_t Interrupt_Enable_1;
phonemacro 0:ec8835052a84 598 max30101_mode_configuration_t mode_configuration;
phonemacro 0:ec8835052a84 599
phonemacro 0:ec8835052a84 600
phonemacro 0:ec8835052a84 601 Interrupt_Enable_1.all = 0;
phonemacro 0:ec8835052a84 602 Interrupt_Enable_1.bit.a_full_en = 0; ///< Disable FIFO almost full interrupt
phonemacro 0:ec8835052a84 603 if (i2c_reg_write(REG_INT_EN_1, Interrupt_Enable_1.all) != 0) {
phonemacro 0:ec8835052a84 604 return -1;
phonemacro 0:ec8835052a84 605 }
phonemacro 0:ec8835052a84 606
phonemacro 0:ec8835052a84 607 mode_configuration.all = 0;
phonemacro 0:ec8835052a84 608 mode_configuration.bit.mode = 0x00; ///< Multi-LED mode off
phonemacro 0:ec8835052a84 609 if (i2c_reg_write(REG_MODE_CFG, mode_configuration.all) != 0) {
phonemacro 0:ec8835052a84 610 return -1;
phonemacro 0:ec8835052a84 611 }
phonemacro 0:ec8835052a84 612
phonemacro 0:ec8835052a84 613 if (i2c_reg_write(REG_LED1_PA, 0) != 0) {
phonemacro 0:ec8835052a84 614 return -1;
phonemacro 0:ec8835052a84 615 }
phonemacro 0:ec8835052a84 616
phonemacro 0:ec8835052a84 617 if (i2c_reg_write(REG_LED2_PA, 0) != 0) {
phonemacro 0:ec8835052a84 618 return -1;
phonemacro 0:ec8835052a84 619 }
phonemacro 0:ec8835052a84 620
phonemacro 0:ec8835052a84 621 if (i2c_reg_write(REG_LED3_PA, 0) != 0) {
phonemacro 0:ec8835052a84 622 return -1;
phonemacro 0:ec8835052a84 623 }
phonemacro 0:ec8835052a84 624 return 0;
phonemacro 0:ec8835052a84 625 }
phonemacro 0:ec8835052a84 626
phonemacro 0:ec8835052a84 627 //******************************************************************************
phonemacro 0:ec8835052a84 628 int MAX30101::tempread(void) {
phonemacro 0:ec8835052a84 629
phonemacro 0:ec8835052a84 630 if (i2c_reg_write(REG_INT_EN_2, 0x02) != 0) {///< Interrupt Enable 2, Temperature Interrupt
phonemacro 0:ec8835052a84 631 return -1;
phonemacro 0:ec8835052a84 632 }
phonemacro 0:ec8835052a84 633
phonemacro 0:ec8835052a84 634 if (i2c_reg_write(REG_TEMP_EN, 0x01) != 0) {///< Die Temperature Config, Temp enable...
phonemacro 0:ec8835052a84 635
phonemacro 0:ec8835052a84 636 return -1;
phonemacro 0:ec8835052a84 637 }
phonemacro 0:ec8835052a84 638 return 0;
phonemacro 0:ec8835052a84 639 }
phonemacro 0:ec8835052a84 640
phonemacro 0:ec8835052a84 641 //******************************************************************************
phonemacro 0:ec8835052a84 642 int MAX30101::i2c_reg_write(MAX30101_REG_map_t reg, char value) {
phonemacro 0:ec8835052a84 643
phonemacro 0:ec8835052a84 644 char cmdData[2] = {reg, value};
phonemacro 0:ec8835052a84 645
phonemacro 0:ec8835052a84 646 if (I2CM_Write(slaveAddress, NULL, 0, cmdData, 2) != 0) {
phonemacro 0:ec8835052a84 647 return -1;
phonemacro 0:ec8835052a84 648 }
phonemacro 0:ec8835052a84 649
phonemacro 0:ec8835052a84 650 return 0;
phonemacro 0:ec8835052a84 651 }
phonemacro 0:ec8835052a84 652
phonemacro 0:ec8835052a84 653 //******************************************************************************
phonemacro 0:ec8835052a84 654 int MAX30101::i2c_reg_read(MAX30101_REG_map_t reg, char *value) {
phonemacro 0:ec8835052a84 655 if (I2CM_Read(slaveAddress, (char *)&reg, 1, value, 1) != 0 /*1*/) {
phonemacro 0:ec8835052a84 656 return -1;
phonemacro 0:ec8835052a84 657 }
phonemacro 0:ec8835052a84 658
phonemacro 0:ec8835052a84 659 return 0;
phonemacro 0:ec8835052a84 660 }
phonemacro 0:ec8835052a84 661
phonemacro 0:ec8835052a84 662 //******************************************************************************
phonemacro 0:ec8835052a84 663 int MAX30101::I2CM_Read(int slaveAddress, char *writeData, char writeCount,
phonemacro 0:ec8835052a84 664 char *readData, char readCount) {
phonemacro 0:ec8835052a84 665
phonemacro 0:ec8835052a84 666 if (writeData != NULL && writeCount != 0) {
phonemacro 0:ec8835052a84 667 i2c->write(slaveAddress, writeData, writeCount, true);
phonemacro 0:ec8835052a84 668 }
phonemacro 0:ec8835052a84 669 if (readData != NULL && readCount != 0) {
phonemacro 0:ec8835052a84 670 i2c->read(slaveAddress, readData, readCount);
phonemacro 0:ec8835052a84 671 }
phonemacro 0:ec8835052a84 672 return 0;
phonemacro 0:ec8835052a84 673 }
phonemacro 0:ec8835052a84 674
phonemacro 0:ec8835052a84 675 //******************************************************************************
phonemacro 0:ec8835052a84 676 int MAX30101::I2CM_Write(int slaveAddress, char *writeData1, char writeCount1,
phonemacro 0:ec8835052a84 677 char *writeData2, char writeCount2) {
phonemacro 0:ec8835052a84 678
phonemacro 0:ec8835052a84 679 if (writeData1 != NULL && writeCount1 != 0) {
phonemacro 0:ec8835052a84 680 i2c->write(slaveAddress, writeData1, writeCount1);
phonemacro 0:ec8835052a84 681 }
phonemacro 0:ec8835052a84 682 if (writeData2 != NULL && writeCount2 != 0) {
phonemacro 0:ec8835052a84 683 i2c->write(slaveAddress, writeData2, writeCount2);
phonemacro 0:ec8835052a84 684 }
phonemacro 0:ec8835052a84 685 return 0;
phonemacro 0:ec8835052a84 686 }
phonemacro 0:ec8835052a84 687
phonemacro 0:ec8835052a84 688 //******************************************************************************
phonemacro 0:ec8835052a84 689 void MAX30101::onDataAvailable(DataCallbackFunction _onDataAvailable) {
phonemacro 0:ec8835052a84 690
phonemacro 0:ec8835052a84 691 onDataAvailableCallback = _onDataAvailable;
phonemacro 0:ec8835052a84 692 }
phonemacro 0:ec8835052a84 693
phonemacro 0:ec8835052a84 694 //******************************************************************************
phonemacro 0:ec8835052a84 695 void MAX30101::dataAvailable(uint32_t id, uint32_t *buffer, uint32_t length) {
phonemacro 0:ec8835052a84 696
phonemacro 0:ec8835052a84 697 if (onDataAvailableCallback != NULL) {
phonemacro 0:ec8835052a84 698 (*onDataAvailableCallback)(id, buffer, length);
phonemacro 0:ec8835052a84 699 }
phonemacro 0:ec8835052a84 700 }
phonemacro 0:ec8835052a84 701
phonemacro 0:ec8835052a84 702 //******************************************************************************
phonemacro 0:ec8835052a84 703 void MAX30101::onInterrupt(InterruptFunction _onInterrupt) {
phonemacro 0:ec8835052a84 704
phonemacro 0:ec8835052a84 705 onInterruptCallback = _onInterrupt;
phonemacro 0:ec8835052a84 706 }
phonemacro 0:ec8835052a84 707
phonemacro 0:ec8835052a84 708 //******************************************************************************
phonemacro 0:ec8835052a84 709 void MAX30101::interruptPostCallback(void) {
phonemacro 0:ec8835052a84 710
phonemacro 0:ec8835052a84 711 if (onInterruptCallback != NULL) {
phonemacro 0:ec8835052a84 712
phonemacro 0:ec8835052a84 713 (*onInterruptCallback)();
phonemacro 0:ec8835052a84 714 }
phonemacro 0:ec8835052a84 715 }
phonemacro 0:ec8835052a84 716
phonemacro 0:ec8835052a84 717 //******************************************************************************
phonemacro 0:ec8835052a84 718 void MAX30101::MidIntHandler(void) {
phonemacro 0:ec8835052a84 719
phonemacro 0:ec8835052a84 720 MAX30101::instance->int_handler();
phonemacro 0:ec8835052a84 721 }