cvbxcvxcv

Committer:
dendanny
Date:
Tue Aug 27 14:44:35 2019 +0000
Revision:
10:220ab90b446d
Parent:
8:118f07a02abc
pff

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jurica238814 0:cc5d477d5dbe 1 /*
jurica238814 0:cc5d477d5dbe 2 *
jurica238814 0:cc5d477d5dbe 3 * LIS2DH12 MEMS digital output motion sensor
jurica238814 0:cc5d477d5dbe 4 * More info @ aconno.de
jurica238814 0:cc5d477d5dbe 5 * Made by Jurica Resetar
jurica238814 0:cc5d477d5dbe 6 * jurica_resetar@yahoo.com
Dominik Bartolovic 7:f1ba533021b8 7 *
jurica238814 0:cc5d477d5dbe 8 */
Dominik Bartolovic 7:f1ba533021b8 9
jurica238814 0:cc5d477d5dbe 10 #include "Lis2dh12.h"
jurica238814 0:cc5d477d5dbe 11 #include "Lis2dh12_regs.h"
jurica238814 0:cc5d477d5dbe 12
Dominik Bartolovic 7:f1ba533021b8 13 Lis2dh12::Lis2dh12(I2C *i2c_, char address) : i2c(i2c_, address),
Dominik Bartolovic 7:f1ba533021b8 14 spiInterface(false){
Dominik Bartolovic 7:f1ba533021b8 15 }
Dominik Bartolovic 7:f1ba533021b8 16
Dominik Bartolovic 7:f1ba533021b8 17 Lis2dh12::Lis2dh12(SPI *_spi, DigitalOut *_cs) : i2c(NULL, 0),
Dominik Bartolovic 7:f1ba533021b8 18 spi(_spi),
Dominik Bartolovic 7:f1ba533021b8 19 cs(_cs),
Dominik Bartolovic 7:f1ba533021b8 20 spiInterface(true){
Dominik Bartolovic 7:f1ba533021b8 21 *cs = 1;
Dominik Bartolovic 7:f1ba533021b8 22 spi->format(8, 3);
Dominik Bartolovic 7:f1ba533021b8 23 spi->frequency(1000000);
jurica238814 0:cc5d477d5dbe 24 }
jurica238814 0:cc5d477d5dbe 25
jurica238814 0:cc5d477d5dbe 26 uint8_t Lis2dh12::whoIAm(){
jurica238814 0:cc5d477d5dbe 27 char regAddr = (char)WHO_AM_I;
jurica238814 0:cc5d477d5dbe 28 char regData;
Dominik Bartolovic 7:f1ba533021b8 29 readFromReg(regAddr, (uint8_t*)&regData, 1);
jurica238814 0:cc5d477d5dbe 30 return (uint8_t)regData;
jurica238814 0:cc5d477d5dbe 31 }
jurica238814 0:cc5d477d5dbe 32
jurica238814 0:cc5d477d5dbe 33 uint8_t Lis2dh12::setMode(Mode mode){
jurica238814 0:cc5d477d5dbe 34 char ctrl1Copy;
jurica238814 0:cc5d477d5dbe 35 char ctrl4Copy;
jurica238814 0:cc5d477d5dbe 36 uint8_t success;
Dominik Bartolovic 7:f1ba533021b8 37
Dominik Bartolovic 7:f1ba533021b8 38 readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
Dominik Bartolovic 7:f1ba533021b8 39 readFromReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1);
Dominik Bartolovic 7:f1ba533021b8 40
jurica238814 0:cc5d477d5dbe 41 switch(mode){
jurica238814 0:cc5d477d5dbe 42 case HIGH_RES:
jurica238814 0:cc5d477d5dbe 43 ctrl1Copy &= 0xF7;
jurica238814 0:cc5d477d5dbe 44 ctrl4Copy |= 0x08;
jurica238814 0:cc5d477d5dbe 45 break;
jurica238814 0:cc5d477d5dbe 46 case NORMAL:
jurica238814 0:cc5d477d5dbe 47 ctrl1Copy &= 0xF7;
jurica238814 0:cc5d477d5dbe 48 ctrl4Copy &= 0xF7;
jurica238814 0:cc5d477d5dbe 49 break;
jurica238814 0:cc5d477d5dbe 50 case LOW_POWER:
jurica238814 0:cc5d477d5dbe 51 ctrl1Copy |= 0x08;
jurica238814 0:cc5d477d5dbe 52 ctrl4Copy &= 0xF7;
jurica238814 0:cc5d477d5dbe 53 break;
jurica238814 0:cc5d477d5dbe 54 default:
jurica238814 0:cc5d477d5dbe 55 return 0;
jurica238814 0:cc5d477d5dbe 56 }
Dominik Bartolovic 7:f1ba533021b8 57 writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
Dominik Bartolovic 7:f1ba533021b8 58 success = writeToReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1);
jurica238814 0:cc5d477d5dbe 59 return success;
jurica238814 0:cc5d477d5dbe 60 }
jurica238814 0:cc5d477d5dbe 61
jurica238814 0:cc5d477d5dbe 62 uint8_t Lis2dh12::enableAxes(Axis axis){
jurica238814 0:cc5d477d5dbe 63 char ctrl1Copy;
Dominik Bartolovic 7:f1ba533021b8 64 readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 65 ctrl1Copy |= axis;
Dominik Bartolovic 7:f1ba533021b8 66 writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 67 return 0;
jurica238814 0:cc5d477d5dbe 68 }
jurica238814 0:cc5d477d5dbe 69
jurica238814 0:cc5d477d5dbe 70 uint8_t Lis2dh12::disableAxes(Axis axis){
jurica238814 0:cc5d477d5dbe 71 char ctrl1Copy;
Dominik Bartolovic 7:f1ba533021b8 72 readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 73 ctrl1Copy &= ~(1 << axis);
Dominik Bartolovic 7:f1ba533021b8 74 writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 75 return 0;
jurica238814 0:cc5d477d5dbe 76 }
jurica238814 0:cc5d477d5dbe 77
jurica238814 0:cc5d477d5dbe 78 int16_t Lis2dh12::readXAxis(){
jurica238814 0:cc5d477d5dbe 79 int16_t rawData;
jurica238814 0:cc5d477d5dbe 80 char tempData;
dendanny 10:220ab90b446d 81 /*
jurica238814 1:d89f4b12116b 82 // Make sure new data is ready
jurica238814 1:d89f4b12116b 83 do{
Dominik Bartolovic 7:f1ba533021b8 84 readFromReg((char)STATUS, (uint8_t*)&tempData, 1);
jurica238814 1:d89f4b12116b 85 }while(!(tempData & 0x08));
jurica238814 1:d89f4b12116b 86 do{
Dominik Bartolovic 7:f1ba533021b8 87 readFromReg((char)STATUS, (uint8_t*)&tempData, 1);
jurica238814 1:d89f4b12116b 88 }while(!(tempData & 0x80));
dendanny 10:220ab90b446d 89 */
dendanny 10:220ab90b446d 90
jurica238814 1:d89f4b12116b 91 // Same data have been overwritten
eedisp 8:118f07a02abc 92 readFromReg((char)OUT_X_H, (uint8_t*)&tempData, 1);
eedisp 8:118f07a02abc 93 rawData = (int8_t)tempData << 8;
eedisp 8:118f07a02abc 94 // readFromReg((char)OUT_X_L, (uint8_t*)&rawData, 1);
eedisp 8:118f07a02abc 95 // readFromReg((char)OUT_X_H, ((uint8_t*)&rawData)+1, 1);
Dominik Bartolovic 7:f1ba533021b8 96
dbartolovic 5:15d1c73137e8 97 if (rawData >= 0)
dbartolovic 5:15d1c73137e8 98 rawData = (rawData>>4);
dbartolovic 5:15d1c73137e8 99 else
dbartolovic 5:15d1c73137e8 100 rawData = (rawData>>4) | 0xF000;
Dominik Bartolovic 7:f1ba533021b8 101
jurica238814 0:cc5d477d5dbe 102 return rawData;
jurica238814 0:cc5d477d5dbe 103 }
jurica238814 0:cc5d477d5dbe 104
jurica238814 0:cc5d477d5dbe 105 int16_t Lis2dh12::readYAxis(){
jurica238814 0:cc5d477d5dbe 106 int16_t rawData;
jurica238814 0:cc5d477d5dbe 107 char tempData;
eedisp 8:118f07a02abc 108 readFromReg((char)OUT_Y_H, (uint8_t*)&tempData, 1);
eedisp 8:118f07a02abc 109 rawData = (int8_t)tempData << 8;
eedisp 8:118f07a02abc 110 // readFromReg((char)OUT_Y_L, (uint8_t*)&rawData, 1);
eedisp 8:118f07a02abc 111 // readFromReg((char)OUT_Y_H, ((uint8_t*)&rawData)+1, 1);
Dominik Bartolovic 7:f1ba533021b8 112
dbartolovic 5:15d1c73137e8 113 if (rawData >= 0)
dbartolovic 5:15d1c73137e8 114 rawData = (rawData>>4);
dbartolovic 5:15d1c73137e8 115 else
dbartolovic 5:15d1c73137e8 116 rawData = (rawData>>4) | 0xF000;
Dominik Bartolovic 7:f1ba533021b8 117
jurica238814 0:cc5d477d5dbe 118 return rawData;
jurica238814 0:cc5d477d5dbe 119 }
jurica238814 0:cc5d477d5dbe 120
jurica238814 0:cc5d477d5dbe 121 int16_t Lis2dh12::readZAxis(){
jurica238814 4:043396f22548 122 int16_t rawData = 0;
jurica238814 0:cc5d477d5dbe 123 char tempData;
eedisp 8:118f07a02abc 124 readFromReg((char)OUT_Z_H, (uint8_t*)&tempData, 1);
eedisp 8:118f07a02abc 125 rawData = (int8_t)tempData << 8;
eedisp 8:118f07a02abc 126 // readFromReg((char)OUT_Z_L, (uint8_t*)&rawData, 1);
eedisp 8:118f07a02abc 127 // readFromReg((char)OUT_Z_H, ((uint8_t*)&rawData)+1, 1);
Dominik Bartolovic 7:f1ba533021b8 128
dbartolovic 5:15d1c73137e8 129 if (rawData >= 0)
dbartolovic 5:15d1c73137e8 130 rawData = (rawData>>4);
dbartolovic 5:15d1c73137e8 131 else
dbartolovic 5:15d1c73137e8 132 rawData = (rawData>>4) | 0xF000;
Dominik Bartolovic 7:f1ba533021b8 133
jurica238814 0:cc5d477d5dbe 134 return rawData;
jurica238814 0:cc5d477d5dbe 135 }
jurica238814 0:cc5d477d5dbe 136
jurica238814 0:cc5d477d5dbe 137 uint8_t Lis2dh12::setODR(Odr odr){
jurica238814 0:cc5d477d5dbe 138 char ctrl1Copy;
Dominik Bartolovic 7:f1ba533021b8 139 readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 140 ctrl1Copy |= (odr << 4);
Dominik Bartolovic 7:f1ba533021b8 141 writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 142 return 0;
jurica238814 0:cc5d477d5dbe 143 }
jurica238814 0:cc5d477d5dbe 144
jurica238814 0:cc5d477d5dbe 145 uint8_t Lis2dh12::setScale(Scale scale){
jurica238814 0:cc5d477d5dbe 146 char ctrl4Copy;
Dominik Bartolovic 7:f1ba533021b8 147 readFromReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1);
jurica238814 0:cc5d477d5dbe 148 ctrl4Copy |= (scale << 4);
Dominik Bartolovic 7:f1ba533021b8 149 writeToReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1);
jurica238814 0:cc5d477d5dbe 150 return 0;
jurica238814 0:cc5d477d5dbe 151 }
jurica238814 0:cc5d477d5dbe 152
jurica238814 2:1fa08c7a2a3c 153 /* Interrupt activity 1 driven to INT1 pad */
Dominik Bartolovic 7:f1ba533021b8 154 // TODO: Napraviti tako da postoji samo jedna metoda int1Setup koja prima gro
jurica238814 2:1fa08c7a2a3c 155 // parametara: THS, DUR, Latch...
jurica238814 2:1fa08c7a2a3c 156 uint8_t Lis2dh12::int1Setup(uint8_t setup){
jurica238814 2:1fa08c7a2a3c 157 char data = setup;
Dominik Bartolovic 7:f1ba533021b8 158 writeToReg((char)CTRL_REG3, (uint8_t*)&data, 1);
jurica238814 2:1fa08c7a2a3c 159 return 0;
jurica238814 2:1fa08c7a2a3c 160 }
jurica238814 2:1fa08c7a2a3c 161
jurica238814 2:1fa08c7a2a3c 162 uint8_t Lis2dh12::int1Latch(uint8_t enable){
jurica238814 2:1fa08c7a2a3c 163 char ctrl5Copy;
Dominik Bartolovic 7:f1ba533021b8 164 readFromReg((char)CTRL_REG5, (uint8_t*)&ctrl5Copy, 1);
jurica238814 2:1fa08c7a2a3c 165 ctrl5Copy |= enable;
Dominik Bartolovic 7:f1ba533021b8 166 writeToReg((char)CTRL_REG5, (uint8_t*)&ctrl5Copy, 1);
Dominik Bartolovic 7:f1ba533021b8 167 return 0;
jurica238814 2:1fa08c7a2a3c 168 }
jurica238814 2:1fa08c7a2a3c 169
jurica238814 2:1fa08c7a2a3c 170 uint8_t Lis2dh12::int1Duration(uint8_t duration){
jurica238814 2:1fa08c7a2a3c 171 char copy = duration;
Dominik Bartolovic 7:f1ba533021b8 172 writeToReg((char)INT1_DURATION, (uint8_t*)&copy, 1);
jurica238814 2:1fa08c7a2a3c 173 return 0;
jurica238814 2:1fa08c7a2a3c 174 }
jurica238814 2:1fa08c7a2a3c 175
jurica238814 2:1fa08c7a2a3c 176 uint8_t Lis2dh12::int1Threshold(uint8_t threshold){
jurica238814 2:1fa08c7a2a3c 177 char copy = threshold;
Dominik Bartolovic 7:f1ba533021b8 178 writeToReg((char)INT1_THS, (uint8_t*)&copy, 1);
jurica238814 2:1fa08c7a2a3c 179 return 0;
jurica238814 2:1fa08c7a2a3c 180 }
jurica238814 2:1fa08c7a2a3c 181
jurica238814 2:1fa08c7a2a3c 182 uint8_t Lis2dh12::int1Config(uint8_t config){
jurica238814 2:1fa08c7a2a3c 183 char copy = config;
Dominik Bartolovic 7:f1ba533021b8 184 writeToReg((char)INT1_CFG, (uint8_t*)&copy, 1);
jurica238814 2:1fa08c7a2a3c 185 return 0;
jurica238814 2:1fa08c7a2a3c 186 }
jurica238814 2:1fa08c7a2a3c 187
jurica238814 2:1fa08c7a2a3c 188 void Lis2dh12::clearIntFlag(){
jurica238814 2:1fa08c7a2a3c 189 char data;
Dominik Bartolovic 7:f1ba533021b8 190 readFromReg((char)INT1_SRC, (uint8_t*)&data, 1);
jurica238814 2:1fa08c7a2a3c 191 }
jurica238814 0:cc5d477d5dbe 192
Dominik Bartolovic 7:f1ba533021b8 193 uint8_t Lis2dh12::readFromReg(uint8_t regAddr, uint8_t *buff, size_t buffSize)
Dominik Bartolovic 7:f1ba533021b8 194 {
Dominik Bartolovic 7:f1ba533021b8 195 // Most significant bit represents read from register, bit after it
Dominik Bartolovic 7:f1ba533021b8 196 // represents address increment if multiple read, which is enabled.
Dominik Bartolovic 7:f1ba533021b8 197 const uint8_t spiSetup = 0xC0;
Dominik Bartolovic 7:f1ba533021b8 198
Dominik Bartolovic 7:f1ba533021b8 199 uint8_t retVal = 0;
Dominik Bartolovic 7:f1ba533021b8 200
Dominik Bartolovic 7:f1ba533021b8 201 if( spiInterface )
Dominik Bartolovic 7:f1ba533021b8 202 {
Dominik Bartolovic 7:f1ba533021b8 203 *cs = 0;
Dominik Bartolovic 7:f1ba533021b8 204
Dominik Bartolovic 7:f1ba533021b8 205 spi->write(spiSetup | regAddr);
Dominik Bartolovic 7:f1ba533021b8 206
Dominik Bartolovic 7:f1ba533021b8 207 while(buffSize--)
Dominik Bartolovic 7:f1ba533021b8 208 {
Dominik Bartolovic 7:f1ba533021b8 209 *buff = spi->write(0x00);
Dominik Bartolovic 7:f1ba533021b8 210 buff++;
Dominik Bartolovic 7:f1ba533021b8 211 }
Dominik Bartolovic 7:f1ba533021b8 212
Dominik Bartolovic 7:f1ba533021b8 213 *cs = 1;
Dominik Bartolovic 7:f1ba533021b8 214 }
Dominik Bartolovic 7:f1ba533021b8 215 else
Dominik Bartolovic 7:f1ba533021b8 216 {
Dominik Bartolovic 7:f1ba533021b8 217 retVal = i2c.readFromReg((char)regAddr, (char*)buff, buffSize);
Dominik Bartolovic 7:f1ba533021b8 218 }
Dominik Bartolovic 7:f1ba533021b8 219
Dominik Bartolovic 7:f1ba533021b8 220 return retVal;
Dominik Bartolovic 7:f1ba533021b8 221 }
Dominik Bartolovic 7:f1ba533021b8 222
Dominik Bartolovic 7:f1ba533021b8 223 uint8_t Lis2dh12::writeToReg(uint8_t regAddr, uint8_t *buff, size_t buffSize)
Dominik Bartolovic 7:f1ba533021b8 224 {
Dominik Bartolovic 7:f1ba533021b8 225 // Most significant bit represents write from register, bit after it
Dominik Bartolovic 7:f1ba533021b8 226 // represents address increment if multiple write, which is enabled.
Dominik Bartolovic 7:f1ba533021b8 227 const uint8_t spiSetup = 0x40;
Dominik Bartolovic 7:f1ba533021b8 228
Dominik Bartolovic 7:f1ba533021b8 229 uint8_t retVal = 0;
Dominik Bartolovic 7:f1ba533021b8 230
Dominik Bartolovic 7:f1ba533021b8 231 if( spiInterface )
Dominik Bartolovic 7:f1ba533021b8 232 {
Dominik Bartolovic 7:f1ba533021b8 233 *cs = 0;
Dominik Bartolovic 7:f1ba533021b8 234
Dominik Bartolovic 7:f1ba533021b8 235 spi->write(spiSetup | regAddr);
Dominik Bartolovic 7:f1ba533021b8 236
Dominik Bartolovic 7:f1ba533021b8 237 while(buffSize--)
Dominik Bartolovic 7:f1ba533021b8 238 {
Dominik Bartolovic 7:f1ba533021b8 239 spi->write(*buff);
Dominik Bartolovic 7:f1ba533021b8 240 buff++;
Dominik Bartolovic 7:f1ba533021b8 241 }
Dominik Bartolovic 7:f1ba533021b8 242
Dominik Bartolovic 7:f1ba533021b8 243 *cs = 1;
Dominik Bartolovic 7:f1ba533021b8 244 }
Dominik Bartolovic 7:f1ba533021b8 245 else
Dominik Bartolovic 7:f1ba533021b8 246 {
Dominik Bartolovic 7:f1ba533021b8 247 retVal = i2c.writeToReg((char)regAddr, (char*)buff, buffSize);
Dominik Bartolovic 7:f1ba533021b8 248 }
Dominik Bartolovic 7:f1ba533021b8 249
Dominik Bartolovic 7:f1ba533021b8 250 return retVal;
Dominik Bartolovic 7:f1ba533021b8 251 }