danny hack
Lis2dh12.cpp@7:f1ba533021b8, 2018-10-15 (annotated)
- 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?
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; |
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*)©, 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*)©, 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*)©, 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 | } |