MAX32620HSP (MAXREFDES100) RPC Example for Graphical User Interface

Dependencies:   USBDevice

Fork of HSP_Release by Jerry Bradshaw

This is an example program for the MAX32620HSP (MAXREFDES100 Health Sensor Platform). It demonstrates all the features of the platform and works with a companion graphical user interface (GUI) to help evaluate/configure/monitor the board. Go to the MAXREFDES100 product page and click on "design resources" to download the companion software. The GUI connects to the board through an RPC interface on a virtual serial port over the USB interface.

The RPC interface provides access to all the features of the board and is available to interface with other development environments such Matlab. This firmware provides realtime data streaming through the RPC interface over USB, and also provides the ability to log the data to flash for untethered battery operation. The data logging settings are configured through the GUI, and the GUI also provides the interface to download logged data.

Details on the RPC interface can be found here: HSP RPC Interface Documentation

Windows

With this program loaded, the MAX32620HSP will appear on your computer as a serial port. On Mac and Linux, this will happen by default. For Windows, you need to install a driver: HSP serial port windows driver

For more details about this platform and how to use it, see the MAXREFDES100 product page.

Committer:
jbradshaw
Date:
Tue Apr 25 10:47:10 2017 -0500
Revision:
3:8e9b9f5818aa
Parent:
1:9490836294ea
Removed Bulk Erasing, instead a small number of bytes are sampled from each and every page to determine if sector is "dirty", if so sector is erased
Prevents device from sleeping when the firmware detects a series of binary flash page RPC transfers, this increases flash page transfers by %450
when 200mS elapse with the last flash page transfer, normal sleep behaviour is resumed

Who changed what in which revision?

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