Jurica Resetar / Lis2dh12

Dependents:   acnSensa_LIS aconnoCellularGnss Lizzy

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Lis2dh12.cpp Source File

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*)&regData, 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*)&copy, 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*)&copy, 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*)&copy, 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 }