Library for MAX30101, read/write functions for registers implemented.

Dependents:   test_MAX30101 testSensor

Committer:
Rhyme
Date:
Tue Dec 29 07:40:53 2015 +0000
Revision:
1:fc677d82d0f1
Parent:
0:4ad9373787e8
Child:
2:c465a8d44b9a
all basic register read/write implemented

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:4ad9373787e8 1 /**
Rhyme 0:4ad9373787e8 2 * MAX30101
Rhyme 0:4ad9373787e8 3 * High-Sensitivity Pulse Oximeter and
Rhyme 0:4ad9373787e8 4 * Heart-Rate Sensor for Wearable Health
Rhyme 0:4ad9373787e8 5 */
Rhyme 0:4ad9373787e8 6 #include "mbed.h"
Rhyme 0:4ad9373787e8 7 #include "MAX30101.h"
Rhyme 0:4ad9373787e8 8
Rhyme 0:4ad9373787e8 9 /* Status */
Rhyme 0:4ad9373787e8 10 #define REG_INT_MSB 0x00 /* Interrupt Status 1 */
Rhyme 0:4ad9373787e8 11 #define REG_INT_LSB 0x01 /* Interrupt Status 2 */
Rhyme 0:4ad9373787e8 12 #define REG_INT_ENB_MSB 0x02 /* Interrupt Enable 1 */
Rhyme 0:4ad9373787e8 13 #define REG_INT_ENB_LSB 0x03 /* Interrupt Enable 2 */
Rhyme 0:4ad9373787e8 14 /* FIFO */
Rhyme 0:4ad9373787e8 15 #define REG_FIFO_WR_PTR 0x04 /* FIFO Write Pointer */
Rhyme 0:4ad9373787e8 16 #define REG_OVF_COUNTER 0x05 /* Overflow Counter */
Rhyme 0:4ad9373787e8 17 #define REG_FIFO_RD_PTR 0x06 /* FIFO Read Pointer */
Rhyme 0:4ad9373787e8 18 #define REG_FIFO_DATA 0x07 /* FIFO Data Register */
Rhyme 0:4ad9373787e8 19 /* Configuration */
Rhyme 0:4ad9373787e8 20 #define REG_FIFO_CONFIG 0x08 /* FIFO Configuration */
Rhyme 0:4ad9373787e8 21 #define REG_MODE_CONFIG 0x09 /* Mode Configuration */
Rhyme 0:4ad9373787e8 22 #define REG_SPO2_CONFIG 0x0A /* SpO2 Configuration */
Rhyme 0:4ad9373787e8 23 /* reserved 0x0B */
Rhyme 0:4ad9373787e8 24 #define REG_LED1_PA 0x0C /* LED Pulse Amplitude 1 */
Rhyme 0:4ad9373787e8 25 #define REG_LED2_PA 0x0D /* LED Pulse Amplitude 2 */
Rhyme 0:4ad9373787e8 26 #define REG_LED3_PA 0x0E /* LED Pulse Amplitude 3 */
Rhyme 0:4ad9373787e8 27 /* reserved 0x0F */
Rhyme 0:4ad9373787e8 28 #define REG_PILOT_PA 0x10 /* Proximity LED Pulse Amplitude */
Rhyme 0:4ad9373787e8 29 #define REG_SLOT_MSB 0x11 /* Multi-LED Mode Control Registers 2, 1 */
Rhyme 0:4ad9373787e8 30 #define REG_SLOT_LSB 0x12 /* Multi-LED Mode Control Registers 4, 3 */
Rhyme 0:4ad9373787e8 31 /* DIE Temperature */
Rhyme 0:4ad9373787e8 32 #define REG_TEMP_INT 0x1F /* Die Temperature Integer */
Rhyme 0:4ad9373787e8 33 #define REG_TEMP_FRAC 0x20 /* Die Temperature Fraction */
Rhyme 0:4ad9373787e8 34 #define REG_TEMP_EN 0x21 /* Die Temperature Config */
Rhyme 0:4ad9373787e8 35 /* Proximity Function */
Rhyme 1:fc677d82d0f1 36 #define REG_PROX_INT_THR 0x30 /* Proximity Interrupt Threshold */
Rhyme 0:4ad9373787e8 37 /* Part ID */
Rhyme 0:4ad9373787e8 38 #define REG_REV_ID 0xFE /* Revision ID */
Rhyme 0:4ad9373787e8 39 #define REG_PART_ID 0xFF /* Part ID: 0x15 */
Rhyme 0:4ad9373787e8 40
Rhyme 0:4ad9373787e8 41 MAX30101::MAX30101(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
Rhyme 0:4ad9373787e8 42 // activate the peripheral
Rhyme 0:4ad9373787e8 43 }
Rhyme 0:4ad9373787e8 44
Rhyme 0:4ad9373787e8 45 MAX30101::~MAX30101() { }
Rhyme 0:4ad9373787e8 46
Rhyme 0:4ad9373787e8 47 void MAX30101::readRegs(int addr, uint8_t * data, int len) {
Rhyme 0:4ad9373787e8 48 char t[1] = {addr} ;
Rhyme 0:4ad9373787e8 49 m_i2c.write(m_addr, t, 1, true) ;
Rhyme 0:4ad9373787e8 50 m_i2c.read(m_addr, (char*)data, len) ;
Rhyme 0:4ad9373787e8 51 }
Rhyme 0:4ad9373787e8 52
Rhyme 0:4ad9373787e8 53 void MAX30101::writeRegs(uint8_t * data, int len) {
Rhyme 0:4ad9373787e8 54 m_i2c.write(m_addr, (char *)data, len) ;
Rhyme 0:4ad9373787e8 55 }
Rhyme 0:4ad9373787e8 56
Rhyme 0:4ad9373787e8 57 uint8_t MAX30101::getID(void)
Rhyme 0:4ad9373787e8 58 {
Rhyme 0:4ad9373787e8 59 uint8_t id ;
Rhyme 0:4ad9373787e8 60 readRegs(REG_PART_ID, &id, 1) ;
Rhyme 0:4ad9373787e8 61 return( id ) ;
Rhyme 0:4ad9373787e8 62 }
Rhyme 0:4ad9373787e8 63
Rhyme 0:4ad9373787e8 64 uint8_t MAX30101::getRev(void)
Rhyme 0:4ad9373787e8 65 {
Rhyme 0:4ad9373787e8 66 uint8_t rev ;
Rhyme 0:4ad9373787e8 67 readRegs(REG_REV_ID, &rev, 1) ;
Rhyme 0:4ad9373787e8 68 return( rev ) ;
Rhyme 1:fc677d82d0f1 69 }
Rhyme 1:fc677d82d0f1 70
Rhyme 1:fc677d82d0f1 71 uint16_t MAX30101::getIntStatus(void)
Rhyme 1:fc677d82d0f1 72 {
Rhyme 1:fc677d82d0f1 73 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 74 uint16_t value ;
Rhyme 1:fc677d82d0f1 75 readRegs(REG_INT_MSB, res, 2) ;
Rhyme 1:fc677d82d0f1 76 value = (res[0] << 8) | res[1] ;
Rhyme 1:fc677d82d0f1 77 return( value ) ;
Rhyme 1:fc677d82d0f1 78 }
Rhyme 1:fc677d82d0f1 79
Rhyme 1:fc677d82d0f1 80 void MAX30101::setIntEnable(uint16_t mask)
Rhyme 1:fc677d82d0f1 81 {
Rhyme 1:fc677d82d0f1 82 uint8_t res[3] ;
Rhyme 1:fc677d82d0f1 83 res[0] = REG_INT_MSB ;
Rhyme 1:fc677d82d0f1 84 res[1] = (mask >> 8) & 0xFF ;
Rhyme 1:fc677d82d0f1 85 res[2] = (mask & 0xFF) ;
Rhyme 1:fc677d82d0f1 86 writeRegs(res, 3) ;
Rhyme 1:fc677d82d0f1 87 }
Rhyme 1:fc677d82d0f1 88
Rhyme 1:fc677d82d0f1 89 uint8_t MAX30101::getFIFO_WR_PTR(void)
Rhyme 1:fc677d82d0f1 90 {
Rhyme 1:fc677d82d0f1 91 uint8_t data ;
Rhyme 1:fc677d82d0f1 92 readRegs(REG_FIFO_WR_PTR, &data, 1) ;
Rhyme 1:fc677d82d0f1 93 return( data ) ;
Rhyme 1:fc677d82d0f1 94 }
Rhyme 1:fc677d82d0f1 95
Rhyme 1:fc677d82d0f1 96 void MAX30101::setFIFO_WR_PTR(uint8_t data)
Rhyme 1:fc677d82d0f1 97 {
Rhyme 1:fc677d82d0f1 98 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 99 res[0] = REG_FIFO_WR_PTR ;
Rhyme 1:fc677d82d0f1 100 res[1] = data ;
Rhyme 1:fc677d82d0f1 101 writeRegs(res, 2) ;
Rhyme 1:fc677d82d0f1 102 }
Rhyme 1:fc677d82d0f1 103
Rhyme 1:fc677d82d0f1 104 uint8_t MAX30101::getOVF_COUNTER(void)
Rhyme 1:fc677d82d0f1 105 {
Rhyme 1:fc677d82d0f1 106 uint8_t data ;
Rhyme 1:fc677d82d0f1 107 readRegs(REG_OVF_COUNTER, &data, 1) ;
Rhyme 1:fc677d82d0f1 108 return( data ) ;
Rhyme 1:fc677d82d0f1 109 }
Rhyme 1:fc677d82d0f1 110
Rhyme 1:fc677d82d0f1 111 void MAX30101::setOVF_COUNTER(uint8_t data)
Rhyme 1:fc677d82d0f1 112 {
Rhyme 1:fc677d82d0f1 113 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 114 res[0] = REG_OVF_COUNTER ;
Rhyme 1:fc677d82d0f1 115 res[1] = data ;
Rhyme 1:fc677d82d0f1 116 writeRegs(res, 2) ;
Rhyme 1:fc677d82d0f1 117 }
Rhyme 1:fc677d82d0f1 118
Rhyme 1:fc677d82d0f1 119 uint8_t MAX30101::getFIFO_RD_PTR(void)
Rhyme 1:fc677d82d0f1 120 {
Rhyme 1:fc677d82d0f1 121 uint8_t data ;
Rhyme 1:fc677d82d0f1 122 readRegs(REG_FIFO_RD_PTR, &data, 1) ;
Rhyme 1:fc677d82d0f1 123 return( data ) ;
Rhyme 1:fc677d82d0f1 124 }
Rhyme 1:fc677d82d0f1 125
Rhyme 1:fc677d82d0f1 126 void MAX30101::setFIFO_RD_PTR(uint8_t data)
Rhyme 1:fc677d82d0f1 127 {
Rhyme 1:fc677d82d0f1 128 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 129 res[0] = REG_FIFO_RD_PTR ;
Rhyme 1:fc677d82d0f1 130 res[1] = data ;
Rhyme 1:fc677d82d0f1 131 writeRegs(res, 2) ;
Rhyme 1:fc677d82d0f1 132 }
Rhyme 1:fc677d82d0f1 133
Rhyme 1:fc677d82d0f1 134 uint8_t MAX30101::getFIFO_DATA(void)
Rhyme 1:fc677d82d0f1 135 {
Rhyme 1:fc677d82d0f1 136 uint8_t data ;
Rhyme 1:fc677d82d0f1 137 readRegs(REG_FIFO_DATA, &data, 1) ;
Rhyme 1:fc677d82d0f1 138 return( data ) ;
Rhyme 1:fc677d82d0f1 139 }
Rhyme 1:fc677d82d0f1 140
Rhyme 1:fc677d82d0f1 141 void MAX30101::setFIFO_DATA(uint8_t data)
Rhyme 1:fc677d82d0f1 142 {
Rhyme 1:fc677d82d0f1 143 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 144 res[0] = REG_FIFO_DATA ;
Rhyme 1:fc677d82d0f1 145 res[1] = data ;
Rhyme 1:fc677d82d0f1 146 writeRegs(res, 2) ;
Rhyme 1:fc677d82d0f1 147 }
Rhyme 1:fc677d82d0f1 148
Rhyme 1:fc677d82d0f1 149 uint8_t MAX30101::getFIFO_CONFIG(void)
Rhyme 1:fc677d82d0f1 150 {
Rhyme 1:fc677d82d0f1 151 uint8_t data ;
Rhyme 1:fc677d82d0f1 152 readRegs(REG_FIFO_CONFIG, &data, 1) ;
Rhyme 1:fc677d82d0f1 153 return( data ) ;
Rhyme 1:fc677d82d0f1 154 }
Rhyme 1:fc677d82d0f1 155
Rhyme 1:fc677d82d0f1 156 void MAX30101::setFIFO_CONFIG(uint8_t data)
Rhyme 1:fc677d82d0f1 157 {
Rhyme 1:fc677d82d0f1 158 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 159 res[0] = REG_FIFO_CONFIG ;
Rhyme 1:fc677d82d0f1 160 res[1] = data ;
Rhyme 1:fc677d82d0f1 161 writeRegs(res, 2) ;
Rhyme 1:fc677d82d0f1 162 }
Rhyme 1:fc677d82d0f1 163
Rhyme 1:fc677d82d0f1 164 uint8_t MAX30101::getMODE_CONFIG(void)
Rhyme 1:fc677d82d0f1 165 {
Rhyme 1:fc677d82d0f1 166 uint8_t data ;
Rhyme 1:fc677d82d0f1 167 readRegs(REG_MODE_CONFIG, &data, 1) ;
Rhyme 1:fc677d82d0f1 168 return( data ) ;
Rhyme 1:fc677d82d0f1 169 }
Rhyme 1:fc677d82d0f1 170
Rhyme 1:fc677d82d0f1 171 void MAX30101::setMODE_CONFIG(uint8_t data)
Rhyme 1:fc677d82d0f1 172 {
Rhyme 1:fc677d82d0f1 173 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 174 res[0] = REG_MODE_CONFIG ;
Rhyme 1:fc677d82d0f1 175 res[1] = data ;
Rhyme 1:fc677d82d0f1 176 writeRegs(res, 2) ;
Rhyme 1:fc677d82d0f1 177 }
Rhyme 1:fc677d82d0f1 178
Rhyme 1:fc677d82d0f1 179 uint8_t MAX30101::getSPO2_CONFIG(void)
Rhyme 1:fc677d82d0f1 180 {
Rhyme 1:fc677d82d0f1 181 uint8_t data ;
Rhyme 1:fc677d82d0f1 182 readRegs(REG_SPO2_CONFIG, &data, 1) ;
Rhyme 1:fc677d82d0f1 183 return( data ) ;
Rhyme 1:fc677d82d0f1 184 }
Rhyme 1:fc677d82d0f1 185
Rhyme 1:fc677d82d0f1 186 void MAX30101::setSPO2_CONFIG(uint8_t data)
Rhyme 1:fc677d82d0f1 187 {
Rhyme 1:fc677d82d0f1 188 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 189 res[0] = REG_SPO2_CONFIG ;
Rhyme 1:fc677d82d0f1 190 res[1] = data ;
Rhyme 1:fc677d82d0f1 191 writeRegs(res, 2) ;
Rhyme 1:fc677d82d0f1 192 }
Rhyme 1:fc677d82d0f1 193
Rhyme 1:fc677d82d0f1 194 uint8_t MAX30101::getLED1_PA(void)
Rhyme 1:fc677d82d0f1 195 {
Rhyme 1:fc677d82d0f1 196 uint8_t data ;
Rhyme 1:fc677d82d0f1 197 readRegs(REG_LED1_PA, &data, 1) ;
Rhyme 1:fc677d82d0f1 198 return( data ) ;
Rhyme 1:fc677d82d0f1 199 }
Rhyme 1:fc677d82d0f1 200
Rhyme 1:fc677d82d0f1 201 void MAX30101::setLED1_PA(uint8_t data)
Rhyme 1:fc677d82d0f1 202 {
Rhyme 1:fc677d82d0f1 203 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 204 res[0] = REG_LED1_PA ;
Rhyme 1:fc677d82d0f1 205 res[1] = data ;
Rhyme 1:fc677d82d0f1 206 writeRegs(res, 2) ;
Rhyme 1:fc677d82d0f1 207 }
Rhyme 1:fc677d82d0f1 208
Rhyme 1:fc677d82d0f1 209 uint8_t MAX30101::getLED2_PA(void)
Rhyme 1:fc677d82d0f1 210 {
Rhyme 1:fc677d82d0f1 211 uint8_t data ;
Rhyme 1:fc677d82d0f1 212 readRegs(REG_LED2_PA, &data, 1) ;
Rhyme 1:fc677d82d0f1 213 return( data ) ;
Rhyme 1:fc677d82d0f1 214 }
Rhyme 1:fc677d82d0f1 215
Rhyme 1:fc677d82d0f1 216 void MAX30101::setLED2_PA(uint8_t data)
Rhyme 1:fc677d82d0f1 217 {
Rhyme 1:fc677d82d0f1 218 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 219 res[0] = REG_LED2_PA ;
Rhyme 1:fc677d82d0f1 220 res[1] = data ;
Rhyme 1:fc677d82d0f1 221 writeRegs(res, 2) ;
Rhyme 1:fc677d82d0f1 222 }
Rhyme 1:fc677d82d0f1 223
Rhyme 1:fc677d82d0f1 224 uint8_t MAX30101::getLED3_PA(void)
Rhyme 1:fc677d82d0f1 225 {
Rhyme 1:fc677d82d0f1 226 uint8_t data ;
Rhyme 1:fc677d82d0f1 227 readRegs(REG_LED3_PA, &data, 1) ;
Rhyme 1:fc677d82d0f1 228 return( data ) ;
Rhyme 1:fc677d82d0f1 229 }
Rhyme 1:fc677d82d0f1 230
Rhyme 1:fc677d82d0f1 231 void MAX30101::setLED3_PA(uint8_t data)
Rhyme 1:fc677d82d0f1 232 {
Rhyme 1:fc677d82d0f1 233 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 234 res[0] = REG_LED3_PA ;
Rhyme 1:fc677d82d0f1 235 res[1] = data ;
Rhyme 1:fc677d82d0f1 236 writeRegs(res, 2) ;
Rhyme 1:fc677d82d0f1 237 }
Rhyme 1:fc677d82d0f1 238
Rhyme 1:fc677d82d0f1 239 uint8_t MAX30101::getPILOT_PA(void)
Rhyme 1:fc677d82d0f1 240 {
Rhyme 1:fc677d82d0f1 241 uint8_t data ;
Rhyme 1:fc677d82d0f1 242 readRegs(REG_PILOT_PA, &data, 1) ;
Rhyme 1:fc677d82d0f1 243 return( data ) ;
Rhyme 1:fc677d82d0f1 244 }
Rhyme 1:fc677d82d0f1 245
Rhyme 1:fc677d82d0f1 246 void MAX30101::setPILOT_PA(uint8_t data)
Rhyme 1:fc677d82d0f1 247 {
Rhyme 1:fc677d82d0f1 248 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 249 res[0] = REG_PILOT_PA ;
Rhyme 1:fc677d82d0f1 250 res[1] = data ;
Rhyme 1:fc677d82d0f1 251 writeRegs(res, 2) ;
Rhyme 1:fc677d82d0f1 252 }
Rhyme 1:fc677d82d0f1 253
Rhyme 1:fc677d82d0f1 254 uint16_t MAX30101::getSLOT(void)
Rhyme 1:fc677d82d0f1 255 {
Rhyme 1:fc677d82d0f1 256 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 257 uint16_t data ;
Rhyme 1:fc677d82d0f1 258 readRegs(REG_SLOT_MSB, res, 2) ;
Rhyme 1:fc677d82d0f1 259 data = (res[0] << 8) | res[1] ;
Rhyme 1:fc677d82d0f1 260 return( data ) ;
Rhyme 1:fc677d82d0f1 261 }
Rhyme 1:fc677d82d0f1 262
Rhyme 1:fc677d82d0f1 263 void MAX30101::setSLOT(uint16_t data)
Rhyme 1:fc677d82d0f1 264 {
Rhyme 1:fc677d82d0f1 265 uint8_t res[3] ;
Rhyme 1:fc677d82d0f1 266 res[0] = REG_SLOT_MSB ;
Rhyme 1:fc677d82d0f1 267 res[1] = (data >> 8) & 0xFF ;
Rhyme 1:fc677d82d0f1 268 res[2] = data & 0xFF ;
Rhyme 1:fc677d82d0f1 269 writeRegs(res, 3) ;
Rhyme 1:fc677d82d0f1 270 }
Rhyme 1:fc677d82d0f1 271
Rhyme 1:fc677d82d0f1 272 uint8_t MAX30101::getTEMP_INT(void)
Rhyme 1:fc677d82d0f1 273 {
Rhyme 1:fc677d82d0f1 274 uint8_t data ;
Rhyme 1:fc677d82d0f1 275 readRegs(REG_TEMP_INT, &data, 1) ;
Rhyme 1:fc677d82d0f1 276 return( data ) ;
Rhyme 1:fc677d82d0f1 277 }
Rhyme 1:fc677d82d0f1 278
Rhyme 1:fc677d82d0f1 279 uint8_t MAX30101::getTEMP_FRAM(void)
Rhyme 1:fc677d82d0f1 280 {
Rhyme 1:fc677d82d0f1 281 uint8_t data ;
Rhyme 1:fc677d82d0f1 282 readRegs(REG_TEMP_FRAC, &data, 1) ;
Rhyme 1:fc677d82d0f1 283 return( data ) ;
Rhyme 1:fc677d82d0f1 284 }
Rhyme 1:fc677d82d0f1 285
Rhyme 1:fc677d82d0f1 286 uint8_t MAX30101::getTEMP_EN(void)
Rhyme 1:fc677d82d0f1 287 {
Rhyme 1:fc677d82d0f1 288 uint8_t data ;
Rhyme 1:fc677d82d0f1 289 readRegs(REG_TEMP_EN, &data, 1) ;
Rhyme 1:fc677d82d0f1 290 return( data ) ;
Rhyme 1:fc677d82d0f1 291 }
Rhyme 1:fc677d82d0f1 292
Rhyme 1:fc677d82d0f1 293 uint8_t MAX30101::getPROX_INT_THR(void)
Rhyme 1:fc677d82d0f1 294 {
Rhyme 1:fc677d82d0f1 295 uint8_t data ;
Rhyme 1:fc677d82d0f1 296 readRegs(REG_PROX_INT_THR, &data, 1) ;
Rhyme 1:fc677d82d0f1 297 return( data ) ;
Rhyme 1:fc677d82d0f1 298 }
Rhyme 1:fc677d82d0f1 299
Rhyme 1:fc677d82d0f1 300 void MAX30101::setPROX_INT_THR(uint8_t data)
Rhyme 1:fc677d82d0f1 301 {
Rhyme 1:fc677d82d0f1 302 uint8_t res[2] ;
Rhyme 1:fc677d82d0f1 303 res[0] = REG_PROX_INT_THR ;
Rhyme 1:fc677d82d0f1 304 res[1] = data ;
Rhyme 1:fc677d82d0f1 305 writeRegs(res, 2) ;
Rhyme 1:fc677d82d0f1 306 }
Rhyme 1:fc677d82d0f1 307