Library for using multiple SI1142 sensor
Fork of SI1141 by
Diff: SI1143.cpp
- Revision:
- 0:18ebb7348150
- Child:
- 1:28beeb2f209b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SI1143.cpp Thu Oct 17 12:53:08 2013 +0000 @@ -0,0 +1,269 @@ +#include "SI1143.h" + +SI1143::SI1143(PinName sda, PinName scl) +{ + wait_ms(30); + i2c_ = new I2C(sda, scl); + //3.4MHz, as specified by the datasheet. + i2c_->frequency(3400000); + + command(RESET); + wait_ms(30); + //bias1=0; + //bias2=0; + //bias3=0; + //PS1=0; + //PS2=0; + //PS3=0; + + write_reg(HW_KEY,HW_KEY_VAL0); // Setting up LED Power to full + //write_reg(PS_LED21,0xFF); + write_reg(PS_LED21,0xAA); + //write_reg(PS_LED3, 0x0F); + write_reg(PS_LED3,0x0A); + //param_set(CHLIST,0b00010111); + //param_set(CHLIST,0x17); + //write_reg(PARAM_WR, 0x17); + write_reg(PARAM_WR, ALS_IR_TASK + ALS_VIS_TASK + PS1_TASK + PS2_TASK + PS3_TASK); + + //write_reg(COMMAND, 0xA0|CHLIST); + command(PARAM_SET + (CHLIST & 0x1F)); + + write_reg(INT_CFG,0); + write_reg(IRQ_ENABLE,0); + write_reg(IRQ_MODE1,0); + write_reg(IRQ_MODE2,0); + + //void write_reg(byte address, byte val) { // Write a resigter + //Wire.beginTransmission(IR_ADDRESS); + //Wire.write(address); + //Wire.write(val); + //Wire.endTransmission(); +//} + + //char parameter = read_reg(PARAM_RD,1); + // Serial.print("CHLIST = "); + // Serial.println(parameter,BIN); + //delay(1000); + //wait(2); + /* + for (int i=0; i<20; i++) + { + //write_reg(COMMAND,0b00000101); + write_reg(COMMAND,0x05); + //delay(50); + //wait(0.05); + + //char LowB = read_reg(PS1_DATA0,1); + //char HighB = read_reg(PS1_DATA1,1); + LowB = read_reg(PS1_DATA0,1); + HighB = read_reg(PS1_DATA1,1); + + bias1 = bias1 + (((HighB * 255) + LowB) / 20); + + LowB = read_reg(PS2_DATA0,1); + HighB = read_reg(PS2_DATA1,1); + + bias2 = bias2 + (((HighB * 255) + LowB) / 20); + + LowB = read_reg(PS3_DATA0,1); + HighB = read_reg(PS3_DATA1,1); + + bias3 = bias3 + (((HighB * 255) + LowB) / 20); + }*/ +} + +void SI1143::command(char cmd) +{ + int val; + + val = read_reg(RESPONSE,1); + while(val!=0) + { + write_reg(COMMAND,NOP); + val = read_reg(RESPONSE,1); + printf("%d\r\n",val); + } + do{ + write_reg(COMMAND,cmd); + if(cmd==RESET) break; + val = read_reg(RESPONSE,1); + //printf("%d\r\n",val); + }while(val==0); +} + +char SI1143::read_reg(/*unsigned*/ char address, int num_data) // Read a Register +{ + // + //unsigned char data; + //char cmd[2]={address,num_data}; + //int data; + + //i2c_->start(); + //data = i2c_->read(IR_ADDRESS,cmd,2); + //wait(0.05); + //i2c_->stop(); + + //return data; + + char tx[1]; + char rx[1]; + + i2c_->start(); + tx[0] = address; + i2c_->write((IR_ADDRESS << 1) & 0xFE, tx, num_data); + wait_ms(1); + i2c_->stop(); + + i2c_->start(); + i2c_->read((IR_ADDRESS << 1) | 0x01, rx, num_data); + wait_ms(1); + i2c_->stop(); + + return rx[0]; + + //Wire.beginTransmission(IR_ADDRESS); + //Wire.write(address); + //Wire.endTransmission(); + + //Wire.requestFrom(IR_ADDRESS, num_data); + + //while(Wire.available() < num_data); + + //return Wire.read(); +} + +void SI1143::write_reg(char address, char num_data) +{ // Write a resigter + //char cmd[2]={address,val}; + + //i2c_->start(); + //i2c_->write(IR_ADDRESS,cmd,1); + //wait(0.05); + //i2c_->stop(); + + char tx[2]; + + tx[0] = address; + tx[1] = num_data; + //tx[2] = data; + + i2c_->start(); + i2c_->write((IR_ADDRESS << 1) & 0xFE, tx, 2); + wait_ms(1); + i2c_->stop(); + + //Wire.beginTransmission(IR_ADDRESS); + //Wire.write(address); + //Wire.write(val); + //Wire.endTransmission(); +} + +void SI1143::bias() +{ + //command(PSALS_FORCE); + sample(0); + bias1 = PS1; + bias2 = PS2; + bias3 = PS3; +} + +int SI1143::sample(int point) +{ + //int data[5]; + command(PSALS_FORCE); + //write_reg(COMMAND,0x05); // Get a reading + //delay(5); + //wait(0.5); + + LowB = read_reg(ALS_VIS_DATA0,1); // Read the data for the first LED + HighB = read_reg(ALS_VIS_DATA1,1); + VIS = (HighB * 256) + LowB; + + LowB = read_reg(ALS_IR_DATA0,1); // Read the data for the first LED + HighB = read_reg(ALS_IR_DATA1,1); + IR = (HighB * 256) + LowB; + + LowB = read_reg(PS1_DATA0,1); // Read the data for the first LED + HighB = read_reg(PS1_DATA1,1); + PS1 = (HighB * 256) + LowB; + + LowB = read_reg(PS2_DATA0,1); // Read the data for the first LED + HighB = read_reg(PS2_DATA1,1); + PS2 = (HighB * 256) + LowB; + + LowB = read_reg(PS3_DATA0,1); // Read the data for the first LED + HighB = read_reg(PS3_DATA1,1); + PS3 = (HighB * 256) + LowB; + + if(PS1 > bias1) + PS1 = PS1 - bias1; + else + PS1 = 0; + if(PS2 > bias2) + PS2 = PS2 - bias2; + else + PS2 = 0; + if(PS3 > bias3) + PS3 = PS3 - bias3; + else + PS3 = 0; + + switch(point) + { + case 1: return VIS; + case 2: return IR; + case 3: return PS1; + case 4: return PS2; + case 5: return PS3; + default: return 0; + } + //data[0] = VIS; + //data[1] = IR; + //data[2] = PS1; + //data[3] = PS2; + //data[4] = PS3; + + //return data; + + //return PS1; +} +/* +int SI1143::read1() +{ + write_reg(COMMAND,0x05); // Get a reading + //delay(5); + //wait(0.5); + + LowB = read_reg(PS1_DATA0,1); // Read the data for the first LED + HighB = read_reg(PS1_DATA1,1); + PS1 = ((HighB * 255) + LowB) - bias1; + + return PS1; +} + +int SI1143::read2() +{ + write_reg(COMMAND,0x05); // Get a reading + //delay(5); + //wait(0.5); + + LowB = read_reg(PS2_DATA0,1); // Read the data for the second LED + HighB = read_reg(PS2_DATA1,1); + PS2 = (HighB * 255) + LowB - bias2; + + return PS2; +} + +int SI1143::read3() +{ + write_reg(COMMAND,0x05); // Get a reading + //delay(5); + //wait(0.5); + + LowB = read_reg(PS3_DATA0,1); // Read the data for the third LED + HighB = read_reg(PS3_DATA1,1); + PS3 = (HighB * 255) + LowB - bias3; + + return PS3; +}*/ \ No newline at end of file