cvbxcvxcv
Lis2dh12.cpp@10:220ab90b446d, 2019-08-27 (annotated)
- Committer:
- dendanny
- Date:
- Tue Aug 27 14:44:35 2019 +0000
- Revision:
- 10:220ab90b446d
- Parent:
- 8:118f07a02abc
pff
Who changed what in which revision?
User | Revision | Line number | New 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*)®Data, 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*)©, 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*)©, 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*)©, 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 | } |