Library for using SI1141 sensor

Fork of SI1143 by Guillermo Torijano

Committer:
dmcohen24
Date:
Tue May 20 21:33:31 2014 +0000
Revision:
8:70933bf445af
Parent:
7:f1303b85db58
Child:
9:31d4e955ee92
Adjusting register values;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GAT27 2:21381f11a5af 1 /**
GAT27 2:21381f11a5af 2 * @author Guillermo A Torijano
GAT27 2:21381f11a5af 3 *
GAT27 2:21381f11a5af 4 * @section LICENSE
GAT27 2:21381f11a5af 5 *
GAT27 2:21381f11a5af 6 * Permission is hereby granted, free of charge, to any person obtaining a copy
GAT27 2:21381f11a5af 7 * of this software and associated documentation files (the "Software"), to deal
GAT27 2:21381f11a5af 8 * in the Software without restriction, including without limitation the rights
GAT27 2:21381f11a5af 9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
GAT27 2:21381f11a5af 10 * copies of the Software, and to permit persons to whom the Software is
GAT27 2:21381f11a5af 11 * furnished to do so, subject to the following conditions:
GAT27 2:21381f11a5af 12 *
GAT27 2:21381f11a5af 13 * The above copyright notice and this permission notice shall be included in
GAT27 2:21381f11a5af 14 * all copies or substantial portions of the Software.
GAT27 2:21381f11a5af 15 *
GAT27 2:21381f11a5af 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
GAT27 2:21381f11a5af 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
GAT27 2:21381f11a5af 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
GAT27 2:21381f11a5af 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
GAT27 2:21381f11a5af 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
GAT27 2:21381f11a5af 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
GAT27 2:21381f11a5af 22 * THE SOFTWARE.
GAT27 2:21381f11a5af 23 *
GAT27 2:21381f11a5af 24 * @section DESCRIPTION
GAT27 2:21381f11a5af 25 *
GAT27 2:21381f11a5af 26 * Parallax SI1143 Gesture Sensor.
GAT27 2:21381f11a5af 27 *
GAT27 2:21381f11a5af 28 * Datasheet:
GAT27 2:21381f11a5af 29 *
GAT27 2:21381f11a5af 30 * http://www.silabs.com/Support%20Documents/TechnicalDocs/Si114x.pdf
GAT27 2:21381f11a5af 31 */
GAT27 2:21381f11a5af 32
GAT27 0:18ebb7348150 33 #include "SI1143.h"
GAT27 0:18ebb7348150 34
GAT27 0:18ebb7348150 35 SI1143::SI1143(PinName sda, PinName scl)
GAT27 0:18ebb7348150 36 {
GAT27 0:18ebb7348150 37 wait_ms(30);
GAT27 0:18ebb7348150 38 i2c_ = new I2C(sda, scl);
GAT27 5:3fadc61598bc 39 // 3.4MHz, as specified by the datasheet, but DO NOT USE.
GAT27 1:28beeb2f209b 40 //i2c_->frequency(3400000);
GAT27 0:18ebb7348150 41
GAT27 4:af8f820733e0 42 restart();
GAT27 4:af8f820733e0 43 }
GAT27 4:af8f820733e0 44
GAT27 4:af8f820733e0 45 void SI1143::restart()
GAT27 4:af8f820733e0 46 {
GAT27 0:18ebb7348150 47 command(RESET);
GAT27 0:18ebb7348150 48 wait_ms(30);
GAT27 0:18ebb7348150 49
dmcohen24 8:70933bf445af 50 //Do this because you have to
GAT27 5:3fadc61598bc 51 write_reg(HW_KEY,HW_KEY_VAL0);
dmcohen24 8:70933bf445af 52
dmcohen24 8:70933bf445af 53 // Setting up LED Power to FULL JUICE
dmcohen24 7:f1303b85db58 54 write_reg(PS_LED21,0x0F); // Was 0x0A
dmcohen24 7:f1303b85db58 55 write_reg(PS_LED3,0x00);
dmcohen24 7:f1303b85db58 56 //write_reg(PS_LED21,0xAA);
dmcohen24 7:f1303b85db58 57 //write_reg(PS_LED3,0x0A);
dmcohen24 8:70933bf445af 58
dmcohen24 8:70933bf445af 59 //Activate ALS_IR, ALS_VIS, and PS1
dmcohen24 7:f1303b85db58 60 write_reg(PARAM_WR, ALS_IR_TASK + ALS_VIS_TASK + PS1_TASK);
dmcohen24 8:70933bf445af 61 //write_reg(PARAM_WR, ALS_IR_TASK + ALS_VIS_TASK + PS1_TASK + PS2_TASK + PS3_TASK);
dmcohen24 8:70933bf445af 62 command(PARAM_SET + (CHLIST & 0x1F));
GAT27 0:18ebb7348150 63
dmcohen24 8:70933bf445af 64 /*
dmcohen24 8:70933bf445af 65 // Set PS_RANGE to high signal range
dmcohen24 8:70933bf445af 66 write_reg(PARAM_WR, 0x04); // 0x24 for high signal, 0x04 for normal
dmcohen24 8:70933bf445af 67 command(PARAM_SET + (PS_ADC_MISC & 0x1F));
dmcohen24 8:70933bf445af 68 */
dmcohen24 8:70933bf445af 69 //Set PS_ADC_COUNTER to lower time between ADC samples
dmcohen24 8:70933bf445af 70 write_reg(PARAM_WR, 0x00);
dmcohen24 8:70933bf445af 71 command(PARAM_SET + (PS_ADC_COUNTER & 0x1F));
dmcohen24 8:70933bf445af 72
dmcohen24 8:70933bf445af 73 //Turn up the juice on PS ACD GAIN!
dmcohen24 8:70933bf445af 74 write_reg(PARAM_WR, 0x04);
dmcohen24 8:70933bf445af 75 command(PARAM_SET + (PS_ADC_GAIN & 0x1F));
dmcohen24 8:70933bf445af 76
GAT27 0:18ebb7348150 77
GAT27 0:18ebb7348150 78 write_reg(INT_CFG,0);
GAT27 0:18ebb7348150 79 write_reg(IRQ_ENABLE,0);
GAT27 0:18ebb7348150 80 write_reg(IRQ_MODE1,0);
GAT27 0:18ebb7348150 81 write_reg(IRQ_MODE2,0);
dmcohen24 7:f1303b85db58 82
dmcohen24 7:f1303b85db58 83 //write_reg(PS_ADC_MISC,0x24);
dmcohen24 7:f1303b85db58 84 //write_reg(PS1_ADCMUX,0x03);
GAT27 0:18ebb7348150 85 }
GAT27 0:18ebb7348150 86
GAT27 0:18ebb7348150 87 void SI1143::command(char cmd)
GAT27 0:18ebb7348150 88 {
GAT27 0:18ebb7348150 89 int val;
GAT27 0:18ebb7348150 90
GAT27 0:18ebb7348150 91 val = read_reg(RESPONSE,1);
GAT27 0:18ebb7348150 92 while(val!=0)
GAT27 0:18ebb7348150 93 {
GAT27 0:18ebb7348150 94 write_reg(COMMAND,NOP);
GAT27 0:18ebb7348150 95 val = read_reg(RESPONSE,1);
GAT27 0:18ebb7348150 96 }
GAT27 0:18ebb7348150 97 do{
GAT27 0:18ebb7348150 98 write_reg(COMMAND,cmd);
GAT27 0:18ebb7348150 99 if(cmd==RESET) break;
GAT27 0:18ebb7348150 100 val = read_reg(RESPONSE,1);
GAT27 0:18ebb7348150 101 }while(val==0);
GAT27 0:18ebb7348150 102 }
GAT27 0:18ebb7348150 103
GAT27 1:28beeb2f209b 104 char SI1143::read_reg(/*unsigned*/ char address, int num_data) // Read a register
GAT27 0:18ebb7348150 105 {
GAT27 0:18ebb7348150 106 char tx[1];
GAT27 0:18ebb7348150 107 char rx[1];
GAT27 0:18ebb7348150 108
GAT27 1:28beeb2f209b 109 //i2c_->start();
GAT27 0:18ebb7348150 110 tx[0] = address;
GAT27 0:18ebb7348150 111 i2c_->write((IR_ADDRESS << 1) & 0xFE, tx, num_data);
GAT27 0:18ebb7348150 112 wait_ms(1);
GAT27 1:28beeb2f209b 113 //i2c_->stop();
GAT27 0:18ebb7348150 114
GAT27 1:28beeb2f209b 115 //i2c_->start();
GAT27 0:18ebb7348150 116 i2c_->read((IR_ADDRESS << 1) | 0x01, rx, num_data);
GAT27 0:18ebb7348150 117 wait_ms(1);
GAT27 1:28beeb2f209b 118 //i2c_->stop();
GAT27 0:18ebb7348150 119
GAT27 0:18ebb7348150 120 return rx[0];
GAT27 0:18ebb7348150 121 }
GAT27 0:18ebb7348150 122
GAT27 1:28beeb2f209b 123 void SI1143::write_reg(char address, char num_data) // Write a resigter
GAT27 1:28beeb2f209b 124 {
GAT27 0:18ebb7348150 125 char tx[2];
GAT27 5:3fadc61598bc 126
GAT27 5:3fadc61598bc 127 //i2c_->start();
GAT27 0:18ebb7348150 128 tx[0] = address;
GAT27 0:18ebb7348150 129 tx[1] = num_data;
GAT27 0:18ebb7348150 130 i2c_->write((IR_ADDRESS << 1) & 0xFE, tx, 2);
GAT27 0:18ebb7348150 131 wait_ms(1);
GAT27 1:28beeb2f209b 132 //i2c_->stop();
GAT27 0:18ebb7348150 133 }
GAT27 0:18ebb7348150 134
GAT27 5:3fadc61598bc 135 void SI1143::bias(int ready, int repeat)
GAT27 0:18ebb7348150 136 {
GAT27 5:3fadc61598bc 137 wait(ready);
dmcohen24 8:70933bf445af 138 //bias1 = get_ps1(repeat);
dmcohen24 8:70933bf445af 139 bias1 = 0;
GAT27 5:3fadc61598bc 140 bias2 = get_ps2(repeat);
GAT27 5:3fadc61598bc 141 bias3 = get_ps3(repeat);
GAT27 0:18ebb7348150 142 }
GAT27 0:18ebb7348150 143
GAT27 5:3fadc61598bc 144 int SI1143::get_ps1(int repeat) // Read the data for the first LED
GAT27 0:18ebb7348150 145 {
GAT27 5:3fadc61598bc 146 int stack = 0;
GAT27 5:3fadc61598bc 147
GAT27 0:18ebb7348150 148 command(PSALS_FORCE);
GAT27 0:18ebb7348150 149
GAT27 5:3fadc61598bc 150 for(int r=repeat; r>0; r=r-1)
GAT27 5:3fadc61598bc 151 {
GAT27 5:3fadc61598bc 152 LowB = read_reg(PS1_DATA0,1);
GAT27 5:3fadc61598bc 153 HighB = read_reg(PS1_DATA1,1);
GAT27 5:3fadc61598bc 154 stack = stack + (HighB * 256) + LowB;
GAT27 5:3fadc61598bc 155 }
GAT27 5:3fadc61598bc 156 PS1 = stack / repeat;
GAT27 0:18ebb7348150 157
GAT27 0:18ebb7348150 158 if(PS1 > bias1)
GAT27 0:18ebb7348150 159 PS1 = PS1 - bias1;
GAT27 0:18ebb7348150 160 else
GAT27 0:18ebb7348150 161 PS1 = 0;
GAT27 5:3fadc61598bc 162
GAT27 5:3fadc61598bc 163 return PS1;
GAT27 5:3fadc61598bc 164 }
GAT27 5:3fadc61598bc 165
GAT27 5:3fadc61598bc 166 int SI1143::get_ps2(int repeat) // Read the data for the second LED
GAT27 5:3fadc61598bc 167 {
GAT27 5:3fadc61598bc 168 int stack = 0;
GAT27 5:3fadc61598bc 169
GAT27 5:3fadc61598bc 170 command(PSALS_FORCE);
GAT27 5:3fadc61598bc 171
GAT27 5:3fadc61598bc 172 for(int r=repeat; r>0; r=r-1)
GAT27 5:3fadc61598bc 173 {
GAT27 5:3fadc61598bc 174 LowB = read_reg(PS2_DATA0,1);
GAT27 5:3fadc61598bc 175 HighB = read_reg(PS2_DATA1,1);
GAT27 5:3fadc61598bc 176 stack = stack + (HighB * 256) + LowB;
GAT27 5:3fadc61598bc 177 }
GAT27 5:3fadc61598bc 178 PS2 = stack / repeat;
GAT27 5:3fadc61598bc 179
GAT27 0:18ebb7348150 180 if(PS2 > bias2)
GAT27 0:18ebb7348150 181 PS2 = PS2 - bias2;
GAT27 0:18ebb7348150 182 else
GAT27 0:18ebb7348150 183 PS2 = 0;
GAT27 5:3fadc61598bc 184
GAT27 5:3fadc61598bc 185 return PS2;
GAT27 5:3fadc61598bc 186 }
GAT27 5:3fadc61598bc 187
GAT27 5:3fadc61598bc 188 int SI1143::get_ps3(int repeat) // Read the data for the third LED
GAT27 5:3fadc61598bc 189 {
GAT27 5:3fadc61598bc 190 int stack = 0;
GAT27 5:3fadc61598bc 191
GAT27 5:3fadc61598bc 192 command(PSALS_FORCE);
GAT27 5:3fadc61598bc 193
GAT27 5:3fadc61598bc 194 for(int r=repeat; r>0; r=r-1)
GAT27 5:3fadc61598bc 195 {
GAT27 5:3fadc61598bc 196 LowB = read_reg(PS3_DATA0,1);
GAT27 5:3fadc61598bc 197 HighB = read_reg(PS3_DATA1,1);
GAT27 5:3fadc61598bc 198 stack = stack + (HighB * 256) + LowB;
GAT27 5:3fadc61598bc 199 }
GAT27 5:3fadc61598bc 200 PS3 = stack / repeat;
GAT27 5:3fadc61598bc 201
GAT27 0:18ebb7348150 202 if(PS3 > bias3)
GAT27 0:18ebb7348150 203 PS3 = PS3 - bias3;
GAT27 0:18ebb7348150 204 else
GAT27 0:18ebb7348150 205 PS3 = 0;
GAT27 0:18ebb7348150 206
GAT27 5:3fadc61598bc 207 return PS3;
GAT27 0:18ebb7348150 208 }
GAT27 2:21381f11a5af 209
GAT27 5:3fadc61598bc 210 int SI1143::get_vis(int repeat) // Read the data for ambient light
GAT27 5:3fadc61598bc 211 {
GAT27 5:3fadc61598bc 212 int stack = 0;
GAT27 5:3fadc61598bc 213
GAT27 5:3fadc61598bc 214 command(PSALS_FORCE);
GAT27 5:3fadc61598bc 215
GAT27 5:3fadc61598bc 216 for(int r=repeat; r>0; r=r-1)
GAT27 5:3fadc61598bc 217 {
GAT27 5:3fadc61598bc 218 LowB = read_reg(ALS_VIS_DATA0,1);
GAT27 5:3fadc61598bc 219 HighB = read_reg(ALS_VIS_DATA1,1);
GAT27 5:3fadc61598bc 220 VIS = stack + (HighB * 256) + LowB;
GAT27 5:3fadc61598bc 221 }
GAT27 5:3fadc61598bc 222 VIS = stack / repeat;
GAT27 5:3fadc61598bc 223
GAT27 5:3fadc61598bc 224 return VIS;
GAT27 5:3fadc61598bc 225 }
GAT27 4:af8f820733e0 226
GAT27 5:3fadc61598bc 227 int SI1143::get_ir(int repeat) // Read the data for infrared light
GAT27 5:3fadc61598bc 228 {
GAT27 5:3fadc61598bc 229 int stack = 0;
GAT27 5:3fadc61598bc 230
GAT27 5:3fadc61598bc 231 command(PSALS_FORCE);
GAT27 5:3fadc61598bc 232
GAT27 5:3fadc61598bc 233 for(int r=repeat; r>0; r=r-1)
GAT27 5:3fadc61598bc 234 {
GAT27 5:3fadc61598bc 235 LowB = read_reg(ALS_IR_DATA0,1);
GAT27 5:3fadc61598bc 236 HighB = read_reg(ALS_IR_DATA1,1);
GAT27 5:3fadc61598bc 237 IR = stack + (HighB * 256) + LowB;
GAT27 5:3fadc61598bc 238 }
GAT27 5:3fadc61598bc 239 IR = stack / repeat;
GAT27 5:3fadc61598bc 240
GAT27 5:3fadc61598bc 241 return IR;
GAT27 5:3fadc61598bc 242 }