Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: acnSensa_LIS aconnoCellularGnss Lizzy
Lis2dh12.cpp
00001 /* 00002 * 00003 * LIS2DH12 MEMS digital output motion sensor 00004 * More info @ aconno.de 00005 * Made by Jurica Resetar 00006 * jurica_resetar@yahoo.com 00007 * 00008 */ 00009 00010 #include "Lis2dh12.h" 00011 #include "Lis2dh12_regs.h" 00012 00013 Lis2dh12::Lis2dh12(I2C *i2c_, char address) : i2c(i2c_, address), 00014 spiInterface(false){ 00015 } 00016 00017 Lis2dh12::Lis2dh12(SPI *_spi, DigitalOut *_cs) : i2c(NULL, 0), 00018 spi(_spi), 00019 cs(_cs), 00020 spiInterface(true){ 00021 *cs = 1; 00022 spi->format(8, 3); 00023 spi->frequency(1000000); 00024 } 00025 00026 uint8_t Lis2dh12::whoIAm(){ 00027 char regAddr = (char)WHO_AM_I; 00028 char regData; 00029 readFromReg(regAddr, (uint8_t*)®Data, 1); 00030 return (uint8_t)regData; 00031 } 00032 00033 uint8_t Lis2dh12::setMode(Mode mode){ 00034 char ctrl1Copy; 00035 char ctrl4Copy; 00036 uint8_t success; 00037 00038 readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1); 00039 readFromReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1); 00040 00041 switch(mode){ 00042 case HIGH_RES: 00043 ctrl1Copy &= 0xF7; 00044 ctrl4Copy |= 0x08; 00045 break; 00046 case NORMAL: 00047 ctrl1Copy &= 0xF7; 00048 ctrl4Copy &= 0xF7; 00049 break; 00050 case LOW_POWER: 00051 ctrl1Copy |= 0x08; 00052 ctrl4Copy &= 0xF7; 00053 break; 00054 default: 00055 return 0; 00056 } 00057 writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1); 00058 success = writeToReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1); 00059 return success; 00060 } 00061 00062 uint8_t Lis2dh12::enableAxes(Axis axis){ 00063 char ctrl1Copy; 00064 readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1); 00065 ctrl1Copy |= axis; 00066 writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1); 00067 return 0; 00068 } 00069 00070 uint8_t Lis2dh12::disableAxes(Axis axis){ 00071 char ctrl1Copy; 00072 readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1); 00073 ctrl1Copy &= ~(1 << axis); 00074 writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1); 00075 return 0; 00076 } 00077 00078 int16_t Lis2dh12::readXAxis(){ 00079 int16_t rawData; 00080 char tempData; 00081 // Make sure new data is ready 00082 do{ 00083 readFromReg((char)STATUS, (uint8_t*)&tempData, 1); 00084 }while(!(tempData & 0x08)); 00085 do{ 00086 readFromReg((char)STATUS, (uint8_t*)&tempData, 1); 00087 }while(!(tempData & 0x80)); 00088 // Same data have been overwritten 00089 00090 //readFromReg((char)OUT_X_H, (uint8_t*)&tempData, 1); 00091 //rawData = (int8_t)tempData << 8; 00092 readFromReg((char)OUT_X_L, (uint8_t*)&rawData, 1); 00093 readFromReg((char)OUT_X_H, ((uint8_t*)&rawData)+1, 1); 00094 00095 if (rawData >= 0) 00096 rawData = (rawData>>4); 00097 else 00098 rawData = (rawData>>4) | 0xF000; 00099 00100 return rawData; 00101 } 00102 00103 int16_t Lis2dh12::readYAxis(){ 00104 int16_t rawData; 00105 char tempData; 00106 //readFromReg((char)OUT_Y_H, (uint8_t*)&tempData, 1); 00107 //rawData = (int8_t)tempData << 8; 00108 readFromReg((char)OUT_Y_L, (uint8_t*)&rawData, 1); 00109 readFromReg((char)OUT_Y_H, ((uint8_t*)&rawData)+1, 1); 00110 00111 if (rawData >= 0) 00112 rawData = (rawData>>4); 00113 else 00114 rawData = (rawData>>4) | 0xF000; 00115 00116 return rawData; 00117 } 00118 00119 int16_t Lis2dh12::readZAxis(){ 00120 int16_t rawData = 0; 00121 char tempData; 00122 //readFromReg((char)OUT_Z_H, (uint8_t*)&tempData, 1); 00123 //rawData = (int8_t)tempData << 8; 00124 readFromReg((char)OUT_Z_L, (uint8_t*)&rawData, 1); 00125 readFromReg((char)OUT_Z_H, ((uint8_t*)&rawData)+1, 1); 00126 00127 if (rawData >= 0) 00128 rawData = (rawData>>4); 00129 else 00130 rawData = (rawData>>4) | 0xF000; 00131 00132 return rawData; 00133 } 00134 00135 uint8_t Lis2dh12::setODR(Odr odr){ 00136 char ctrl1Copy; 00137 readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1); 00138 ctrl1Copy |= (odr << 4); 00139 writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1); 00140 return 0; 00141 } 00142 00143 uint8_t Lis2dh12::setScale(Scale scale){ 00144 char ctrl4Copy; 00145 readFromReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1); 00146 ctrl4Copy |= (scale << 4); 00147 writeToReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1); 00148 return 0; 00149 } 00150 00151 /* Interrupt activity 1 driven to INT1 pad */ 00152 // TODO: Napraviti tako da postoji samo jedna metoda int1Setup koja prima gro 00153 // parametara: THS, DUR, Latch... 00154 uint8_t Lis2dh12::int1Setup(uint8_t setup){ 00155 char data = setup; 00156 writeToReg((char)CTRL_REG3, (uint8_t*)&data, 1); 00157 return 0; 00158 } 00159 00160 uint8_t Lis2dh12::int1Latch(uint8_t enable){ 00161 char ctrl5Copy; 00162 readFromReg((char)CTRL_REG5, (uint8_t*)&ctrl5Copy, 1); 00163 ctrl5Copy |= enable; 00164 writeToReg((char)CTRL_REG5, (uint8_t*)&ctrl5Copy, 1); 00165 return 0; 00166 } 00167 00168 uint8_t Lis2dh12::int1Duration(uint8_t duration){ 00169 char copy = duration; 00170 writeToReg((char)INT1_DURATION, (uint8_t*)©, 1); 00171 return 0; 00172 } 00173 00174 uint8_t Lis2dh12::int1Threshold(uint8_t threshold){ 00175 char copy = threshold; 00176 writeToReg((char)INT1_THS, (uint8_t*)©, 1); 00177 return 0; 00178 } 00179 00180 uint8_t Lis2dh12::int1Config(uint8_t config){ 00181 char copy = config; 00182 writeToReg((char)INT1_CFG, (uint8_t*)©, 1); 00183 return 0; 00184 } 00185 00186 void Lis2dh12::clearIntFlag(){ 00187 char data; 00188 readFromReg((char)INT1_SRC, (uint8_t*)&data, 1); 00189 } 00190 00191 uint8_t Lis2dh12::readFromReg(uint8_t regAddr, uint8_t *buff, size_t buffSize) 00192 { 00193 // Most significant bit represents read from register, bit after it 00194 // represents address increment if multiple read, which is enabled. 00195 const uint8_t spiSetup = 0xC0; 00196 00197 uint8_t retVal = 0; 00198 00199 if( spiInterface ) 00200 { 00201 *cs = 0; 00202 00203 spi->write(spiSetup | regAddr); 00204 00205 while(buffSize--) 00206 { 00207 *buff = spi->write(0x00); 00208 buff++; 00209 } 00210 00211 *cs = 1; 00212 } 00213 else 00214 { 00215 retVal = i2c.readFromReg((char)regAddr, (char*)buff, buffSize); 00216 } 00217 00218 return retVal; 00219 } 00220 00221 uint8_t Lis2dh12::writeToReg(uint8_t regAddr, uint8_t *buff, size_t buffSize) 00222 { 00223 // Most significant bit represents write from register, bit after it 00224 // represents address increment if multiple write, which is enabled. 00225 const uint8_t spiSetup = 0x40; 00226 00227 uint8_t retVal = 0; 00228 00229 if( spiInterface ) 00230 { 00231 *cs = 0; 00232 00233 spi->write(spiSetup | regAddr); 00234 00235 while(buffSize--) 00236 { 00237 spi->write(*buff); 00238 buff++; 00239 } 00240 00241 *cs = 1; 00242 } 00243 else 00244 { 00245 retVal = i2c.writeToReg((char)regAddr, (char*)buff, buffSize); 00246 } 00247 00248 return retVal; 00249 }
Generated on Sat Jul 16 2022 23:15:22 by
1.7.2