SCIboard(TM): mbed base board data logger - Altimeter: MPL3115A2 - Accelerometer: LSM303DLHC - Gyro: L3G4200D - 4 High Current MOSFET switches
SCIboard_MPL3115A2.cpp
00001 /* SCIboard(TM) MPL3115A2.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_MPL3115A2.h" 00024 00025 SCIboard_MPL3115A2::SCIboard_MPL3115A2(SCIboard_I2C *ptr_I2C) { 00026 pI2C = ptr_I2C; 00027 } 00028 00029 unsigned char SCIboard_MPL3115A2::getDeviceID(void) { 00030 unsigned char data; 00031 pI2C->readRegs(MPL3115A2_I2C_ADDR, ALTREG_WHO_AM_I, &data, 1); 00032 return data; 00033 } 00034 00035 void SCIboard_MPL3115A2::setMode(unsigned char mode, unsigned char overSampling) { 00036 unsigned char data[2] = {ALTREG_CTRL_REG1, 0}; 00037 00038 wait(.01); 00039 // Standby 00040 pI2C->readRegs(MPL3115A2_I2C_ADDR, data[0], &data[1], 1); 00041 data[1] &= 0xFE; 00042 pI2C->writeRegs(MPL3115A2_I2C_ADDR, data, 2); 00043 00044 // Reset 00045 wait(.01); 00046 data[1] |= 0x04; 00047 pI2C->writeRegs(MPL3115A2_I2C_ADDR, data, 2); 00048 00049 // Standby 00050 wait(.01); 00051 pI2C->readRegs(MPL3115A2_I2C_ADDR, data[0], &data[1], 1); 00052 data[1] &= 0xFA; 00053 pI2C->writeRegs(MPL3115A2_I2C_ADDR, data, 2); 00054 00055 // Mode and overSampling 00056 wait(.01); 00057 data[1] &= 0xc7; 00058 data[1] |= overSampling << 3; 00059 recallMode = mode; 00060 if(mode) 00061 data[1] |= 0x80; 00062 else 00063 data[1] &= 0x7F; 00064 pI2C->writeRegs(MPL3115A2_I2C_ADDR, data, 2); 00065 00066 // 00067 data[0] = ALTREG_PT_DATA_CFG; 00068 data[1] = 0x07; 00069 pI2C->writeRegs(MPL3115A2_I2C_ADDR, data, 2); 00070 00071 // 00072 data[0] = ALTREG_CTRL_REG4; 00073 data[1] = 0x80; // INT_EN_DRDY 00074 pI2C->writeRegs(MPL3115A2_I2C_ADDR, data, 2); 00075 00076 // 00077 data[0] = ALTREG_CTRL_REG5; 00078 data[1] = 0x80; // INT_CFG_DRDY 00079 pI2C->writeRegs(MPL3115A2_I2C_ADDR, data, 2); 00080 } 00081 00082 00083 void SCIboard_MPL3115A2::OST(void) { 00084 unsigned char data[2]={ ALTREG_CTRL_REG1, 0}; 00085 00086 pI2C->readRegs(MPL3115A2_I2C_ADDR, ALTREG_CTRL_REG1, &data[1], 1); 00087 data[1] |= 0x02; // Command OST 00088 data[1] &= 0xfe; // Force STANDBY 00089 pI2C->writeRegs(MPL3115A2_I2C_ADDR, data, 2); 00090 } 00091 00092 bool SCIboard_MPL3115A2::bDataAvailable(void) { 00093 unsigned char data; 00094 00095 pI2C->readRegs(MPL3115A2_I2C_ADDR, ALTREG_STATUS, &data, 1); 00096 if(data & 0x08) 00097 return true; 00098 00099 return false; 00100 } 00101 00102 unsigned char SCIboard_MPL3115A2::getDrStatus(void) { 00103 unsigned char data; 00104 00105 pI2C->readRegs(MPL3115A2_I2C_ADDR, ALTREG_STATUS, &data, 1); 00106 return data; 00107 } 00108 00109 unsigned char SCIboard_MPL3115A2::getSysmod(void) { 00110 unsigned char data; 00111 00112 pI2C->readRegs(MPL3115A2_I2C_ADDR, ALTREG_SYSMOD, &data, 1); 00113 return data; 00114 } 00115 00116 void SCIboard_MPL3115A2::getData(float *rtn) { 00117 unsigned char data[5]; 00118 unsigned short i; 00119 float f; 00120 00121 pI2C->readRegs(MPL3115A2_I2C_ADDR, ALTREG_OUT_P_MSB, data, 5); 00122 00123 if(recallMode) 00124 { // Altimeter 00125 i = (data[0]<<8) | data[1]; 00126 if(data[0] > 0x7F) 00127 { 00128 i = ~i + 1; 00129 rtn[0] = (float)i * -1.0; 00130 } 00131 else 00132 { 00133 rtn[0] = (float)i * 1.0; 00134 } 00135 } 00136 else 00137 { // Pressure 00138 i = (data[0]<<10) | (data[1]<<2) | (data[2]>>6); 00139 rtn[0] = (float)i * 1.0; 00140 if(data[2] & 0x20) 00141 rtn[0] += 0.5; 00142 if(data[2] & 0x10) 00143 rtn[0] += 0.025; 00144 } 00145 00146 // Convert temperature 00147 i = data[3]; 00148 if(data[3] > 0x7F) 00149 { 00150 i = ~i + 1; 00151 f = (float)i * -1.0f; 00152 } 00153 else 00154 { 00155 f = (float)i * 1.0f; 00156 } 00157 rtn[1] = f + ((float)(data[4]>>4) * 0.0625f); 00158 }
Generated on Wed Jul 13 2022 05:45:34 by 1.7.2