OB1203 basic mbed driver

Dependents:   OB1203_IDT

Committer:
laserdad
Date:
Thu Jul 23 20:19:25 2020 +0000
Revision:
25:ca9caacd0f9f
Parent:
19:a27b98998edf
removed manual trim and overwrite digital trim

Who changed what in which revision?

UserRevisionLine numberNew contents of line
laserdad 0:2da1f69b38fd 1 #include "OB1203.h"
laserdad 0:2da1f69b38fd 2 #include "mbed.h"
laserdad 0:2da1f69b38fd 3
laserdad 0:2da1f69b38fd 4 extern Serial pc;
laserdad 0:2da1f69b38fd 5
laserdad 19:a27b98998edf 6 // //
laserdad 19:a27b98998edf 7 OB1203::OB1203(I2C *i2c_obj)
laserdad 0:2da1f69b38fd 8 {
laserdad 0:2da1f69b38fd 9 i2c = i2c_obj;
laserdad 0:2da1f69b38fd 10 }
laserdad 0:2da1f69b38fd 11
laserdad 0:2da1f69b38fd 12
laserdad 0:2da1f69b38fd 13 void OB1203::reset()
laserdad 0:2da1f69b38fd 14 {
laserdad 0:2da1f69b38fd 15 /*POR reset*/
laserdad 0:2da1f69b38fd 16 writeRegister(OB1203_ADDR,REG_MAIN_CTRL_0,SW_RESET);
laserdad 0:2da1f69b38fd 17 wait_ms(POR_TIME_MS);
laserdad 0:2da1f69b38fd 18 }
laserdad 0:2da1f69b38fd 19
laserdad 0:2da1f69b38fd 20
laserdad 0:2da1f69b38fd 21 void OB1203::writeRegister(int addr, char reg, char val) {
laserdad 0:2da1f69b38fd 22 /*writes 1 byte to a single register*/
laserdad 0:2da1f69b38fd 23 char writeData[2];
laserdad 0:2da1f69b38fd 24 writeData[0] = reg;
laserdad 0:2da1f69b38fd 25 writeData[1] = val;
laserdad 0:2da1f69b38fd 26 i2c->write(addr,writeData, 2);
laserdad 0:2da1f69b38fd 27 }
laserdad 0:2da1f69b38fd 28
laserdad 0:2da1f69b38fd 29
laserdad 0:2da1f69b38fd 30 void OB1203::writeBlock(int addr, char startReg, char *data, char numBytes) {
laserdad 0:2da1f69b38fd 31 /*writes data from an array beginning at the startReg*/
laserdad 1:99ca9c464503 32 // pc.printf("entering writeBlock with data %02x %02x\r\n",data[0],data[1]);
laserdad 0:2da1f69b38fd 33 char writeData[numBytes+1];
laserdad 0:2da1f69b38fd 34 writeData[0]=startReg;
laserdad 0:2da1f69b38fd 35 for(int n=1;n<numBytes+1;n++) {
laserdad 0:2da1f69b38fd 36 writeData[n]=data[n-1];
laserdad 0:2da1f69b38fd 37 }
laserdad 0:2da1f69b38fd 38 i2c->write(addr,writeData,numBytes+1);
laserdad 0:2da1f69b38fd 39 }
laserdad 0:2da1f69b38fd 40
laserdad 0:2da1f69b38fd 41
laserdad 0:2da1f69b38fd 42 void OB1203::readBlock(int addr, char startReg, char *data, int numBytes)
laserdad 0:2da1f69b38fd 43 {
laserdad 0:2da1f69b38fd 44 char writeData[1];
laserdad 0:2da1f69b38fd 45 writeData[0] = startReg;
laserdad 0:2da1f69b38fd 46 i2c->write(addr,writeData,1,true);
laserdad 0:2da1f69b38fd 47 i2c->read(addr,data,numBytes);
laserdad 4:f25ca600a0e6 48 // wait_us(800);
laserdad 4:f25ca600a0e6 49 // for(int n=0;n<numBytes;n++)
laserdad 4:f25ca600a0e6 50 // {
laserdad 4:f25ca600a0e6 51 // i2c->read(addr,data+n,1,1);
laserdad 4:f25ca600a0e6 52 // wait_us(20);
laserdad 4:f25ca600a0e6 53 // }
laserdad 0:2da1f69b38fd 54 }
laserdad 0:2da1f69b38fd 55
laserdad 2:3cba0fe6db60 56 uint16_t OB1203::get_status()
laserdad 0:2da1f69b38fd 57 {
laserdad 0:2da1f69b38fd 58 char writeData[1]; //declare array of size 1
laserdad 0:2da1f69b38fd 59 writeData[0] = REG_STATUS_0;
laserdad 2:3cba0fe6db60 60 char data[2]; //declare array of size 1
laserdad 0:2da1f69b38fd 61 i2c->write(OB1203_ADDR,writeData,1,true);
laserdad 0:2da1f69b38fd 62 i2c->read(OB1203_ADDR,data,2);
laserdad 0:2da1f69b38fd 63 return (data[0]<<8 | data[1]);
laserdad 0:2da1f69b38fd 64 }
laserdad 0:2da1f69b38fd 65
laserdad 1:99ca9c464503 66 bool OB1203::dataIsNew()
laserdad 1:99ca9c464503 67 {
laserdad 1:99ca9c464503 68 int status_reg_vals;
laserdad 1:99ca9c464503 69 status_reg_vals = get_status();
laserdad 5:527556d05aa8 70 return ((status_reg_vals & 0x0100)>>8) || (status_reg_vals & 0x0091);
laserdad 5:527556d05aa8 71 }
laserdad 5:527556d05aa8 72
laserdad 5:527556d05aa8 73 bool OB1203::lsIsNew()
laserdad 5:527556d05aa8 74 {
laserdad 5:527556d05aa8 75 int status_reg_vals;
laserdad 5:527556d05aa8 76 status_reg_vals = get_status();
laserdad 5:527556d05aa8 77 return ((status_reg_vals & 0x0100)>>8);
laserdad 5:527556d05aa8 78 }
laserdad 5:527556d05aa8 79
laserdad 5:527556d05aa8 80 bool OB1203::psIsNew()
laserdad 5:527556d05aa8 81 {
laserdad 5:527556d05aa8 82 int status_reg_vals;
laserdad 5:527556d05aa8 83 status_reg_vals = get_status();
laserdad 5:527556d05aa8 84 return (status_reg_vals & 0x0001);
laserdad 5:527556d05aa8 85 }
laserdad 5:527556d05aa8 86
laserdad 5:527556d05aa8 87 bool OB1203::tempIsNew()
laserdad 5:527556d05aa8 88 {
laserdad 5:527556d05aa8 89 int status_reg_vals;
laserdad 5:527556d05aa8 90 status_reg_vals = get_status();
laserdad 5:527556d05aa8 91 return (status_reg_vals & 0x0080);
laserdad 5:527556d05aa8 92 }
laserdad 5:527556d05aa8 93
laserdad 5:527556d05aa8 94 bool OB1203::bioIsNew()
laserdad 5:527556d05aa8 95 {
laserdad 5:527556d05aa8 96 int status_reg_vals;
laserdad 5:527556d05aa8 97 status_reg_vals = get_status();
laserdad 5:527556d05aa8 98 return (status_reg_vals & 0x0010);
laserdad 1:99ca9c464503 99 }
laserdad 0:2da1f69b38fd 100
laserdad 8:6c19c052b053 101 void OB1203::setOscTrim()
laserdad 8:6c19c052b053 102 {
laserdad 8:6c19c052b053 103 char writeData[1];
laserdad 8:6c19c052b053 104 writeData[0] = osc_trim;
laserdad 8:6c19c052b053 105 // pc.printf("writing %02x to REG %02x\r\n",osc_trim,REG_OSC_TRIM);
laserdad 8:6c19c052b053 106 writeBlock(OB1203_ADDR,REG_OSC_TRIM,writeData,1);
laserdad 8:6c19c052b053 107 }
laserdad 8:6c19c052b053 108
laserdad 0:2da1f69b38fd 109 void OB1203::setMainConfig()
laserdad 0:2da1f69b38fd 110 {
laserdad 0:2da1f69b38fd 111 char writeData[2];
laserdad 0:2da1f69b38fd 112 writeData[0] = ls_sai | ls_mode | ls_en; //MAIN_CTRL_0
laserdad 4:f25ca600a0e6 113 writeData[1] = temp_en | ps_sai_en | ppg_ps_mode | ppg_ps_en; //MAIN_CTRL_1
laserdad 5:527556d05aa8 114 // pc.printf("main config 1 to write %02x\r\n",writeData[1]);
laserdad 0:2da1f69b38fd 115 writeBlock(OB1203_ADDR,REG_MAIN_CTRL_0,writeData,2);
laserdad 0:2da1f69b38fd 116 }
laserdad 0:2da1f69b38fd 117
laserdad 0:2da1f69b38fd 118
laserdad 0:2da1f69b38fd 119 void OB1203::setIntConfig()
laserdad 0:2da1f69b38fd 120 {
laserdad 0:2da1f69b38fd 121 char writeData[3];
laserdad 0:2da1f69b38fd 122 writeData[0] = ls_int_sel | ls_var_mode | ls_int_en;
laserdad 0:2da1f69b38fd 123 writeData[1] = afull_int_en | ppg_int_en | ps_logic_mode | ps_int_en;
laserdad 0:2da1f69b38fd 124 writeData[2] = ls_persist | ps_persist;
laserdad 0:2da1f69b38fd 125 writeBlock(OB1203_ADDR,REG_INT_CFG_0,writeData,3); //default
laserdad 0:2da1f69b38fd 126 }
laserdad 0:2da1f69b38fd 127
laserdad 0:2da1f69b38fd 128
laserdad 0:2da1f69b38fd 129 void OB1203::setLSthresh()
laserdad 0:2da1f69b38fd 130 {
laserdad 0:2da1f69b38fd 131 char writeData[6];
laserdad 0:2da1f69b38fd 132 writeData[0] = (char) (ls_thres_hi & 0x000000FF);
laserdad 0:2da1f69b38fd 133 writeData[1] = (char) ((ls_thres_hi & 0x0000FF00)>>8);
laserdad 1:99ca9c464503 134 writeData[2] = (char) ((ls_thres_hi & 0x00FF0000)>>16);
laserdad 0:2da1f69b38fd 135 writeData[3] = (char) (ls_thres_lo & 0x000000FF);
laserdad 0:2da1f69b38fd 136 writeData[4] = (char) ((ls_thres_lo & 0x0000FF00)>>8);
laserdad 1:99ca9c464503 137 writeData[5] = (char) ((ls_thres_lo & 0x00FF0000)>>16);
laserdad 0:2da1f69b38fd 138 writeBlock(OB1203_ADDR,REG_LS_THRES_HI,writeData,6); //default
laserdad 0:2da1f69b38fd 139 }
laserdad 0:2da1f69b38fd 140
laserdad 0:2da1f69b38fd 141
laserdad 0:2da1f69b38fd 142 void OB1203::setPSthresh()
laserdad 0:2da1f69b38fd 143 {
laserdad 0:2da1f69b38fd 144 char writeData[4];
laserdad 0:2da1f69b38fd 145 writeData[0] = (char) (ps_thres_hi & 0x000FF);
laserdad 0:2da1f69b38fd 146 writeData[1] = (char) ((ps_thres_hi & 0xFF00)>>8);
laserdad 16:d5fe5debb5d2 147 writeData[2] = (char) (ps_thres_lo & 0x000FF);
laserdad 16:d5fe5debb5d2 148 writeData[3] = (char) ((ps_thres_lo & 0xFF00)>>8);
laserdad 0:2da1f69b38fd 149 writeBlock(OB1203_ADDR,REG_PS_THRES_HI,writeData,4); //default
laserdad 0:2da1f69b38fd 150 }
laserdad 0:2da1f69b38fd 151
laserdad 0:2da1f69b38fd 152
laserdad 0:2da1f69b38fd 153 void OB1203::setPScurrent()
laserdad 0:2da1f69b38fd 154 {
laserdad 0:2da1f69b38fd 155 char writeData[2];
laserdad 0:2da1f69b38fd 156 writeData[0] = (char) (ps_current & 0x00FF);
laserdad 0:2da1f69b38fd 157 writeData[1] = (char) ((ps_current & 0xFF00)>>8);
laserdad 0:2da1f69b38fd 158 writeBlock(OB1203_ADDR,REG_PS_LED_CURR,writeData,2);
laserdad 0:2da1f69b38fd 159 }
laserdad 0:2da1f69b38fd 160
laserdad 0:2da1f69b38fd 161
laserdad 0:2da1f69b38fd 162 void OB1203::setPPGcurrent()
laserdad 0:2da1f69b38fd 163 {
laserdad 0:2da1f69b38fd 164 char writeData[4];
laserdad 25:ca9caacd0f9f 165 if(led_flip == LED_FLIP_OFF) {
laserdad 25:ca9caacd0f9f 166 writeData[0] = (char) (ir_current & 0x00FF);
laserdad 25:ca9caacd0f9f 167 writeData[1] = (char) ((ir_current & 0xFF00)>>8);
laserdad 25:ca9caacd0f9f 168 writeData[2] = (char) (r_current & 0x00FF);
laserdad 25:ca9caacd0f9f 169 writeData[3] = (char) ((r_current & 0xFF00)>>8);
laserdad 25:ca9caacd0f9f 170 } else {
laserdad 25:ca9caacd0f9f 171 writeData[2] = (char) (ir_current & 0x00FF);
laserdad 25:ca9caacd0f9f 172 writeData[3] = (char) ((ir_current & 0xFF00)>>8);
laserdad 25:ca9caacd0f9f 173 writeData[0] = (char) (r_current & 0x00FF);
laserdad 25:ca9caacd0f9f 174 writeData[1] = (char) ((r_current & 0xFF00)>>8);
laserdad 25:ca9caacd0f9f 175 }
laserdad 0:2da1f69b38fd 176 writeBlock(OB1203_ADDR,REG_PPG_IRLED_CURR,writeData,4);
laserdad 0:2da1f69b38fd 177 }
laserdad 0:2da1f69b38fd 178
laserdad 0:2da1f69b38fd 179
laserdad 0:2da1f69b38fd 180 void OB1203::setPPG_PSgain_cfg()
laserdad 0:2da1f69b38fd 181 {
laserdad 0:2da1f69b38fd 182 char writeData[2];
laserdad 8:6c19c052b053 183 writeData[0] = ppg_ps_gain | ppg_LED_settling | ppg_ALC_track;
laserdad 10:6703d2cdeabc 184 writeData[1] = ppg_pow_save | led_flip | sig_out | diff | alc;
laserdad 0:2da1f69b38fd 185 writeBlock(OB1203_ADDR,REG_PPG_PS_GAIN,writeData,2);
laserdad 0:2da1f69b38fd 186 }
laserdad 0:2da1f69b38fd 187
laserdad 0:2da1f69b38fd 188 void OB1203::setPPGana_can()
laserdad 0:2da1f69b38fd 189 {
laserdad 0:2da1f69b38fd 190 char writeData[1];
laserdad 0:2da1f69b38fd 191 writeData[0] = ch1_can_ana | ch2_can_ana;
laserdad 0:2da1f69b38fd 192 writeBlock(OB1203_ADDR,REG_PPG_CAN_ANA,writeData,1);
laserdad 0:2da1f69b38fd 193 }
laserdad 0:2da1f69b38fd 194
laserdad 0:2da1f69b38fd 195 void OB1203::setPPGavg_and_rate()
laserdad 0:2da1f69b38fd 196 {
laserdad 0:2da1f69b38fd 197 char writeData[2];
laserdad 9:0c3d2eea1c79 198 writeData[0] = ppg_avg | 0x0A; //use standard LED max settings
laserdad 0:2da1f69b38fd 199 writeData[1] = ppg_pwidth | ppg_freq | ppg_rate;
laserdad 0:2da1f69b38fd 200 writeBlock(OB1203_ADDR,REG_PPG_AVG,writeData,2);
laserdad 0:2da1f69b38fd 201 }
laserdad 0:2da1f69b38fd 202
laserdad 9:0c3d2eea1c79 203 void OB1203::setBioTrim()
laserdad 9:0c3d2eea1c79 204 {
laserdad 9:0c3d2eea1c79 205 char writeData[1];
laserdad 9:0c3d2eea1c79 206 writeData[0] = bio_trim;
laserdad 9:0c3d2eea1c79 207 writeBlock(OB1203_ADDR, REG_BIO_TRIM,writeData,1);
laserdad 9:0c3d2eea1c79 208 }
laserdad 9:0c3d2eea1c79 209
laserdad 9:0c3d2eea1c79 210 void OB1203::setLEDTrim()
laserdad 9:0c3d2eea1c79 211 {
laserdad 9:0c3d2eea1c79 212 char writeData[1];
laserdad 9:0c3d2eea1c79 213 writeData[0] = led_trim;
laserdad 9:0c3d2eea1c79 214 writeBlock(OB1203_ADDR, REG_LED_TRIM,writeData,1);
laserdad 9:0c3d2eea1c79 215 }
laserdad 0:2da1f69b38fd 216
laserdad 25:ca9caacd0f9f 217 void OB1203::setDigTrim()
laserdad 25:ca9caacd0f9f 218 {
laserdad 25:ca9caacd0f9f 219 char writeData[2];
laserdad 25:ca9caacd0f9f 220 writeData[0] = led1_trim;
laserdad 25:ca9caacd0f9f 221 writeData[1] = led2_trim;
laserdad 25:ca9caacd0f9f 222 writeBlock(OB1203_ADDR, REG_DIG_LED1_TRIM,writeData,2);
laserdad 25:ca9caacd0f9f 223 }
laserdad 25:ca9caacd0f9f 224
laserdad 0:2da1f69b38fd 225 void OB1203::setDigitalCan()
laserdad 0:2da1f69b38fd 226 {
laserdad 0:2da1f69b38fd 227 char writeData[2];
laserdad 0:2da1f69b38fd 228 writeData[0] = (char)(ps_digital_can & 0x00FF);
laserdad 0:2da1f69b38fd 229 writeData[1] = (char)((ps_digital_can & 0xFF00)>>8);
laserdad 0:2da1f69b38fd 230 writeBlock(OB1203_ADDR,REG_PS_CAN_DIG,writeData,2);
laserdad 0:2da1f69b38fd 231 }
laserdad 0:2da1f69b38fd 232
laserdad 0:2da1f69b38fd 233
laserdad 0:2da1f69b38fd 234 void OB1203::setFifoConfig()
laserdad 0:2da1f69b38fd 235 {
laserdad 0:2da1f69b38fd 236 char writeData[1];
laserdad 12:573f7ce91a0d 237 writeData[0] = fifo_rollover_en | fifo_afull_advance_warning;
laserdad 0:2da1f69b38fd 238 writeBlock(OB1203_ADDR,REG_FIFO_CFG,writeData,1);
laserdad 0:2da1f69b38fd 239 }
laserdad 0:2da1f69b38fd 240
laserdad 0:2da1f69b38fd 241
laserdad 12:573f7ce91a0d 242 void OB1203::resetFIFO()
laserdad 12:573f7ce91a0d 243 {
laserdad 12:573f7ce91a0d 244 char writeData[2];
laserdad 12:573f7ce91a0d 245 writeData[0]=0;
laserdad 12:573f7ce91a0d 246 writeData[1]=0;
laserdad 12:573f7ce91a0d 247 writeBlock(OB1203_ADDR,REG_FIFO_WR_PTR,writeData,2);//set write and read pointer to zero--next sample is newest
laserdad 12:573f7ce91a0d 248 writeRegister(OB1203_ADDR,REG_MAIN_CTRL_1, (temp_en | ps_sai_en | ppg_ps_mode | 0) ); //turn PPG off MAIN_CTRL_1;
laserdad 12:573f7ce91a0d 249 writeRegister(OB1203_ADDR,REG_MAIN_CTRL_1, (temp_en | ps_sai_en | ppg_ps_mode | ppg_ps_en) ); //MAIN_CTRL_1;
laserdad 12:573f7ce91a0d 250 }
laserdad 12:573f7ce91a0d 251
laserdad 12:573f7ce91a0d 252
laserdad 0:2da1f69b38fd 253 void OB1203::init_rgb()
laserdad 0:2da1f69b38fd 254 {
laserdad 0:2da1f69b38fd 255 /*Configures ALS/RGB mode. PS and BIO off.
laserdad 0:2da1f69b38fd 256 Use: set class variables using header declarations. Then call this function.*/
laserdad 0:2da1f69b38fd 257 char writeData[2];
laserdad 0:2da1f69b38fd 258 writeBlock(OB1203_ADDR,REG_LS_RES_RATE,writeData,2);
laserdad 0:2da1f69b38fd 259 writeData[0] = ls_res | ls_rate; //LS_RES_RATE
laserdad 0:2da1f69b38fd 260 writeData[1] = ls_gain; //LS_GAIN
laserdad 0:2da1f69b38fd 261 writeBlock(OB1203_ADDR,REG_LS_RES_RATE,writeData,2);
laserdad 0:2da1f69b38fd 262 setLSthresh();
laserdad 0:2da1f69b38fd 263 setIntConfig();
laserdad 0:2da1f69b38fd 264 ppg_ps_en = PPG_PS_OFF;
laserdad 0:2da1f69b38fd 265 ls_en = LS_ON;
laserdad 0:2da1f69b38fd 266 setMainConfig();
laserdad 0:2da1f69b38fd 267 }
laserdad 0:2da1f69b38fd 268
laserdad 0:2da1f69b38fd 269
laserdad 0:2da1f69b38fd 270 void OB1203::init_ps()
laserdad 0:2da1f69b38fd 271 {
laserdad 0:2da1f69b38fd 272 /*Configures PS mode but not thresholds or interrupts. RGB/ALS and BIO off.
laserdad 0:2da1f69b38fd 273 Use: set class variables using header declarations. Then call this function.*/
laserdad 0:2da1f69b38fd 274 char writeData[2];
laserdad 0:2da1f69b38fd 275 //PS settings
laserdad 0:2da1f69b38fd 276 setPScurrent();
laserdad 11:724cf1c68651 277 writeData[0] = ps_can_ana | ps_pulses | 0x02; //PS_CAN_PULSES -->set hidden max current registers to allow higher LED powers
laserdad 0:2da1f69b38fd 278 writeData[1] = ps_pwidth | ps_rate; //PS_PWIDTH_RATE
laserdad 0:2da1f69b38fd 279 writeBlock(OB1203_ADDR,REG_PS_CAN_PULSES,writeData,2);
laserdad 0:2da1f69b38fd 280 //Digital crosstalk cancellation
laserdad 0:2da1f69b38fd 281 setDigitalCan(); //PS_CAN_DIG
laserdad 0:2da1f69b38fd 282 //set PS moving average and hysteresis
laserdad 0:2da1f69b38fd 283 writeData[0] = ps_avg_en | ps_hys_level; //PS_MOV_AVG_HYS
laserdad 0:2da1f69b38fd 284 writeBlock(OB1203_ADDR,REG_PS_MOV_AVG_HYS,writeData,1);
laserdad 0:2da1f69b38fd 285 //set PS interrupt thresholds
laserdad 0:2da1f69b38fd 286 setPSthresh();
laserdad 0:2da1f69b38fd 287 //interrupt configuration
laserdad 0:2da1f69b38fd 288 ls_int_en = LS_INT_OFF;
laserdad 0:2da1f69b38fd 289 setIntConfig();
laserdad 0:2da1f69b38fd 290 setPPG_PSgain_cfg();
laserdad 0:2da1f69b38fd 291 setPScurrent();
laserdad 0:2da1f69b38fd 292 //config PS
laserdad 0:2da1f69b38fd 293 ls_en = LS_OFF;
laserdad 0:2da1f69b38fd 294 ppg_ps_en = 1;
laserdad 0:2da1f69b38fd 295 ppg_ps_mode = PS_MODE;
laserdad 25:ca9caacd0f9f 296 //setLEDTrim();
laserdad 0:2da1f69b38fd 297 setMainConfig();
laserdad 0:2da1f69b38fd 298 }
laserdad 0:2da1f69b38fd 299
laserdad 0:2da1f69b38fd 300
laserdad 0:2da1f69b38fd 301 void OB1203::init_ps_rgb()
laserdad 0:2da1f69b38fd 302 {
laserdad 2:3cba0fe6db60 303 reset();
laserdad 0:2da1f69b38fd 304 char writeData[2];
laserdad 0:2da1f69b38fd 305 writeData[0] = ls_res | ls_rate; //LS_RES_RATE
laserdad 0:2da1f69b38fd 306 writeData[1] = ls_gain; //LS_GAIN
laserdad 0:2da1f69b38fd 307 writeBlock(OB1203_ADDR,REG_LS_RES_RATE,writeData,2);
laserdad 11:724cf1c68651 308 writeData[0] = ps_can_ana | ps_pulses | 0x02; //PS_CAN_PULSES -->set hidden max current registers to allow higher LED powers
laserdad 0:2da1f69b38fd 309 writeData[1] = ps_pwidth | ps_rate; //PS_PWIDTH_RATE
laserdad 0:2da1f69b38fd 310 writeBlock(OB1203_ADDR,REG_PS_CAN_PULSES,writeData,2);
laserdad 0:2da1f69b38fd 311 setDigitalCan(); //PS_CAN_DIG
laserdad 0:2da1f69b38fd 312 //set PS moving average and hysteresis
laserdad 0:2da1f69b38fd 313 writeData[0] = ps_avg_en | ps_hys_level; //PS_MOV_AVG_HYS
laserdad 0:2da1f69b38fd 314 writeBlock(OB1203_ADDR,REG_PS_MOV_AVG_HYS,writeData,1);
laserdad 0:2da1f69b38fd 315 setIntConfig();
laserdad 0:2da1f69b38fd 316 setPSthresh();
laserdad 16:d5fe5debb5d2 317 setPScurrent();
laserdad 0:2da1f69b38fd 318 setLSthresh();
laserdad 0:2da1f69b38fd 319 ls_en = LS_ON;
laserdad 0:2da1f69b38fd 320 ppg_ps_en = PPG_PS_ON;
laserdad 0:2da1f69b38fd 321 ppg_ps_mode = PS_MODE;
laserdad 25:ca9caacd0f9f 322 //setLEDTrim();
laserdad 16:d5fe5debb5d2 323 setMainConfig();
laserdad 0:2da1f69b38fd 324 }
laserdad 0:2da1f69b38fd 325
laserdad 0:2da1f69b38fd 326
laserdad 0:2da1f69b38fd 327 void OB1203::init_hr()
laserdad 0:2da1f69b38fd 328 {
laserdad 2:3cba0fe6db60 329 reset();
laserdad 3:ffcd0d2ec97f 330 ps_int_en = PS_INT_OFF;
laserdad 9:0c3d2eea1c79 331 ls_en = LS_OFF;
laserdad 0:2da1f69b38fd 332 setIntConfig();
laserdad 3:ffcd0d2ec97f 333 char readData[1];
laserdad 16:d5fe5debb5d2 334 //readBlock(OB1203_ADDR,REG_PS_INT_CFG_1,readData,1);
laserdad 8:6c19c052b053 335 // pc.printf("int config 1 = %02X\r\n",readData[0]);
laserdad 0:2da1f69b38fd 336 setPPG_PSgain_cfg();
laserdad 0:2da1f69b38fd 337 setPPGcurrent();
laserdad 0:2da1f69b38fd 338 setPPGana_can();
laserdad 0:2da1f69b38fd 339 setPPGavg_and_rate();
laserdad 0:2da1f69b38fd 340 setFifoConfig();
laserdad 3:ffcd0d2ec97f 341 ppg_ps_mode = HR_MODE;
laserdad 25:ca9caacd0f9f 342 //setBioTrim();
laserdad 25:ca9caacd0f9f 343 //setLEDTrim();
laserdad 25:ca9caacd0f9f 344 setDigTrim();
laserdad 3:ffcd0d2ec97f 345 setMainConfig();
laserdad 0:2da1f69b38fd 346 }
laserdad 0:2da1f69b38fd 347
laserdad 0:2da1f69b38fd 348 void OB1203::init_spo2()
laserdad 0:2da1f69b38fd 349 {
laserdad 2:3cba0fe6db60 350 reset();
laserdad 2:3cba0fe6db60 351 ps_int_en = PS_INT_OFF;
laserdad 9:0c3d2eea1c79 352 ls_en = LS_OFF;
laserdad 0:2da1f69b38fd 353 setIntConfig();
laserdad 2:3cba0fe6db60 354 char readData[1];
laserdad 2:3cba0fe6db60 355 readBlock(OB1203_ADDR,REG_PS_INT_CFG_1,readData,1);
laserdad 8:6c19c052b053 356 // pc.printf("int config 1 = %02X\r\n",readData[0]);
laserdad 0:2da1f69b38fd 357 setPPG_PSgain_cfg();
laserdad 0:2da1f69b38fd 358 setPPGcurrent();
laserdad 0:2da1f69b38fd 359 setPPGana_can();
laserdad 0:2da1f69b38fd 360 setPPGavg_and_rate();
laserdad 0:2da1f69b38fd 361 setFifoConfig();
laserdad 0:2da1f69b38fd 362 ppg_ps_mode = SPO2_MODE;
laserdad 25:ca9caacd0f9f 363 //setLEDTrim();
laserdad 25:ca9caacd0f9f 364 setDigTrim();
laserdad 25:ca9caacd0f9f 365 //setBioTrim();
laserdad 0:2da1f69b38fd 366 setMainConfig();
laserdad 0:2da1f69b38fd 367 }
laserdad 0:2da1f69b38fd 368
laserdad 0:2da1f69b38fd 369 uint32_t OB1203::bytes2uint32(char *data, int start_byte)
laserdad 0:2da1f69b38fd 370 {
laserdad 1:99ca9c464503 371 //coverts a string of 3 bytes with LSB first into unsigned long MSB last
laserdad 16:d5fe5debb5d2 372 return ((uint32_t)data[start_byte+2])<<16 | ((uint32_t)data[start_byte+1])<<8 | ((uint32_t)data[start_byte]) ;
laserdad 0:2da1f69b38fd 373 }
laserdad 0:2da1f69b38fd 374
laserdad 6:337ee64ca7ab 375 uint32_t OB1203::twoandhalfBytes2uint32(char *data, int start_byte)
laserdad 6:337ee64ca7ab 376 {
laserdad 6:337ee64ca7ab 377 //coverts a string of 3 bytes with LSB first into unsigned long MSB last
laserdad 7:7d90f25c04fa 378 return (uint32_t)( ((data[start_byte+2] & 0x0F)<<16) | (uint32_t(data[start_byte+1])<<8) | uint32_t(data[start_byte]) ) ;
laserdad 6:337ee64ca7ab 379 }
laserdad 0:2da1f69b38fd 380
laserdad 0:2da1f69b38fd 381 char OB1203::get_ls_data(uint32_t *data)
laserdad 0:2da1f69b38fd 382 {
laserdad 5:527556d05aa8 383 char byte_data[21];
laserdad 6:337ee64ca7ab 384 readBlock(OB1203_ADDR,REG_STATUS_0,byte_data,21);
laserdad 0:2da1f69b38fd 385 #ifdef DEBUG
laserdad 5:527556d05aa8 386 pc.printf("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x $02x\r\n",
laserdad 0:2da1f69b38fd 387 byte_data[0],byte_data[1],byte_data[2],byte_data[3],
laserdad 0:2da1f69b38fd 388 byte_data[4],byte_data[5],byte_data[6],byte_data[7],
laserdad 0:2da1f69b38fd 389 byte_data[8],byte_data[9],byte_data[10],byte_data[11],
laserdad 0:2da1f69b38fd 390 byte_data[12],byte_data[13],byte_data[14],byte_data[15],
laserdad 5:527556d05aa8 391 byte_data[16],byte_data[17],byte_data[18]),
laserdad 5:527556d05aa8 392 byte_data[19],byte_data[20];
laserdad 0:2da1f69b38fd 393 #endif
laserdad 0:2da1f69b38fd 394
laserdad 1:99ca9c464503 395
laserdad 1:99ca9c464503 396 //byte_data[0] is ps (not populated)
laserdad 6:337ee64ca7ab 397 data[1] = twoandhalfBytes2uint32(byte_data,4); //w
laserdad 6:337ee64ca7ab 398 data[2] = twoandhalfBytes2uint32(byte_data,7); //g
laserdad 6:337ee64ca7ab 399 data[3] = twoandhalfBytes2uint32(byte_data,10); //b
laserdad 6:337ee64ca7ab 400 data[4] = twoandhalfBytes2uint32(byte_data,13); //r
laserdad 6:337ee64ca7ab 401 data[5] = twoandhalfBytes2uint32(byte_data,16); //c
laserdad 6:337ee64ca7ab 402 data[6] = (uint32_t)((byte_data[20] & 0x0F)<<8) | (uint32_t)byte_data[19] ; //temp data
laserdad 0:2da1f69b38fd 403 return ( (byte_data[0] & LS_NEW_DATA) == 0x01 ? 1 : 0); //return 1 if new data or 0 if old data
laserdad 0:2da1f69b38fd 404 }
laserdad 0:2da1f69b38fd 405
laserdad 0:2da1f69b38fd 406 char OB1203::get_ps_data(uint32_t *data)
laserdad 0:2da1f69b38fd 407 {
laserdad 0:2da1f69b38fd 408 char byte_data[4];
laserdad 6:337ee64ca7ab 409 readBlock(OB1203_ADDR,REG_STATUS_0,byte_data,4);
laserdad 0:2da1f69b38fd 410 #ifdef DEBUG
laserdad 0:2da1f69b38fd 411 pc.printf( "%02x %02x %02x %02x\r\n", byte_data[0], byte_data[1], byte_data[2], byte_data[3] );
laserdad 0:2da1f69b38fd 412 #endif
laserdad 1:99ca9c464503 413
laserdad 1:99ca9c464503 414 data[0] = ((uint32_t)byte_data[3])<<8 | ((uint32_t)byte_data[2]); //ps data
laserdad 0:2da1f69b38fd 415 return ( (byte_data[1] & PS_NEW_DATA) == 0x01 ? 1 : 0); //return 1 if new data or 0 if old data
laserdad 0:2da1f69b38fd 416 }
laserdad 0:2da1f69b38fd 417
laserdad 0:2da1f69b38fd 418 char OB1203::get_ps_ls_data(uint32_t *data)
laserdad 0:2da1f69b38fd 419 {
laserdad 4:f25ca600a0e6 420 char byte_data[21];
laserdad 4:f25ca600a0e6 421 readBlock(OB1203_ADDR,REG_STATUS_0,byte_data,21);
laserdad 0:2da1f69b38fd 422 #ifdef DEBUG
laserdad 4:f25ca600a0e6 423 pc.printf("%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x $02x\r\n",
laserdad 0:2da1f69b38fd 424 byte_data[0],byte_data[1],byte_data[2],byte_data[3],byte_data[4],
laserdad 0:2da1f69b38fd 425 byte_data[5],byte_data[6],byte_data[7],byte_data[8],byte_data[9],
laserdad 0:2da1f69b38fd 426 byte_data[10],byte_data[11],byte_data[12],byte_data[13],byte_data[14],
laserdad 4:f25ca600a0e6 427 byte_data[15],byte_data[16],byte_data[17],byte_data[18] ),
laserdad 4:f25ca600a0e6 428 byte_data[19],byte_data[20];
laserdad 0:2da1f69b38fd 429 #endif
laserdad 0:2da1f69b38fd 430
laserdad 1:99ca9c464503 431 data[0] = ((uint32_t)byte_data[3])<<8 | ((uint32_t)byte_data[2]); //ps
laserdad 6:337ee64ca7ab 432 data[1] = twoandhalfBytes2uint32(byte_data,4); //w
laserdad 6:337ee64ca7ab 433 data[2] = twoandhalfBytes2uint32(byte_data,7); //g
laserdad 6:337ee64ca7ab 434 data[3] = twoandhalfBytes2uint32(byte_data,10); //b
laserdad 6:337ee64ca7ab 435 data[4] = twoandhalfBytes2uint32(byte_data,13); //r
laserdad 6:337ee64ca7ab 436 data[5] = twoandhalfBytes2uint32(byte_data,16); //c
laserdad 6:337ee64ca7ab 437 data[6] = (uint32_t)((byte_data[20] & 0x0F)<<8) | (uint32_t)byte_data[19] ; //temp data
laserdad 0:2da1f69b38fd 438 return ( (byte_data[0] & LS_NEW_DATA) == 0x01 ? 1 : 0); //return 1 if new data or 0 if old data
laserdad 0:2da1f69b38fd 439 }
laserdad 0:2da1f69b38fd 440
laserdad 0:2da1f69b38fd 441
laserdad 0:2da1f69b38fd 442 void OB1203::getFifoInfo(char *fifo_info)
laserdad 0:2da1f69b38fd 443 {
laserdad 0:2da1f69b38fd 444 readBlock(OB1203_ADDR,REG_FIFO_WR_PTR,fifo_info,3);
laserdad 0:2da1f69b38fd 445 writePointer = fifo_info[0];
laserdad 0:2da1f69b38fd 446 readPointer = fifo_info[1];
laserdad 0:2da1f69b38fd 447 fifoOverflow = fifo_info[2];
laserdad 0:2da1f69b38fd 448 }
laserdad 0:2da1f69b38fd 449
laserdad 0:2da1f69b38fd 450
laserdad 25:ca9caacd0f9f 451 void OB1203::getNumFifoSamplesAvailable(char *fifo_info, char *sample_info)
laserdad 0:2da1f69b38fd 452 {
laserdad 25:ca9caacd0f9f 453 /*sample_info [3] = {numSamplesHR, numSamplesSpO2, overflow*/
laserdad 25:ca9caacd0f9f 454
laserdad 25:ca9caacd0f9f 455 getFifoInfo(fifo_info);
laserdad 25:ca9caacd0f9f 456 uint8_t writePointer = fifo_info[0];
laserdad 25:ca9caacd0f9f 457 uint8_t readPointer = fifo_info [1];
laserdad 0:2da1f69b38fd 458 uint8_t numSamples = writePointer;
laserdad 0:2da1f69b38fd 459 if (writePointer<readPointer)
laserdad 0:2da1f69b38fd 460 {
laserdad 25:ca9caacd0f9f 461 numSamples += 32;
laserdad 0:2da1f69b38fd 462 }
laserdad 25:ca9caacd0f9f 463 numSamples -= readPointer;
laserdad 25:ca9caacd0f9f 464 sample_info[0] = numSamples; //num HR samples
laserdad 25:ca9caacd0f9f 465 sample_info[1] = (numSamples>>1); //num SpO2 samples
laserdad 25:ca9caacd0f9f 466 sample_info[2] = fifo_info[2];
laserdad 0:2da1f69b38fd 467 }
laserdad 0:2da1f69b38fd 468
laserdad 0:2da1f69b38fd 469
laserdad 0:2da1f69b38fd 470 void OB1203::getFifoSamples(uint8_t numSamples, char *fifoData)
laserdad 0:2da1f69b38fd 471 {
laserdad 2:3cba0fe6db60 472 readBlock(OB1203_ADDR,REG_FIFO_DATA,fifoData,3*numSamples);
laserdad 0:2da1f69b38fd 473 }
laserdad 0:2da1f69b38fd 474
laserdad 0:2da1f69b38fd 475
laserdad 0:2da1f69b38fd 476 void OB1203::parseFifoSamples(char numSamples, char *fifoData, uint32_t *assembledData)
laserdad 0:2da1f69b38fd 477 {
laserdad 0:2da1f69b38fd 478 for (int n=0; n<numSamples; n++)
laserdad 0:2da1f69b38fd 479 {
laserdad 0:2da1f69b38fd 480 assembledData[n] = bytes2uint32(fifoData,3*n);
laserdad 0:2da1f69b38fd 481 }
laserdad 0:2da1f69b38fd 482 }
laserdad 0:2da1f69b38fd 483
laserdad 0:2da1f69b38fd 484
laserdad 0:2da1f69b38fd 485 char OB1203::get_part_ID(char *data)
laserdad 0:2da1f69b38fd 486 {
laserdad 0:2da1f69b38fd 487 readBlock(OB1203_ADDR,REG_PART_ID,data,1);
laserdad 0:2da1f69b38fd 488 return data[0];
laserdad 19:a27b98998edf 489 }
laserdad 19:a27b98998edf 490
laserdad 19:a27b98998edf 491
laserdad 19:a27b98998edf 492 void OB1203::do_agc(uint32_t data, bool ch)
laserdad 19:a27b98998edf 493 {
laserdad 19:a27b98998edf 494 const uint32_t tol1 = TOL1;
laserdad 19:a27b98998edf 495 const uint32_t tol2 = TOL2;
laserdad 19:a27b98998edf 496 const uint16_t in_range_persist = IN_RANGE_PERSIST;
laserdad 19:a27b98998edf 497 static uint16_t in_range[2] = {0,0};
laserdad 25:ca9caacd0f9f 498 uint16_t maxCurrent[2];
laserdad 25:ca9caacd0f9f 499 if(led_flip == LED_FLIP_OFF) {
laserdad 25:ca9caacd0f9f 500 maxCurrent[0] = IR_MAX_CURRENT;
laserdad 25:ca9caacd0f9f 501 maxCurrent[1] = R_MAX_CURRENT;
laserdad 25:ca9caacd0f9f 502 } else {
laserdad 25:ca9caacd0f9f 503 maxCurrent[0] = R_MAX_CURRENT;
laserdad 25:ca9caacd0f9f 504 maxCurrent[1] = IR_MAX_CURRENT;
laserdad 25:ca9caacd0f9f 505 }
laserdad 19:a27b98998edf 506 const uint16_t step = STEP;
laserdad 19:a27b98998edf 507 const uint32_t targetCounts[2] = {IR_TARGET_COUNTS, R_TARGET_COUNTS};
laserdad 19:a27b98998edf 508 //ch = 0 for IR, 1 for R (channel)
laserdad 19:a27b98998edf 509 if( data > targetCounts[ch] + (in_range[ch]>in_range_persist ? tol2: tol1) )
laserdad 19:a27b98998edf 510 {
laserdad 19:a27b98998edf 511 if(data>targetCounts[ch] + tol2)
laserdad 19:a27b98998edf 512 in_range[ch]=0;
laserdad 19:a27b98998edf 513
laserdad 19:a27b98998edf 514
laserdad 19:a27b98998edf 515 if( (ch ? r_current : ir_current)>step)
laserdad 19:a27b98998edf 516 {
laserdad 19:a27b98998edf 517 (ch ? r_current : ir_current) -= step;
laserdad 19:a27b98998edf 518 update = 1;
laserdad 19:a27b98998edf 519 }
laserdad 19:a27b98998edf 520 }
laserdad 19:a27b98998edf 521 else if( data < targetCounts[ch] - (in_range[ch]>in_range_persist ? tol2 : tol1) )
laserdad 19:a27b98998edf 522 {
laserdad 19:a27b98998edf 523 if(data<targetCounts[ch] - tol2)
laserdad 19:a27b98998edf 524 in_range[ch]=0;
laserdad 19:a27b98998edf 525 if( (ch ? r_current : ir_current) +step<maxCurrent[ch]) //no need to go to full current
laserdad 19:a27b98998edf 526 {
laserdad 19:a27b98998edf 527 (ch ? r_current : ir_current) += step;
laserdad 19:a27b98998edf 528 update = 1;
laserdad 19:a27b98998edf 529 }
laserdad 19:a27b98998edf 530 }
laserdad 19:a27b98998edf 531 else
laserdad 19:a27b98998edf 532 {
laserdad 19:a27b98998edf 533 if( (data > (targetCounts[ch]-tol1) ) && (data < (targetCounts[ch]+tol1)) )
laserdad 19:a27b98998edf 534 in_range[ch]++;
laserdad 19:a27b98998edf 535 }
laserdad 0:2da1f69b38fd 536 }