Library for LIS2DH12 acc.

Dependents:   acnSensa_LIS aconnoCellularGnss Lizzy

Committer:
Dominik Bartolovic
Date:
Mon Oct 15 16:06:53 2018 +0200
Revision:
7:f1ba533021b8
Parent:
6:b7e3a0c1210b
Added SPI support

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;
jurica238814 1:d89f4b12116b 81 // Make sure new data is ready
jurica238814 1:d89f4b12116b 82 do{
Dominik Bartolovic 7:f1ba533021b8 83 readFromReg((char)STATUS, (uint8_t*)&tempData, 1);
jurica238814 1:d89f4b12116b 84 }while(!(tempData & 0x08));
jurica238814 1:d89f4b12116b 85 do{
Dominik Bartolovic 7:f1ba533021b8 86 readFromReg((char)STATUS, (uint8_t*)&tempData, 1);
jurica238814 1:d89f4b12116b 87 }while(!(tempData & 0x80));
jurica238814 1:d89f4b12116b 88 // Same data have been overwritten
Dominik Bartolovic 7:f1ba533021b8 89
Dominik Bartolovic 7:f1ba533021b8 90 //readFromReg((char)OUT_X_H, (uint8_t*)&tempData, 1);
jurica238814 4:043396f22548 91 //rawData = (int8_t)tempData << 8;
Dominik Bartolovic 7:f1ba533021b8 92 readFromReg((char)OUT_X_L, (uint8_t*)&rawData, 1);
Dominik Bartolovic 7:f1ba533021b8 93 readFromReg((char)OUT_X_H, ((uint8_t*)&rawData)+1, 1);
Dominik Bartolovic 7:f1ba533021b8 94
dbartolovic 5:15d1c73137e8 95 if (rawData >= 0)
dbartolovic 5:15d1c73137e8 96 rawData = (rawData>>4);
dbartolovic 5:15d1c73137e8 97 else
dbartolovic 5:15d1c73137e8 98 rawData = (rawData>>4) | 0xF000;
Dominik Bartolovic 7:f1ba533021b8 99
jurica238814 0:cc5d477d5dbe 100 return rawData;
jurica238814 0:cc5d477d5dbe 101 }
jurica238814 0:cc5d477d5dbe 102
jurica238814 0:cc5d477d5dbe 103 int16_t Lis2dh12::readYAxis(){
jurica238814 0:cc5d477d5dbe 104 int16_t rawData;
jurica238814 0:cc5d477d5dbe 105 char tempData;
Dominik Bartolovic 7:f1ba533021b8 106 //readFromReg((char)OUT_Y_H, (uint8_t*)&tempData, 1);
jurica238814 4:043396f22548 107 //rawData = (int8_t)tempData << 8;
Dominik Bartolovic 7:f1ba533021b8 108 readFromReg((char)OUT_Y_L, (uint8_t*)&rawData, 1);
Dominik Bartolovic 7:f1ba533021b8 109 readFromReg((char)OUT_Y_H, ((uint8_t*)&rawData)+1, 1);
Dominik Bartolovic 7:f1ba533021b8 110
dbartolovic 5:15d1c73137e8 111 if (rawData >= 0)
dbartolovic 5:15d1c73137e8 112 rawData = (rawData>>4);
dbartolovic 5:15d1c73137e8 113 else
dbartolovic 5:15d1c73137e8 114 rawData = (rawData>>4) | 0xF000;
Dominik Bartolovic 7:f1ba533021b8 115
jurica238814 0:cc5d477d5dbe 116 return rawData;
jurica238814 0:cc5d477d5dbe 117 }
jurica238814 0:cc5d477d5dbe 118
jurica238814 0:cc5d477d5dbe 119 int16_t Lis2dh12::readZAxis(){
jurica238814 4:043396f22548 120 int16_t rawData = 0;
jurica238814 0:cc5d477d5dbe 121 char tempData;
Dominik Bartolovic 7:f1ba533021b8 122 //readFromReg((char)OUT_Z_H, (uint8_t*)&tempData, 1);
jurica238814 4:043396f22548 123 //rawData = (int8_t)tempData << 8;
Dominik Bartolovic 7:f1ba533021b8 124 readFromReg((char)OUT_Z_L, (uint8_t*)&rawData, 1);
Dominik Bartolovic 7:f1ba533021b8 125 readFromReg((char)OUT_Z_H, ((uint8_t*)&rawData)+1, 1);
Dominik Bartolovic 7:f1ba533021b8 126
dbartolovic 5:15d1c73137e8 127 if (rawData >= 0)
dbartolovic 5:15d1c73137e8 128 rawData = (rawData>>4);
dbartolovic 5:15d1c73137e8 129 else
dbartolovic 5:15d1c73137e8 130 rawData = (rawData>>4) | 0xF000;
Dominik Bartolovic 7:f1ba533021b8 131
jurica238814 0:cc5d477d5dbe 132 return rawData;
jurica238814 0:cc5d477d5dbe 133 }
jurica238814 0:cc5d477d5dbe 134
jurica238814 0:cc5d477d5dbe 135 uint8_t Lis2dh12::setODR(Odr odr){
jurica238814 0:cc5d477d5dbe 136 char ctrl1Copy;
Dominik Bartolovic 7:f1ba533021b8 137 readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 138 ctrl1Copy |= (odr << 4);
Dominik Bartolovic 7:f1ba533021b8 139 writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 140 return 0;
jurica238814 0:cc5d477d5dbe 141 }
jurica238814 0:cc5d477d5dbe 142
jurica238814 0:cc5d477d5dbe 143 uint8_t Lis2dh12::setScale(Scale scale){
jurica238814 0:cc5d477d5dbe 144 char ctrl4Copy;
Dominik Bartolovic 7:f1ba533021b8 145 readFromReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1);
jurica238814 0:cc5d477d5dbe 146 ctrl4Copy |= (scale << 4);
Dominik Bartolovic 7:f1ba533021b8 147 writeToReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1);
jurica238814 0:cc5d477d5dbe 148 return 0;
jurica238814 0:cc5d477d5dbe 149 }
jurica238814 0:cc5d477d5dbe 150
jurica238814 2:1fa08c7a2a3c 151 /* Interrupt activity 1 driven to INT1 pad */
Dominik Bartolovic 7:f1ba533021b8 152 // TODO: Napraviti tako da postoji samo jedna metoda int1Setup koja prima gro
jurica238814 2:1fa08c7a2a3c 153 // parametara: THS, DUR, Latch...
jurica238814 2:1fa08c7a2a3c 154 uint8_t Lis2dh12::int1Setup(uint8_t setup){
jurica238814 2:1fa08c7a2a3c 155 char data = setup;
Dominik Bartolovic 7:f1ba533021b8 156 writeToReg((char)CTRL_REG3, (uint8_t*)&data, 1);
jurica238814 2:1fa08c7a2a3c 157 return 0;
jurica238814 2:1fa08c7a2a3c 158 }
jurica238814 2:1fa08c7a2a3c 159
jurica238814 2:1fa08c7a2a3c 160 uint8_t Lis2dh12::int1Latch(uint8_t enable){
jurica238814 2:1fa08c7a2a3c 161 char ctrl5Copy;
Dominik Bartolovic 7:f1ba533021b8 162 readFromReg((char)CTRL_REG5, (uint8_t*)&ctrl5Copy, 1);
jurica238814 2:1fa08c7a2a3c 163 ctrl5Copy |= enable;
Dominik Bartolovic 7:f1ba533021b8 164 writeToReg((char)CTRL_REG5, (uint8_t*)&ctrl5Copy, 1);
Dominik Bartolovic 7:f1ba533021b8 165 return 0;
jurica238814 2:1fa08c7a2a3c 166 }
jurica238814 2:1fa08c7a2a3c 167
jurica238814 2:1fa08c7a2a3c 168 uint8_t Lis2dh12::int1Duration(uint8_t duration){
jurica238814 2:1fa08c7a2a3c 169 char copy = duration;
Dominik Bartolovic 7:f1ba533021b8 170 writeToReg((char)INT1_DURATION, (uint8_t*)&copy, 1);
jurica238814 2:1fa08c7a2a3c 171 return 0;
jurica238814 2:1fa08c7a2a3c 172 }
jurica238814 2:1fa08c7a2a3c 173
jurica238814 2:1fa08c7a2a3c 174 uint8_t Lis2dh12::int1Threshold(uint8_t threshold){
jurica238814 2:1fa08c7a2a3c 175 char copy = threshold;
Dominik Bartolovic 7:f1ba533021b8 176 writeToReg((char)INT1_THS, (uint8_t*)&copy, 1);
jurica238814 2:1fa08c7a2a3c 177 return 0;
jurica238814 2:1fa08c7a2a3c 178 }
jurica238814 2:1fa08c7a2a3c 179
jurica238814 2:1fa08c7a2a3c 180 uint8_t Lis2dh12::int1Config(uint8_t config){
jurica238814 2:1fa08c7a2a3c 181 char copy = config;
Dominik Bartolovic 7:f1ba533021b8 182 writeToReg((char)INT1_CFG, (uint8_t*)&copy, 1);
jurica238814 2:1fa08c7a2a3c 183 return 0;
jurica238814 2:1fa08c7a2a3c 184 }
jurica238814 2:1fa08c7a2a3c 185
jurica238814 2:1fa08c7a2a3c 186 void Lis2dh12::clearIntFlag(){
jurica238814 2:1fa08c7a2a3c 187 char data;
Dominik Bartolovic 7:f1ba533021b8 188 readFromReg((char)INT1_SRC, (uint8_t*)&data, 1);
jurica238814 2:1fa08c7a2a3c 189 }
jurica238814 0:cc5d477d5dbe 190
Dominik Bartolovic 7:f1ba533021b8 191 uint8_t Lis2dh12::readFromReg(uint8_t regAddr, uint8_t *buff, size_t buffSize)
Dominik Bartolovic 7:f1ba533021b8 192 {
Dominik Bartolovic 7:f1ba533021b8 193 // Most significant bit represents read from register, bit after it
Dominik Bartolovic 7:f1ba533021b8 194 // represents address increment if multiple read, which is enabled.
Dominik Bartolovic 7:f1ba533021b8 195 const uint8_t spiSetup = 0xC0;
Dominik Bartolovic 7:f1ba533021b8 196
Dominik Bartolovic 7:f1ba533021b8 197 uint8_t retVal = 0;
Dominik Bartolovic 7:f1ba533021b8 198
Dominik Bartolovic 7:f1ba533021b8 199 if( spiInterface )
Dominik Bartolovic 7:f1ba533021b8 200 {
Dominik Bartolovic 7:f1ba533021b8 201 *cs = 0;
Dominik Bartolovic 7:f1ba533021b8 202
Dominik Bartolovic 7:f1ba533021b8 203 spi->write(spiSetup | regAddr);
Dominik Bartolovic 7:f1ba533021b8 204
Dominik Bartolovic 7:f1ba533021b8 205 while(buffSize--)
Dominik Bartolovic 7:f1ba533021b8 206 {
Dominik Bartolovic 7:f1ba533021b8 207 *buff = spi->write(0x00);
Dominik Bartolovic 7:f1ba533021b8 208 buff++;
Dominik Bartolovic 7:f1ba533021b8 209 }
Dominik Bartolovic 7:f1ba533021b8 210
Dominik Bartolovic 7:f1ba533021b8 211 *cs = 1;
Dominik Bartolovic 7:f1ba533021b8 212 }
Dominik Bartolovic 7:f1ba533021b8 213 else
Dominik Bartolovic 7:f1ba533021b8 214 {
Dominik Bartolovic 7:f1ba533021b8 215 retVal = i2c.readFromReg((char)regAddr, (char*)buff, buffSize);
Dominik Bartolovic 7:f1ba533021b8 216 }
Dominik Bartolovic 7:f1ba533021b8 217
Dominik Bartolovic 7:f1ba533021b8 218 return retVal;
Dominik Bartolovic 7:f1ba533021b8 219 }
Dominik Bartolovic 7:f1ba533021b8 220
Dominik Bartolovic 7:f1ba533021b8 221 uint8_t Lis2dh12::writeToReg(uint8_t regAddr, uint8_t *buff, size_t buffSize)
Dominik Bartolovic 7:f1ba533021b8 222 {
Dominik Bartolovic 7:f1ba533021b8 223 // Most significant bit represents write from register, bit after it
Dominik Bartolovic 7:f1ba533021b8 224 // represents address increment if multiple write, which is enabled.
Dominik Bartolovic 7:f1ba533021b8 225 const uint8_t spiSetup = 0x40;
Dominik Bartolovic 7:f1ba533021b8 226
Dominik Bartolovic 7:f1ba533021b8 227 uint8_t retVal = 0;
Dominik Bartolovic 7:f1ba533021b8 228
Dominik Bartolovic 7:f1ba533021b8 229 if( spiInterface )
Dominik Bartolovic 7:f1ba533021b8 230 {
Dominik Bartolovic 7:f1ba533021b8 231 *cs = 0;
Dominik Bartolovic 7:f1ba533021b8 232
Dominik Bartolovic 7:f1ba533021b8 233 spi->write(spiSetup | regAddr);
Dominik Bartolovic 7:f1ba533021b8 234
Dominik Bartolovic 7:f1ba533021b8 235 while(buffSize--)
Dominik Bartolovic 7:f1ba533021b8 236 {
Dominik Bartolovic 7:f1ba533021b8 237 spi->write(*buff);
Dominik Bartolovic 7:f1ba533021b8 238 buff++;
Dominik Bartolovic 7:f1ba533021b8 239 }
Dominik Bartolovic 7:f1ba533021b8 240
Dominik Bartolovic 7:f1ba533021b8 241 *cs = 1;
Dominik Bartolovic 7:f1ba533021b8 242 }
Dominik Bartolovic 7:f1ba533021b8 243 else
Dominik Bartolovic 7:f1ba533021b8 244 {
Dominik Bartolovic 7:f1ba533021b8 245 retVal = i2c.writeToReg((char)regAddr, (char*)buff, buffSize);
Dominik Bartolovic 7:f1ba533021b8 246 }
Dominik Bartolovic 7:f1ba533021b8 247
Dominik Bartolovic 7:f1ba533021b8 248 return retVal;
Dominik Bartolovic 7:f1ba533021b8 249 }