SCIboard(TM): mbed base board data logger - Altimeter: MPL3115A2 - Accelerometer: LSM303DLHC - Gyro: L3G4200D - 4 High Current MOSFET switches

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SCIboard_LSM303DLHC.cpp Source File

SCIboard_LSM303DLHC.cpp

00001 /* SCIboard(TM) LSM303DLHC.cpp
00002 Copyright (c) 2013 K. Andres
00003 
00004 Permission is hereby granted, free of charge, to any person obtaining a copy
00005 of this software and associated documentation files (the "Software"), to deal
00006 in the Software without restriction, including without limitation the rights
00007 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00008 copies of the Software, and to permit persons to whom the Software is
00009 furnished to do so, subject to the following conditions:
00010 
00011 The above copyright notice and this permission notice shall be included in
00012 all copies or substantial portions of the Software.
00013 
00014 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00015 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00016 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00017 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00018 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00019 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00020 THE SOFTWARE.
00021 */
00022 
00023 #include "SCIboard_LSM303DLHC.h"
00024 
00025 SCIboard_LSM303DLHC::SCIboard_LSM303DLHC(SCIboard_I2C *ptr_I2C) {
00026    pI2C = ptr_I2C;    
00027 }
00028 
00029 void SCIboard_LSM303DLHC::getDeviceID(unsigned char *id) {
00030     pI2C->readRegs(MAG_I2C_ADDR, MAGREG_IRA_REG, id, 3);
00031 }
00032 
00033 // ACCELEROMETER ------------------------------------------------------
00034 void SCIboard_LSM303DLHC::setAccMode(unsigned char AccFs, unsigned char AccRate) {
00035     unsigned char data[2] = {ACCREG_CTRL_REG1, 0};
00036     float sf[] = {2, 4, 8, 16};
00037     
00038     accSF = 32768.0 / sf[AccFs];
00039     accRate = AccRate;
00040 //    printf("AccRate=%u  AccFs=%u\r\n", AccRate, AccFs);
00041     
00042     data[1] = 0x07;                             // Enable accels
00043     data[1] |= AccRate << 4;
00044     pI2C->writeRegs(ACC_I2C_ADDR, data, 2);
00045 
00046     data[0] = ACCREG_CTRL_REG4;
00047     data[1] = AccFs << 4;
00048 //    data[1] |= 0x80;                            // Block data update - BDU: 0=continuous
00049     pI2C->writeRegs(ACC_I2C_ADDR, data, 2);
00050 }
00051 
00052 unsigned char SCIboard_LSM303DLHC::getAccStatus(void) {
00053     unsigned char data;
00054     pI2C->readRegs(ACC_I2C_ADDR, ACCREG_STATUS, &data, 1);
00055     return data;
00056 }
00057 
00058 bool SCIboard_LSM303DLHC::bAccDataAvailable(void) {
00059     unsigned char data;
00060     pI2C->readRegs(ACC_I2C_ADDR, ACCREG_STATUS, &data, 1);
00061     if(data & STATUS_REG_ZYXDA) {
00062         return 1;
00063     }
00064     return 0;
00065 }
00066 
00067 void SCIboard_LSM303DLHC::getAccData(float *fData) {
00068     unsigned char data[6];
00069 
00070     pI2C->readRegs(ACC_I2C_ADDR, ACCREG_OUT_X_L, data, 6);
00071     
00072     fData[0] = float(short(data[1] << 8 | data[0])) / accSF;
00073     fData[1] = float(short(data[3] << 8 | data[2])) / accSF;
00074     fData[2] = float(short(data[5] << 8 | data[4])) / accSF;
00075 }
00076 
00077 unsigned char SCIboard_LSM303DLHC::getInt1Src(void) {
00078     unsigned char data;
00079     pI2C->readRegs(ACC_I2C_ADDR, ACCREG_INT1_SOURCE, &data, 1);
00080     return data;
00081 }
00082 
00083 void SCIboard_LSM303DLHC::writeCtrlReg(unsigned char reg, unsigned char value) {
00084     unsigned char data[2];
00085     
00086     if(reg>0 && reg<6) {
00087         data[0] = ACCREG_CTRL_REG1 - 1 + reg;
00088         data[1] = value;
00089         pI2C->writeRegs(ACC_I2C_ADDR, data, 2);
00090     }
00091 }
00092 
00093 
00094 // MAGNETOMETER ------------------------------------------------------
00095 void SCIboard_LSM303DLHC::setMagMode(unsigned char MagFs, unsigned char MagRate) {
00096     unsigned char data[2] = {MAGREG_CRA_REG, 0};
00097     float GN[][2] = { 1100, 980, 
00098         855, 760,
00099         670, 600,
00100         450, 400,
00101         400, 355,
00102         330, 295,
00103         230, 205};
00104     
00105     magSF[0] = GN[MagFs-1][0];
00106     magSF[1] = magSF[0];
00107     magSF[2] = GN[MagFs-1][1];
00108 //    printf("MagRate=%u  MagFs=%u\r\n", MagRate, MagFs);
00109 //    printf("Mag SF= %.0f %.0f %.0f\r\n", magSF[0], magSF[1], magSF[2]);
00110     
00111     magRate = MagRate;
00112     data[1] = MagRate << 2;
00113 //    data[1] |= 0x80;                            // Temperature sensor enable
00114     pI2C->writeRegs(MAG_I2C_ADDR, data, 2);
00115 
00116     data[0] = MAGREG_CRB_REG;
00117     data[1] = MagFs << 5;
00118     pI2C->writeRegs(MAG_I2C_ADDR, data, 2);
00119 
00120     data[0] = MAGREG_MR_REG;
00121     data[1] = MAG_Continuous_Conv;
00122     pI2C->writeRegs(MAG_I2C_ADDR, data, 2);
00123 }
00124 
00125 unsigned char SCIboard_LSM303DLHC::getMagStatus(void) {
00126     unsigned char data;
00127     pI2C->readRegs(MAG_I2C_ADDR, MAGREG_SR_REG, &data, 1);
00128     return data;
00129 }
00130 
00131 bool SCIboard_LSM303DLHC::bMagDataAvailable(void) {
00132     unsigned char data;
00133     pI2C->readRegs(MAG_I2C_ADDR, MAGREG_SR_REG, &data, 1);
00134     if(data & MAG_DRDY) {
00135         return true;
00136     }
00137     return false;
00138 }
00139 
00140 void SCIboard_LSM303DLHC::getMagData(float *fData) {
00141     char data[6];
00142 
00143     pI2C->readRegs(MAG_I2C_ADDR, MAGREG_OUT_X_H, (unsigned char*) data, 6);
00144     fData[0] = float(short(data[0] << 8 | data[1])) / 1100.0;
00145     fData[2] = float(short(data[2] << 8 | data[3])) / 980.0;
00146     fData[1] = float(short(data[4] << 8 | data[5])) / 1100.0;
00147 }
00148 
00149 void SCIboard_LSM303DLHC::getMagData(char *cData) {
00150     unsigned char data[6];
00151 
00152     pI2C->readRegs(MAG_I2C_ADDR, MAGREG_OUT_X_H, data, 6);
00153     memmove(cData, data, 6);    
00154 }
00155 
00156 
00157 float SCIboard_LSM303DLHC::getTemp(void) {
00158     char data[2];
00159 
00160     pI2C->readRegs(MAG_I2C_ADDR, MAGREG_TEMP_OUT_H, (unsigned char*) data, 2);
00161     return(float(short(data[0] << 8 | data[1]>>4)));
00162 }
00163 
00164 void SCIboard_LSM303DLHC::getTemp(char *cData) {
00165     char data[2];
00166 
00167     pI2C->readRegs(MAG_I2C_ADDR, MAGREG_TEMP_OUT_H, (unsigned char*) data, 2);
00168     memmove(cData, data, 2);
00169 }