OB1203 basic mbed driver
OB1203.h@0:2da1f69b38fd, 2018-04-25 (annotated)
- Committer:
- laserdad
- Date:
- Wed Apr 25 05:26:34 2018 +0000
- Revision:
- 0:2da1f69b38fd
- Child:
- 1:99ca9c464503
initial commit untested
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:2da1f69b38fd | 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 | 0:2da1f69b38fd | 84 | #define PS_PULSES(x) (x & 0x07)<<3 //where x = 0..7 |
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 | 0:2da1f69b38fd | 113 | #define PS_INT_READ_CLEARS 1<<1 |
laserdad | 0:2da1f69b38fd | 114 | #define PS_INT_NO_CLEAR 0 |
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 | 0:2da1f69b38fd | 209 | int 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 | 0:2da1f69b38fd | 216 | void setMainConfig(); |
laserdad | 0:2da1f69b38fd | 217 | void setIntConfig(); |
laserdad | 0:2da1f69b38fd | 218 | void setLSthresh(); |
laserdad | 0:2da1f69b38fd | 219 | void setPSthresh(); |
laserdad | 0:2da1f69b38fd | 220 | void setPScurrent(); |
laserdad | 0:2da1f69b38fd | 221 | void setPPGcurrent(); |
laserdad | 0:2da1f69b38fd | 222 | void setPPG_PSgain_cfg(); |
laserdad | 0:2da1f69b38fd | 223 | void setPPGana_can(); |
laserdad | 0:2da1f69b38fd | 224 | void setDigitalCan(); |
laserdad | 0:2da1f69b38fd | 225 | void setPPGavg_and_rate(); |
laserdad | 0:2da1f69b38fd | 226 | void setFifoConfig(); |
laserdad | 0:2da1f69b38fd | 227 | char get_ps_data(uint32_t *); |
laserdad | 0:2da1f69b38fd | 228 | char get_ls_data(uint32_t *); |
laserdad | 0:2da1f69b38fd | 229 | char get_ps_ls_data(uint32_t *); |
laserdad | 0:2da1f69b38fd | 230 | void init_ps(); |
laserdad | 0:2da1f69b38fd | 231 | void init_rgb(); |
laserdad | 0:2da1f69b38fd | 232 | void init_ps_rgb(); |
laserdad | 0:2da1f69b38fd | 233 | void init_hr(); |
laserdad | 0:2da1f69b38fd | 234 | void init_spo2(); |
laserdad | 0:2da1f69b38fd | 235 | void getFifoInfo(char *fifo_info); |
laserdad | 0:2da1f69b38fd | 236 | uint8_t getNumFifoSamplesAvailable(); |
laserdad | 0:2da1f69b38fd | 237 | void getFifoSamples(uint8_t, char *); |
laserdad | 0:2da1f69b38fd | 238 | void parseFifoSamples(char, char *, uint32_t *); |
laserdad | 0:2da1f69b38fd | 239 | char get_part_ID(char *); |
laserdad | 0:2da1f69b38fd | 240 | |
laserdad | 0:2da1f69b38fd | 241 | //variables |
laserdad | 0:2da1f69b38fd | 242 | uint16_t rate; |
laserdad | 0:2da1f69b38fd | 243 | char res; |
laserdad | 0:2da1f69b38fd | 244 | char gain; |
laserdad | 0:2da1f69b38fd | 245 | uint32_t data_max; |
laserdad | 0:2da1f69b38fd | 246 | uint32_t reg_max; |
laserdad | 0:2da1f69b38fd | 247 | |
laserdad | 0:2da1f69b38fd | 248 | }; |
laserdad | 0:2da1f69b38fd | 249 | |
laserdad | 0:2da1f69b38fd | 250 | |
laserdad | 0:2da1f69b38fd | 251 | #endif |