心拍・酸素飽和度モニタモジュール MAXREFDES117から取得した心拍の値をシリアルコンソールに表示するプログラムです。

Dependencies:   microbit

Fork of microbit-component-display by BBC

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MAX30102.cpp Source File

MAX30102.cpp

00001 #include "mbed.h"
00002 #include "MAX30102.h"
00003 
00004 bool MAX30102::write_reg(uint8_t uch_addr, uint8_t uch_data)
00005 {
00006   char ach_i2c_data[2];
00007   ach_i2c_data[0]=uch_addr;
00008   ach_i2c_data[1]=uch_data;
00009   
00010   if(_i2c.write(I2C_ADDR, ach_i2c_data, 2, false)==0) return true;
00011   else  return false;
00012 }
00013 
00014 bool MAX30102::read_reg(uint8_t uch_addr, uint8_t *puch_data)
00015 {
00016   char ch_i2c_data;
00017   ch_i2c_data=uch_addr;
00018 
00019   if(_i2c.write(I2C_ADDR, &ch_i2c_data, 1, true)!=0)  return false;
00020 
00021   if(_i2c.read(I2C_ADDR | 0x01, &ch_i2c_data, 1, false)==0)
00022   {
00023     *puch_data=(uint8_t) ch_i2c_data;
00024     return true;
00025   }
00026   else
00027     return false;
00028 }
00029 
00030 bool MAX30102::init()
00031 {
00032   if(!write_reg(REG_INTR_ENABLE_1,0xc0))  return false;
00033   if(!write_reg(REG_INTR_ENABLE_2,0x00))  return false;
00034   if(!write_reg(REG_FIFO_WR_PTR,0x00))    return false;
00035   if(!write_reg(REG_OVF_COUNTER,0x00))    return false;
00036   if(!write_reg(REG_FIFO_RD_PTR,0x00))    return false;
00037   if(!write_reg(REG_FIFO_CONFIG,0x0f))    return false;
00038   if(!write_reg(REG_MODE_CONFIG,0x03))    return false;
00039   if(!write_reg(REG_SPO2_CONFIG,0x27))    return false;
00040   if(!write_reg(REG_LED1_PA,0x24))        return false;
00041   if(!write_reg(REG_LED2_PA,0x24))        return false;
00042   if(!write_reg(REG_PILOT_PA,0x7f))       return false;
00043   return true;  
00044 }
00045 
00046 bool MAX30102::read_fifo(uint32_t *pun_red_led, uint32_t *pun_ir_led)
00047 {
00048   uint32_t un_temp;
00049   unsigned char uch_temp;
00050   *pun_red_led=0;
00051   *pun_ir_led=0;
00052   char ach_i2c_data[6];
00053   
00054   read_reg(REG_INTR_STATUS_1, &uch_temp);
00055   read_reg(REG_INTR_STATUS_2, &uch_temp);
00056   
00057   ach_i2c_data[0]=REG_FIFO_DATA;
00058   if(_i2c.write(I2C_ADDR, ach_i2c_data, 1, true)!=0) return false;
00059   if(_i2c.read(I2C_ADDR | 0x01, ach_i2c_data, 6, false)!=0)  return false;
00060 
00061   un_temp=(unsigned char) ach_i2c_data[0];
00062   un_temp<<=16;
00063   *pun_red_led+=un_temp;
00064   un_temp=(unsigned char) ach_i2c_data[1];
00065   un_temp<<=8;
00066   *pun_red_led+=un_temp;
00067   un_temp=(unsigned char) ach_i2c_data[2];
00068   *pun_red_led+=un_temp;
00069   
00070   un_temp=(unsigned char) ach_i2c_data[3];
00071   un_temp<<=16;
00072   *pun_ir_led+=un_temp;
00073   un_temp=(unsigned char) ach_i2c_data[4];
00074   un_temp<<=8;
00075   *pun_ir_led+=un_temp;
00076   un_temp=(unsigned char) ach_i2c_data[5];
00077   *pun_ir_led+=un_temp;
00078   *pun_red_led&=0x03FFFF;  //Mask MSB [23:18]
00079   *pun_ir_led&=0x03FFFF;  //Mask MSB [23:18]
00080   
00081   
00082   return true;
00083 }
00084 
00085 bool MAX30102::reset()
00086 {
00087     if(!write_reg(REG_MODE_CONFIG,0x40))  return false;
00088     else  return true;    
00089 }