Starting library to get the SI1143 Gesture Sensor to work. Currently only works in forced conversion mode.

Dependents:   Gesture_Sensor Gesture_Arm_Robot mbed_gesture Gesture_Sensor_Sample ... more

Committer:
GAT27
Date:
Thu Oct 17 23:23:33 2013 +0000
Revision:
4:af8f820733e0
Parent:
3:cb3e8160f18e
Child:
5:3fadc61598bc
added a reset

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 3:cb3e8160f18e 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
GAT27 0:18ebb7348150 50 write_reg(HW_KEY,HW_KEY_VAL0); // Setting up LED Power to full
GAT27 0:18ebb7348150 51 write_reg(PS_LED21,0xAA);
GAT27 0:18ebb7348150 52 write_reg(PS_LED3,0x0A);
GAT27 0:18ebb7348150 53 write_reg(PARAM_WR, ALS_IR_TASK + ALS_VIS_TASK + PS1_TASK + PS2_TASK + PS3_TASK);
GAT27 0:18ebb7348150 54
GAT27 0:18ebb7348150 55 command(PARAM_SET + (CHLIST & 0x1F));
GAT27 0:18ebb7348150 56
GAT27 0:18ebb7348150 57 write_reg(INT_CFG,0);
GAT27 0:18ebb7348150 58 write_reg(IRQ_ENABLE,0);
GAT27 0:18ebb7348150 59 write_reg(IRQ_MODE1,0);
GAT27 0:18ebb7348150 60 write_reg(IRQ_MODE2,0);
GAT27 0:18ebb7348150 61 }
GAT27 0:18ebb7348150 62
GAT27 0:18ebb7348150 63 void SI1143::command(char cmd)
GAT27 0:18ebb7348150 64 {
GAT27 0:18ebb7348150 65 int val;
GAT27 0:18ebb7348150 66
GAT27 0:18ebb7348150 67 val = read_reg(RESPONSE,1);
GAT27 0:18ebb7348150 68 while(val!=0)
GAT27 0:18ebb7348150 69 {
GAT27 0:18ebb7348150 70 write_reg(COMMAND,NOP);
GAT27 0:18ebb7348150 71 val = read_reg(RESPONSE,1);
GAT27 0:18ebb7348150 72 }
GAT27 0:18ebb7348150 73 do{
GAT27 0:18ebb7348150 74 write_reg(COMMAND,cmd);
GAT27 0:18ebb7348150 75 if(cmd==RESET) break;
GAT27 0:18ebb7348150 76 val = read_reg(RESPONSE,1);
GAT27 0:18ebb7348150 77 }while(val==0);
GAT27 0:18ebb7348150 78 }
GAT27 0:18ebb7348150 79
GAT27 1:28beeb2f209b 80 char SI1143::read_reg(/*unsigned*/ char address, int num_data) // Read a register
GAT27 0:18ebb7348150 81 {
GAT27 0:18ebb7348150 82 char tx[1];
GAT27 0:18ebb7348150 83 char rx[1];
GAT27 0:18ebb7348150 84
GAT27 1:28beeb2f209b 85 //i2c_->start();
GAT27 0:18ebb7348150 86 tx[0] = address;
GAT27 0:18ebb7348150 87 i2c_->write((IR_ADDRESS << 1) & 0xFE, tx, num_data);
GAT27 0:18ebb7348150 88 wait_ms(1);
GAT27 1:28beeb2f209b 89 //i2c_->stop();
GAT27 0:18ebb7348150 90
GAT27 1:28beeb2f209b 91 //i2c_->start();
GAT27 0:18ebb7348150 92 i2c_->read((IR_ADDRESS << 1) | 0x01, rx, num_data);
GAT27 0:18ebb7348150 93 wait_ms(1);
GAT27 1:28beeb2f209b 94 //i2c_->stop();
GAT27 0:18ebb7348150 95
GAT27 0:18ebb7348150 96 return rx[0];
GAT27 0:18ebb7348150 97 }
GAT27 0:18ebb7348150 98
GAT27 1:28beeb2f209b 99 void SI1143::write_reg(char address, char num_data) // Write a resigter
GAT27 1:28beeb2f209b 100 {
GAT27 0:18ebb7348150 101 char tx[2];
GAT27 0:18ebb7348150 102
GAT27 0:18ebb7348150 103 tx[0] = address;
GAT27 0:18ebb7348150 104 tx[1] = num_data;
GAT27 0:18ebb7348150 105
GAT27 1:28beeb2f209b 106 //i2c_->start();
GAT27 0:18ebb7348150 107 i2c_->write((IR_ADDRESS << 1) & 0xFE, tx, 2);
GAT27 0:18ebb7348150 108 wait_ms(1);
GAT27 1:28beeb2f209b 109 //i2c_->stop();
GAT27 0:18ebb7348150 110 }
GAT27 0:18ebb7348150 111
GAT27 0:18ebb7348150 112 void SI1143::bias()
GAT27 0:18ebb7348150 113 {
GAT27 0:18ebb7348150 114 sample(0);
GAT27 0:18ebb7348150 115 bias1 = PS1;
GAT27 0:18ebb7348150 116 bias2 = PS2;
GAT27 0:18ebb7348150 117 bias3 = PS3;
GAT27 0:18ebb7348150 118 }
GAT27 0:18ebb7348150 119
GAT27 0:18ebb7348150 120 int SI1143::sample(int point)
GAT27 0:18ebb7348150 121 {
GAT27 0:18ebb7348150 122 //int data[5];
GAT27 0:18ebb7348150 123 command(PSALS_FORCE);
GAT27 0:18ebb7348150 124
GAT27 1:28beeb2f209b 125 LowB = read_reg(ALS_VIS_DATA0,1); // Read the data for ambient light
GAT27 0:18ebb7348150 126 HighB = read_reg(ALS_VIS_DATA1,1);
GAT27 0:18ebb7348150 127 VIS = (HighB * 256) + LowB;
GAT27 0:18ebb7348150 128
GAT27 1:28beeb2f209b 129 LowB = read_reg(ALS_IR_DATA0,1); // Read the data for infrared light
GAT27 0:18ebb7348150 130 HighB = read_reg(ALS_IR_DATA1,1);
GAT27 0:18ebb7348150 131 IR = (HighB * 256) + LowB;
GAT27 0:18ebb7348150 132
GAT27 0:18ebb7348150 133 LowB = read_reg(PS1_DATA0,1); // Read the data for the first LED
GAT27 0:18ebb7348150 134 HighB = read_reg(PS1_DATA1,1);
GAT27 0:18ebb7348150 135 PS1 = (HighB * 256) + LowB;
GAT27 0:18ebb7348150 136
GAT27 1:28beeb2f209b 137 LowB = read_reg(PS2_DATA0,1); // Read the data for the second LED
GAT27 0:18ebb7348150 138 HighB = read_reg(PS2_DATA1,1);
GAT27 0:18ebb7348150 139 PS2 = (HighB * 256) + LowB;
GAT27 0:18ebb7348150 140
GAT27 1:28beeb2f209b 141 LowB = read_reg(PS3_DATA0,1); // Read the data for the third LED
GAT27 0:18ebb7348150 142 HighB = read_reg(PS3_DATA1,1);
GAT27 0:18ebb7348150 143 PS3 = (HighB * 256) + LowB;
GAT27 0:18ebb7348150 144
GAT27 0:18ebb7348150 145 if(PS1 > bias1)
GAT27 0:18ebb7348150 146 PS1 = PS1 - bias1;
GAT27 0:18ebb7348150 147 else
GAT27 0:18ebb7348150 148 PS1 = 0;
GAT27 0:18ebb7348150 149 if(PS2 > bias2)
GAT27 0:18ebb7348150 150 PS2 = PS2 - bias2;
GAT27 0:18ebb7348150 151 else
GAT27 0:18ebb7348150 152 PS2 = 0;
GAT27 0:18ebb7348150 153 if(PS3 > bias3)
GAT27 0:18ebb7348150 154 PS3 = PS3 - bias3;
GAT27 0:18ebb7348150 155 else
GAT27 0:18ebb7348150 156 PS3 = 0;
GAT27 0:18ebb7348150 157
GAT27 0:18ebb7348150 158 switch(point)
GAT27 0:18ebb7348150 159 {
GAT27 3:cb3e8160f18e 160 case 1: return PS1;
GAT27 3:cb3e8160f18e 161 case 2: return PS2;
GAT27 3:cb3e8160f18e 162 case 3: return PS3;
GAT27 3:cb3e8160f18e 163 case 4: return VIS;
GAT27 3:cb3e8160f18e 164 case 5: return IR;
GAT27 0:18ebb7348150 165 default: return 0;
GAT27 0:18ebb7348150 166 }
GAT27 0:18ebb7348150 167 //data[0] = VIS;
GAT27 0:18ebb7348150 168 //data[1] = IR;
GAT27 0:18ebb7348150 169 //data[2] = PS1;
GAT27 0:18ebb7348150 170 //data[3] = PS2;
GAT27 0:18ebb7348150 171 //data[4] = PS3;
GAT27 0:18ebb7348150 172
GAT27 0:18ebb7348150 173 //return data;
GAT27 0:18ebb7348150 174
GAT27 0:18ebb7348150 175 //return PS1;
GAT27 0:18ebb7348150 176 }
GAT27 2:21381f11a5af 177
GAT27 4:af8f820733e0 178