Library for LIS2DH12 acc.

Dependents:   acnSensa_LIS aconnoCellularGnss Lizzy

Committer:
dbartolovic
Date:
Fri Mar 09 16:55:02 2018 +0000
Revision:
5:15d1c73137e8
Parent:
4:043396f22548
Child:
6:b7e3a0c1210b
Adjusted lib to return all 12 bits of data

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
jurica238814 0:cc5d477d5dbe 7 *
jurica238814 0:cc5d477d5dbe 8 */
jurica238814 0:cc5d477d5dbe 9
jurica238814 0:cc5d477d5dbe 10 #include "Lis2dh12.h"
jurica238814 0:cc5d477d5dbe 11 #include "Lis2dh12_regs.h"
jurica238814 0:cc5d477d5dbe 12
jurica238814 0:cc5d477d5dbe 13 Lis2dh12::Lis2dh12(I2C *i2c_, char address) : i2c(i2c_, address){
jurica238814 0:cc5d477d5dbe 14 }
jurica238814 0:cc5d477d5dbe 15
jurica238814 0:cc5d477d5dbe 16 uint8_t Lis2dh12::whoIAm(){
jurica238814 0:cc5d477d5dbe 17 char regAddr = (char)WHO_AM_I;
jurica238814 0:cc5d477d5dbe 18 char regData;
jurica238814 0:cc5d477d5dbe 19 i2c.readFromReg(regAddr, &regData, 1);
jurica238814 0:cc5d477d5dbe 20 return (uint8_t)regData;
jurica238814 0:cc5d477d5dbe 21 }
jurica238814 0:cc5d477d5dbe 22
jurica238814 0:cc5d477d5dbe 23 uint8_t Lis2dh12::setMode(Mode mode){
jurica238814 0:cc5d477d5dbe 24 char ctrl1Copy;
jurica238814 0:cc5d477d5dbe 25 char ctrl4Copy;
jurica238814 0:cc5d477d5dbe 26 uint8_t success;
jurica238814 0:cc5d477d5dbe 27
jurica238814 0:cc5d477d5dbe 28 i2c.readFromReg((char)CTRL_REG1, &ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 29 i2c.readFromReg((char)CTRL_REG4, &ctrl4Copy, 1);
jurica238814 0:cc5d477d5dbe 30
jurica238814 0:cc5d477d5dbe 31 switch(mode){
jurica238814 0:cc5d477d5dbe 32 case HIGH_RES:
jurica238814 0:cc5d477d5dbe 33 ctrl1Copy &= 0xF7;
jurica238814 0:cc5d477d5dbe 34 ctrl4Copy |= 0x08;
jurica238814 0:cc5d477d5dbe 35 break;
jurica238814 0:cc5d477d5dbe 36 case NORMAL:
jurica238814 0:cc5d477d5dbe 37 ctrl1Copy &= 0xF7;
jurica238814 0:cc5d477d5dbe 38 ctrl4Copy &= 0xF7;
jurica238814 0:cc5d477d5dbe 39 break;
jurica238814 0:cc5d477d5dbe 40 case LOW_POWER:
jurica238814 0:cc5d477d5dbe 41 ctrl1Copy |= 0x08;
jurica238814 0:cc5d477d5dbe 42 ctrl4Copy &= 0xF7;
jurica238814 0:cc5d477d5dbe 43 break;
jurica238814 0:cc5d477d5dbe 44 default:
jurica238814 0:cc5d477d5dbe 45 return 0;
jurica238814 0:cc5d477d5dbe 46 }
jurica238814 0:cc5d477d5dbe 47 i2c.writeToReg((char)CTRL_REG1, &ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 48 success = i2c.writeToReg((char)CTRL_REG4, &ctrl4Copy, 1);
jurica238814 0:cc5d477d5dbe 49 return success;
jurica238814 0:cc5d477d5dbe 50 }
jurica238814 0:cc5d477d5dbe 51
jurica238814 0:cc5d477d5dbe 52 uint8_t Lis2dh12::enableAxes(Axis axis){
jurica238814 0:cc5d477d5dbe 53 char ctrl1Copy;
jurica238814 0:cc5d477d5dbe 54 i2c.readFromReg((char)CTRL_REG1, &ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 55 ctrl1Copy |= axis;
jurica238814 0:cc5d477d5dbe 56 i2c.writeToReg((char)CTRL_REG1, &ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 57 return 0;
jurica238814 0:cc5d477d5dbe 58 }
jurica238814 0:cc5d477d5dbe 59
jurica238814 0:cc5d477d5dbe 60 uint8_t Lis2dh12::disableAxes(Axis axis){
jurica238814 0:cc5d477d5dbe 61 char ctrl1Copy;
jurica238814 0:cc5d477d5dbe 62 i2c.readFromReg((char)CTRL_REG1, &ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 63 ctrl1Copy &= ~(1 << axis);
jurica238814 0:cc5d477d5dbe 64 i2c.writeToReg((char)CTRL_REG1, &ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 65 return 0;
jurica238814 0:cc5d477d5dbe 66 }
jurica238814 0:cc5d477d5dbe 67
jurica238814 0:cc5d477d5dbe 68 int16_t Lis2dh12::readXAxis(){
jurica238814 0:cc5d477d5dbe 69 int16_t rawData;
jurica238814 0:cc5d477d5dbe 70 char tempData;
jurica238814 1:d89f4b12116b 71 // Make sure new data is ready
jurica238814 1:d89f4b12116b 72 do{
jurica238814 1:d89f4b12116b 73 i2c.readFromReg((char)STATUS, &tempData, 1);
jurica238814 1:d89f4b12116b 74 }while(!(tempData & 0x08));
jurica238814 1:d89f4b12116b 75 do{
jurica238814 1:d89f4b12116b 76 i2c.readFromReg((char)STATUS, &tempData, 1);
jurica238814 1:d89f4b12116b 77 }while(!(tempData & 0x80));
jurica238814 1:d89f4b12116b 78 // Same data have been overwritten
jurica238814 1:d89f4b12116b 79
jurica238814 4:043396f22548 80 //i2c.readFromReg((char)OUT_X_H, &tempData, 1);
jurica238814 4:043396f22548 81 //rawData = (int8_t)tempData << 8;
dbartolovic 5:15d1c73137e8 82 i2c.readFromReg((char)OUT_X_L, &rawData, 2);
dbartolovic 5:15d1c73137e8 83
dbartolovic 5:15d1c73137e8 84 if (rawData >= 0)
dbartolovic 5:15d1c73137e8 85 rawData = (rawData>>4);
dbartolovic 5:15d1c73137e8 86 else
dbartolovic 5:15d1c73137e8 87 rawData = (rawData>>4) | 0xF000;
dbartolovic 5:15d1c73137e8 88
jurica238814 0:cc5d477d5dbe 89 return rawData;
jurica238814 0:cc5d477d5dbe 90 }
jurica238814 0:cc5d477d5dbe 91
jurica238814 0:cc5d477d5dbe 92 int16_t Lis2dh12::readYAxis(){
jurica238814 0:cc5d477d5dbe 93 int16_t rawData;
jurica238814 0:cc5d477d5dbe 94 char tempData;
jurica238814 4:043396f22548 95 //i2c.readFromReg((char)OUT_Y_H, &tempData, 1);
jurica238814 4:043396f22548 96 //rawData = (int8_t)tempData << 8;
dbartolovic 5:15d1c73137e8 97 i2c.readFromReg((char)OUT_Y_L, &rawData, 2);
dbartolovic 5:15d1c73137e8 98
dbartolovic 5:15d1c73137e8 99 if (rawData >= 0)
dbartolovic 5:15d1c73137e8 100 rawData = (rawData>>4);
dbartolovic 5:15d1c73137e8 101 else
dbartolovic 5:15d1c73137e8 102 rawData = (rawData>>4) | 0xF000;
dbartolovic 5:15d1c73137e8 103
jurica238814 0:cc5d477d5dbe 104 return rawData;
jurica238814 0:cc5d477d5dbe 105 }
jurica238814 0:cc5d477d5dbe 106
jurica238814 0:cc5d477d5dbe 107 int16_t Lis2dh12::readZAxis(){
jurica238814 4:043396f22548 108 int16_t rawData = 0;
jurica238814 0:cc5d477d5dbe 109 char tempData;
jurica238814 4:043396f22548 110 //i2c.readFromReg((char)OUT_Z_H, &tempData, 1);
jurica238814 4:043396f22548 111 //rawData = (int8_t)tempData << 8;
dbartolovic 5:15d1c73137e8 112 i2c.readFromReg((char)OUT_Z_L, &rawData, 2);
dbartolovic 5:15d1c73137e8 113
dbartolovic 5:15d1c73137e8 114 if (rawData >= 0)
dbartolovic 5:15d1c73137e8 115 rawData = (rawData>>4);
dbartolovic 5:15d1c73137e8 116 else
dbartolovic 5:15d1c73137e8 117 rawData = (rawData>>4) | 0xF000;
dbartolovic 5:15d1c73137e8 118
jurica238814 0:cc5d477d5dbe 119 return rawData;
jurica238814 0:cc5d477d5dbe 120 }
jurica238814 0:cc5d477d5dbe 121
jurica238814 0:cc5d477d5dbe 122 uint8_t Lis2dh12::setODR(Odr odr){
jurica238814 0:cc5d477d5dbe 123 char ctrl1Copy;
jurica238814 0:cc5d477d5dbe 124 i2c.readFromReg((char)CTRL_REG1, &ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 125 ctrl1Copy |= (odr << 4);
jurica238814 0:cc5d477d5dbe 126 i2c.writeToReg((char)CTRL_REG1, &ctrl1Copy, 1);
jurica238814 0:cc5d477d5dbe 127 return 0;
jurica238814 0:cc5d477d5dbe 128 }
jurica238814 0:cc5d477d5dbe 129
jurica238814 0:cc5d477d5dbe 130 uint8_t Lis2dh12::setScale(Scale scale){
jurica238814 0:cc5d477d5dbe 131 char ctrl4Copy;
jurica238814 0:cc5d477d5dbe 132 i2c.readFromReg((char)CTRL_REG4, &ctrl4Copy, 1);
jurica238814 0:cc5d477d5dbe 133 ctrl4Copy |= (scale << 4);
jurica238814 0:cc5d477d5dbe 134 i2c.writeToReg((char)CTRL_REG4, &ctrl4Copy, 1);
jurica238814 0:cc5d477d5dbe 135 return 0;
jurica238814 0:cc5d477d5dbe 136 }
jurica238814 0:cc5d477d5dbe 137
jurica238814 2:1fa08c7a2a3c 138 /* Interrupt activity 1 driven to INT1 pad */
jurica238814 2:1fa08c7a2a3c 139 // TODO: Napraviti tako da postoji samo jedna metoda int1Setup koja prima gro
jurica238814 2:1fa08c7a2a3c 140 // parametara: THS, DUR, Latch...
jurica238814 2:1fa08c7a2a3c 141 uint8_t Lis2dh12::int1Setup(uint8_t setup){
jurica238814 2:1fa08c7a2a3c 142 char data = setup;
jurica238814 2:1fa08c7a2a3c 143 i2c.writeToReg((char)CTRL_REG3, &data, 1);
jurica238814 2:1fa08c7a2a3c 144 return 0;
jurica238814 2:1fa08c7a2a3c 145 }
jurica238814 2:1fa08c7a2a3c 146
jurica238814 2:1fa08c7a2a3c 147 uint8_t Lis2dh12::int1Latch(uint8_t enable){
jurica238814 2:1fa08c7a2a3c 148 char ctrl5Copy;
jurica238814 2:1fa08c7a2a3c 149 i2c.readFromReg((char)CTRL_REG5, &ctrl5Copy, 1);
jurica238814 2:1fa08c7a2a3c 150 ctrl5Copy |= enable;
jurica238814 2:1fa08c7a2a3c 151 i2c.writeToReg((char)CTRL_REG5, &ctrl5Copy, 1);
jurica238814 3:07ddb07f8b7f 152 return 0;
jurica238814 2:1fa08c7a2a3c 153 }
jurica238814 2:1fa08c7a2a3c 154
jurica238814 2:1fa08c7a2a3c 155 uint8_t Lis2dh12::int1Duration(uint8_t duration){
jurica238814 2:1fa08c7a2a3c 156 char copy = duration;
jurica238814 2:1fa08c7a2a3c 157 i2c.writeToReg((char)INT1_DURATION, &copy, 1);
jurica238814 2:1fa08c7a2a3c 158 return 0;
jurica238814 2:1fa08c7a2a3c 159 }
jurica238814 2:1fa08c7a2a3c 160
jurica238814 2:1fa08c7a2a3c 161 uint8_t Lis2dh12::int1Threshold(uint8_t threshold){
jurica238814 2:1fa08c7a2a3c 162 char copy = threshold;
jurica238814 2:1fa08c7a2a3c 163 i2c.writeToReg((char)INT1_THS, &copy, 1);
jurica238814 2:1fa08c7a2a3c 164 return 0;
jurica238814 2:1fa08c7a2a3c 165 }
jurica238814 2:1fa08c7a2a3c 166
jurica238814 2:1fa08c7a2a3c 167 uint8_t Lis2dh12::int1Config(uint8_t config){
jurica238814 2:1fa08c7a2a3c 168 char copy = config;
jurica238814 2:1fa08c7a2a3c 169 i2c.writeToReg((char)INT1_CFG, &copy, 1);
jurica238814 2:1fa08c7a2a3c 170 return 0;
jurica238814 2:1fa08c7a2a3c 171 }
jurica238814 2:1fa08c7a2a3c 172
jurica238814 2:1fa08c7a2a3c 173 void Lis2dh12::clearIntFlag(){
jurica238814 2:1fa08c7a2a3c 174 char data;
jurica238814 2:1fa08c7a2a3c 175 i2c.readFromReg((char)INT1_SRC, (char*)&data, 1);
jurica238814 2:1fa08c7a2a3c 176 }
jurica238814 0:cc5d477d5dbe 177
jurica238814 0:cc5d477d5dbe 178