OB1203 basic mbed driver

Dependents:   OB1203_IDT

Committer:
laserdad
Date:
Thu May 03 04:32:03 2018 +0000
Revision:
2:3cba0fe6db60
Parent:
1:99ca9c464503
Child:
4:f25ca600a0e6
SpO2 working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
laserdad 0:2da1f69b38fd 1 #ifndef __OB1203_H__
laserdad 0:2da1f69b38fd 2 #define __OB1203_H__
laserdad 0:2da1f69b38fd 3
laserdad 0:2da1f69b38fd 4 #include "mbed.h"
laserdad 0:2da1f69b38fd 5
laserdad 1:99ca9c464503 6 //#define DEBUG
laserdad 0:2da1f69b38fd 7
laserdad 0:2da1f69b38fd 8 #define OB1203_ADDR 0xA6
laserdad 0:2da1f69b38fd 9
laserdad 0:2da1f69b38fd 10 //Define registers
laserdad 0:2da1f69b38fd 11 #define REG_STATUS_0 0x00
laserdad 0:2da1f69b38fd 12 #define REG_STATUS_1 0x01
laserdad 0:2da1f69b38fd 13 #define REG_PS_DATA 0x02
laserdad 0:2da1f69b38fd 14 #define REG_LS_W_DATA 0x04
laserdad 0:2da1f69b38fd 15 #define REG_LS_G_DATA 0x07
laserdad 0:2da1f69b38fd 16 #define REG_LS_B_DATA 0x0A
laserdad 0:2da1f69b38fd 17 #define REG_LS_R_DATA 0x0D
laserdad 0:2da1f69b38fd 18 #define REG_LS_C_DATA 0x10
laserdad 0:2da1f69b38fd 19 #define REG_MAIN_CTRL_0 0x15
laserdad 0:2da1f69b38fd 20 #define REG_MAIN_CTRL_1 0x16
laserdad 0:2da1f69b38fd 21 #define REG_PS_LED_CURR 0x17
laserdad 0:2da1f69b38fd 22 #define REG_PS_CAN_PULSES 0x19
laserdad 0:2da1f69b38fd 23 #define REG_PS_PWIDTH_RATE 0x1A
laserdad 0:2da1f69b38fd 24 #define REG_PS_CAN_DIG 0x1B
laserdad 0:2da1f69b38fd 25 #define REG_PS_MOV_AVG_HYS 0x1D
laserdad 0:2da1f69b38fd 26 #define REG_PS_THRES_HI 0x1E
laserdad 0:2da1f69b38fd 27 #define REG_PS_THRES_LO 0x20
laserdad 0:2da1f69b38fd 28 #define REG_LS_RES_RATE 0x22
laserdad 0:2da1f69b38fd 29 #define REG_LS_GAIN 0x23
laserdad 0:2da1f69b38fd 30 #define REG_LS_THRES_HI 0x24
laserdad 0:2da1f69b38fd 31 #define REG_LS_THRES_LO 0x27
laserdad 0:2da1f69b38fd 32 #define REG_LS_THRES_VAR 0x2A
laserdad 0:2da1f69b38fd 33 #define REG_INT_CFG_0 0x2B
laserdad 0:2da1f69b38fd 34 #define REG_PS_INT_CFG_1 0x2C
laserdad 0:2da1f69b38fd 35 #define REG_INT_PST 0x2D
laserdad 0:2da1f69b38fd 36 #define REG_PPG_PS_GAIN 0x2E
laserdad 0:2da1f69b38fd 37 #define REG_PPG_PS_CFG 0x2F
laserdad 0:2da1f69b38fd 38 #define REG_PPG_IRLED_CURR 0x30
laserdad 0:2da1f69b38fd 39 #define REG_PPG_RLED_CURR 0x32
laserdad 0:2da1f69b38fd 40 #define REG_PPG_CAN_ANA 0x34
laserdad 0:2da1f69b38fd 41 #define REG_PPG_AVG 0x35
laserdad 0:2da1f69b38fd 42 #define REG_PPG_PWIDTH_RATE 0x36
laserdad 0:2da1f69b38fd 43 #define REG_FIFO_CFG 0x37
laserdad 0:2da1f69b38fd 44 #define REG_FIFO_WR_PTR 0x38
laserdad 0:2da1f69b38fd 45 #define REG_FIFO_RD_PTR 0x39
laserdad 0:2da1f69b38fd 46 #define REG_FIFO_OVF_CNT 0x3A
laserdad 0:2da1f69b38fd 47 #define REG_FIFO_DATA 0x3B
laserdad 0:2da1f69b38fd 48 #define REG_PART_ID 0x3D
laserdad 0:2da1f69b38fd 49 #define REG_DEVICE_CFG 0x4D
laserdad 0:2da1f69b38fd 50
laserdad 0:2da1f69b38fd 51 //Define settings
laserdad 0:2da1f69b38fd 52 //STATUS_0
laserdad 0:2da1f69b38fd 53 #define POR_STATUS 0x80
laserdad 0:2da1f69b38fd 54 #define LS_INT_STATUS 0x02
laserdad 0:2da1f69b38fd 55 #define LS_NEW_DATA 0x01
laserdad 0:2da1f69b38fd 56 //STATUS_1
laserdad 0:2da1f69b38fd 57 #define LED_DRIVER_STATUS 0x40
laserdad 0:2da1f69b38fd 58 #define FIFO_AFULL_STATUS 0x20
laserdad 0:2da1f69b38fd 59 #define PPG_DATA_STATUS 0x10
laserdad 0:2da1f69b38fd 60 #define PS_LOGIC_STATUS 0x04
laserdad 0:2da1f69b38fd 61 #define PS_INT_STATUS 0x02
laserdad 0:2da1f69b38fd 62 #define PS_NEW_DATA 0x01
laserdad 0:2da1f69b38fd 63 //MAIN_CTRL_0
laserdad 0:2da1f69b38fd 64 #define SW_RESET 0x01<<7
laserdad 0:2da1f69b38fd 65 #define LS_SAI_ON 0x01<<3
laserdad 0:2da1f69b38fd 66 #define LS_SAI_OFF 0x00
laserdad 0:2da1f69b38fd 67 #define ALS_MODE 0x00
laserdad 0:2da1f69b38fd 68 #define RGB_MODE 0x01<<1
laserdad 0:2da1f69b38fd 69 #define LS_OFF 0x00
laserdad 0:2da1f69b38fd 70 #define LS_ON 0x01
laserdad 0:2da1f69b38fd 71 //MAIN_CTRL_1
laserdad 0:2da1f69b38fd 72 #define PS_SAI_ON 0x01<<3
laserdad 0:2da1f69b38fd 73 #define PS_SAI_OFF 0x00
laserdad 0:2da1f69b38fd 74 #define PS_MODE 0x00
laserdad 0:2da1f69b38fd 75 #define HR_MODE 0x01<<1
laserdad 0:2da1f69b38fd 76 #define SPO2_MODE 0x02<<1
laserdad 0:2da1f69b38fd 77 #define PPG_PS_ON 0x01
laserdad 0:2da1f69b38fd 78 #define PPG_PS_OFF 0x00
laserdad 0:2da1f69b38fd 79 //PS_CAN_PULSES
laserdad 0:2da1f69b38fd 80 #define PS_CAN_ANA_0 0x00 //off
laserdad 0:2da1f69b38fd 81 #define PS_CAN_ANA_1 0x01<<6 //50% of FS
laserdad 0:2da1f69b38fd 82 #define PS_CAN_ANA_2 0x02<<6 //100% of FS
laserdad 0:2da1f69b38fd 83 #define PS_CAN_ANA_3 0x03<<6 //150% of FS
laserdad 1:99ca9c464503 84 #define PS_PULSES(x) (( (x) & (0x07) )<<3) //where x = 0..5 and num pulses = 2^x
laserdad 0:2da1f69b38fd 85 //PS_PWIDTH_RATE
laserdad 0:2da1f69b38fd 86 #define PS_PWIDTH(x) (x & 0x03)<<4 //where x = 0..3
laserdad 0:2da1f69b38fd 87 #define PS_RATE(x) (x & 0x07) //where x = 0..7
laserdad 0:2da1f69b38fd 88 //PS_MOV_AVG_HYS
laserdad 0:2da1f69b38fd 89 #define PS_AVG_ON 1<<7
laserdad 0:2da1f69b38fd 90 #define PS_AVG_OFF 0
laserdad 0:2da1f69b38fd 91 #define PS_HYS_LEVEL(x) x>>1 //where x=0..256
laserdad 0:2da1f69b38fd 92 //LS_RES_RATE
laserdad 0:2da1f69b38fd 93 #define LS_RES(x) (x & 0x07)<<4 //where x=0..7
laserdad 0:2da1f69b38fd 94 #define LS_RATE(x) (x & 0x07) //where x=0..7
laserdad 0:2da1f69b38fd 95 //LS_GAIN
laserdad 0:2da1f69b38fd 96 #define LS_GAIN(x) (x & 0x03)
laserdad 0:2da1f69b38fd 97 //LS_THRES_VAR
laserdad 0:2da1f69b38fd 98 #define LS_THRES_VAR(x) (x & 0x07)
laserdad 0:2da1f69b38fd 99 //INT_CFG_0
laserdad 0:2da1f69b38fd 100 #define LS_INT_SEL_W 0
laserdad 0:2da1f69b38fd 101 #define LS_INT_SEL_G 1<<4
laserdad 0:2da1f69b38fd 102 #define LS_INT_SEL_R 2<<4
laserdad 0:2da1f69b38fd 103 #define LS_INT_SEL_B 3<<4
laserdad 0:2da1f69b38fd 104 #define LS_THRES_INT_MODE 0
laserdad 0:2da1f69b38fd 105 #define LS_VAR_INT_MODE 1<<1
laserdad 0:2da1f69b38fd 106 #define LS_INT_ON 1
laserdad 0:2da1f69b38fd 107 #define LS_INT_OFF 0
laserdad 0:2da1f69b38fd 108 //INT_CFG_1
laserdad 0:2da1f69b38fd 109 #define AFULL_INT_ON 1<<5
laserdad 0:2da1f69b38fd 110 #define AFULL_INT_OFF 0
laserdad 0:2da1f69b38fd 111 #define PPG_INT_ON 1<<4
laserdad 0:2da1f69b38fd 112 #define PPG_INT_OFF 0
laserdad 2:3cba0fe6db60 113 #define PS_INT_READ_CLEARS 0<<1
laserdad 2:3cba0fe6db60 114 #define PS_INT_NO_CLEAR 1
laserdad 0:2da1f69b38fd 115 #define PS_INT_ON 1
laserdad 0:2da1f69b38fd 116 #define PS_INT_OFF 0
laserdad 0:2da1f69b38fd 117 //INT_PST
laserdad 0:2da1f69b38fd 118 #define LS_PERSIST(x) (x & 0x0F)<<4
laserdad 0:2da1f69b38fd 119 #define PS_PERSIST(x) (x & 0x0F)
laserdad 0:2da1f69b38fd 120 //PPG_PS_GAIN
laserdad 0:2da1f69b38fd 121 #define PPG_PS_GAIN_1 0
laserdad 0:2da1f69b38fd 122 #define PPG_PS_GAIN_1P5 1<<4
laserdad 0:2da1f69b38fd 123 #define PPG_PS_GAIN_2 2<<4
laserdad 0:2da1f69b38fd 124 #define PPG_PS_GAIN_4 3<<4
laserdad 0:2da1f69b38fd 125 //PPG_PS_CFG
laserdad 0:2da1f69b38fd 126 #define PPG_POW_SAVE_ON 1<<6
laserdad 0:2da1f69b38fd 127 #define PPG_POW_SAVE_OFF 0
laserdad 0:2da1f69b38fd 128 #define LED_FLIP_ON 1<<3
laserdad 0:2da1f69b38fd 129 #define LED_FLIP_OFF 0
laserdad 0:2da1f69b38fd 130 //PPG_CAN_ANA
laserdad 0:2da1f69b38fd 131 #define PPG_CH1_CAN(x) (x & 0x03)<<2
laserdad 0:2da1f69b38fd 132 #define PPG_CH2_CAN(x) (x & 0x03)
laserdad 0:2da1f69b38fd 133 //PPG_AVG
laserdad 0:2da1f69b38fd 134 #define PPG_AVG(x) (x & 0x07)<<4
laserdad 0:2da1f69b38fd 135 //PPG_PWIDTH_RATE
laserdad 0:2da1f69b38fd 136 #define PPG_PWIDTH(x) (x & 0x07)<<4
laserdad 0:2da1f69b38fd 137 #define PPG_FREQ_60HZ 0
laserdad 0:2da1f69b38fd 138 #define PPG_FREQ_50HZ 1<<3
laserdad 0:2da1f69b38fd 139 #define PPG_RATE(x) (x & 0x07)
laserdad 0:2da1f69b38fd 140 //FIFO_CFG
laserdad 0:2da1f69b38fd 141 #define FIFO_ROLL_ON 1<<4
laserdad 0:2da1f69b38fd 142 #define FIFO_ROLL_OFF 0
laserdad 0:2da1f69b38fd 143 #define AFULL_SAMPLES_LEFT(x) (x & 0x0F)
laserdad 0:2da1f69b38fd 144
laserdad 0:2da1f69b38fd 145
laserdad 0:2da1f69b38fd 146
laserdad 0:2da1f69b38fd 147
laserdad 0:2da1f69b38fd 148
laserdad 0:2da1f69b38fd 149 #define POR_TIME_MS 5 //a guess
laserdad 0:2da1f69b38fd 150
laserdad 0:2da1f69b38fd 151
laserdad 0:2da1f69b38fd 152
laserdad 0:2da1f69b38fd 153 class OB1203
laserdad 0:2da1f69b38fd 154 {
laserdad 0:2da1f69b38fd 155 I2C *i2c;
laserdad 0:2da1f69b38fd 156
laserdad 0:2da1f69b38fd 157
laserdad 0:2da1f69b38fd 158 public:
laserdad 0:2da1f69b38fd 159 char ls_res;
laserdad 0:2da1f69b38fd 160 char ls_rate;
laserdad 0:2da1f69b38fd 161 char ls_gain;
laserdad 0:2da1f69b38fd 162 uint32_t ls_thres_hi;
laserdad 0:2da1f69b38fd 163 uint32_t ls_thres_lo;
laserdad 0:2da1f69b38fd 164 char ls_sai;
laserdad 0:2da1f69b38fd 165 char ls_mode;
laserdad 0:2da1f69b38fd 166 char ls_en;
laserdad 0:2da1f69b38fd 167 char ls_int_sel;
laserdad 0:2da1f69b38fd 168 char ls_var_mode;
laserdad 0:2da1f69b38fd 169 char ps_sai_en;
laserdad 0:2da1f69b38fd 170 char ppg_ps_mode;
laserdad 0:2da1f69b38fd 171 char ppg_ps_en;
laserdad 0:2da1f69b38fd 172 char ps_can_ana;
laserdad 0:2da1f69b38fd 173 char afull_int_en;
laserdad 0:2da1f69b38fd 174 char ppg_int_en;
laserdad 0:2da1f69b38fd 175 char ps_logic_mode;
laserdad 0:2da1f69b38fd 176 uint16_t ps_digital_can;
laserdad 0:2da1f69b38fd 177 char ps_int_en;
laserdad 0:2da1f69b38fd 178 char ls_persist;
laserdad 0:2da1f69b38fd 179 char ps_persist;
laserdad 0:2da1f69b38fd 180 uint16_t ps_thres_hi;
laserdad 0:2da1f69b38fd 181 uint16_t ps_thres_lo;
laserdad 0:2da1f69b38fd 182 uint16_t ps_current;
laserdad 0:2da1f69b38fd 183 uint16_t ir_current;
laserdad 0:2da1f69b38fd 184 uint16_t r_current;
laserdad 0:2da1f69b38fd 185 char ppg_ps_gain;
laserdad 0:2da1f69b38fd 186 char ppg_pow_save;
laserdad 0:2da1f69b38fd 187 char led_flip;
laserdad 0:2da1f69b38fd 188 char ch1_can_ana;
laserdad 0:2da1f69b38fd 189 char ch2_can_ana;
laserdad 0:2da1f69b38fd 190 char ppg_avg;
laserdad 0:2da1f69b38fd 191 char ppg_pwidth;
laserdad 0:2da1f69b38fd 192 char ppg_freq;
laserdad 0:2da1f69b38fd 193 char ppg_rate;
laserdad 0:2da1f69b38fd 194 char ps_pulses;
laserdad 0:2da1f69b38fd 195 char ps_pwidth;
laserdad 0:2da1f69b38fd 196 char ps_rate;
laserdad 0:2da1f69b38fd 197 char ps_avg_en;
laserdad 0:2da1f69b38fd 198 char ps_hys_level;
laserdad 0:2da1f69b38fd 199 char ls_int_en;
laserdad 0:2da1f69b38fd 200 char fifo_rollover_en;
laserdad 0:2da1f69b38fd 201 char fifo_afull_samples_left;
laserdad 0:2da1f69b38fd 202 char writePointer;
laserdad 0:2da1f69b38fd 203 char readPointer;
laserdad 0:2da1f69b38fd 204 char fifoOverflow;
laserdad 0:2da1f69b38fd 205 OB1203 (I2C *);
laserdad 0:2da1f69b38fd 206
laserdad 0:2da1f69b38fd 207 // Low-level operations
laserdad 0:2da1f69b38fd 208 void reset();
laserdad 2:3cba0fe6db60 209 uint16_t get_status();
laserdad 0:2da1f69b38fd 210 void writeRegister(int, char, char);
laserdad 0:2da1f69b38fd 211 void writeBlock(int, char, char *, char);
laserdad 0:2da1f69b38fd 212 void readBlock(int, char, char *, int);
laserdad 0:2da1f69b38fd 213 uint32_t bytes2uint32(char *, int);
laserdad 0:2da1f69b38fd 214
laserdad 0:2da1f69b38fd 215 // High-level operations
laserdad 1:99ca9c464503 216 bool dataIsNew();
laserdad 0:2da1f69b38fd 217 void setMainConfig();
laserdad 0:2da1f69b38fd 218 void setIntConfig();
laserdad 0:2da1f69b38fd 219 void setLSthresh();
laserdad 0:2da1f69b38fd 220 void setPSthresh();
laserdad 0:2da1f69b38fd 221 void setPScurrent();
laserdad 0:2da1f69b38fd 222 void setPPGcurrent();
laserdad 0:2da1f69b38fd 223 void setPPG_PSgain_cfg();
laserdad 0:2da1f69b38fd 224 void setPPGana_can();
laserdad 0:2da1f69b38fd 225 void setDigitalCan();
laserdad 0:2da1f69b38fd 226 void setPPGavg_and_rate();
laserdad 0:2da1f69b38fd 227 void setFifoConfig();
laserdad 0:2da1f69b38fd 228 char get_ps_data(uint32_t *);
laserdad 0:2da1f69b38fd 229 char get_ls_data(uint32_t *);
laserdad 0:2da1f69b38fd 230 char get_ps_ls_data(uint32_t *);
laserdad 0:2da1f69b38fd 231 void init_ps();
laserdad 0:2da1f69b38fd 232 void init_rgb();
laserdad 0:2da1f69b38fd 233 void init_ps_rgb();
laserdad 0:2da1f69b38fd 234 void init_hr();
laserdad 0:2da1f69b38fd 235 void init_spo2();
laserdad 0:2da1f69b38fd 236 void getFifoInfo(char *fifo_info);
laserdad 0:2da1f69b38fd 237 uint8_t getNumFifoSamplesAvailable();
laserdad 0:2da1f69b38fd 238 void getFifoSamples(uint8_t, char *);
laserdad 0:2da1f69b38fd 239 void parseFifoSamples(char, char *, uint32_t *);
laserdad 0:2da1f69b38fd 240 char get_part_ID(char *);
laserdad 0:2da1f69b38fd 241
laserdad 0:2da1f69b38fd 242 //variables
laserdad 0:2da1f69b38fd 243 uint16_t rate;
laserdad 0:2da1f69b38fd 244 char res;
laserdad 0:2da1f69b38fd 245 char gain;
laserdad 0:2da1f69b38fd 246 uint32_t data_max;
laserdad 0:2da1f69b38fd 247 uint32_t reg_max;
laserdad 0:2da1f69b38fd 248
laserdad 0:2da1f69b38fd 249 };
laserdad 0:2da1f69b38fd 250
laserdad 0:2da1f69b38fd 251
laserdad 0:2da1f69b38fd 252 #endif