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: K64F_eCompass_LCD Hello_FXOS8700Q rtos_compass K64F_eCompass ... more
Revision 9:5553a64d0762, committed 2014-05-07
- Comitter:
- JimCarver
- Date:
- Wed May 07 18:08:08 2014 +0000
- Parent:
- 8:52116f8fb3da
- Commit message:
- Minor change to improve efficiency to I2C usage
Changed in this revision
| FXOS8700Q.cpp | Show annotated file Show diff for this revision Revisions of this file |
| FXOS8700Q.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/FXOS8700Q.cpp Sat Apr 26 01:36:41 2014 +0000
+++ b/FXOS8700Q.cpp Wed May 07 18:08:08 2014 +0000
@@ -19,6 +19,8 @@
#include "FXOS8700Q.h"
#define UINT14_MAX 16383
+uint8_t SensorBuffer[12];
+int MagReadStatus;
FXOS8700Q_acc::FXOS8700Q_acc(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr) {
// activate the peripheral
@@ -37,6 +39,7 @@
data[0] = FXOS8700Q_CTRL_REG1;
data[1] = 0x1C;
writeRegs(data, 2);
+ MagReadStatus = 0;
}
FXOS8700Q_acc::~FXOS8700Q_acc() { }
@@ -47,6 +50,7 @@
data[1] |= 0x01;
data[0] = FXOS8700Q_CTRL_REG1;
writeRegs(data, 2);
+ MagReadStatus = 0;
}
void FXOS8700Q_acc::disable(void) {
@@ -55,6 +59,7 @@
data[1] &= 0xFE;
data[0] = FXOS8700Q_CTRL_REG1;
writeRegs(data, 2);
+ MagReadStatus = 0;
}
@@ -102,44 +107,45 @@
void FXOS8700Q_acc::getAxis(MotionSensorDataUnits &data) {
int16_t acc, t[3];
- uint8_t res[6];
- readRegs(FXOS8700Q_OUT_X_MSB, res, 6);
- acc = (res[0] << 6) | (res[1] >> 2);
+ readRegs(FXOS8700Q_OUT_X_MSB, SensorBuffer, 12);
+
+ acc = (SensorBuffer[0] << 6) | (SensorBuffer[1] >> 2);
if (acc > UINT14_MAX/2)
acc -= UINT14_MAX;
t[0] = acc;
- acc = (res[2] << 6) | (res[3] >> 2);
+ acc = (SensorBuffer[2] << 6) | (SensorBuffer[3] >> 2);
if (acc > UINT14_MAX/2)
acc -= UINT14_MAX;
t[1] = acc;
- acc = (res[4] << 6) | (res[5] >> 2);
+ acc = (SensorBuffer[4] << 6) | (SensorBuffer[5] >> 2);
if (acc > UINT14_MAX/2)
acc -= UINT14_MAX;
t[2] = acc;
data.x = ((float) t[0]) / 4096.0f;
data.y = ((float) t[1]) / 4096.0f;
data.z = ((float) t[2]) / 4096.0f;
+ MagReadStatus = 1;
}
void FXOS8700Q_acc::getAxis(MotionSensorDataCounts &data) {
int16_t acc;
- uint8_t res[6];
- readRegs(FXOS8700Q_OUT_X_MSB, res, 6);
+ readRegs(FXOS8700Q_OUT_X_MSB, SensorBuffer, 12);
- acc = (res[0] << 6) | (res[1] >> 2);
+ acc = (SensorBuffer[0] << 6) | (SensorBuffer[1] >> 2);
if (acc > UINT14_MAX/2)
acc -= UINT14_MAX;
data.x = acc;
- acc = (res[2] << 6) | (res[3] >> 2);
+ acc = (SensorBuffer[2] << 6) | (SensorBuffer[3] >> 2);
if (acc > UINT14_MAX/2)
acc -= UINT14_MAX;
data.y = acc;
- acc = (res[4] << 6) | (res[5] >> 2);
+ acc = (SensorBuffer[4] << 6) | (SensorBuffer[5] >> 2);
if (acc > UINT14_MAX/2)
acc -= UINT14_MAX;
data.z = acc;
+ MagReadStatus = 1;
}
void FXOS8700Q_acc::readRegs(int addr, uint8_t * data, int len) {
@@ -184,6 +190,7 @@
data[0] = FXOS8700Q_CTRL_REG1;
data[1] = 0x18;//0x1D;
writeRegs(data, 2);
+ MagReadStatus = 0;
}
FXOS8700Q_mag::~FXOS8700Q_mag() { }
@@ -194,6 +201,7 @@
data[1] |= 0x01;
data[0] = FXOS8700Q_CTRL_REG1;
writeRegs(data, 2);
+ MagReadStatus = 0;
}
void FXOS8700Q_mag::disable(void) {
@@ -202,6 +210,7 @@
data[1] &= 0xFE;
data[0] = FXOS8700Q_CTRL_REG1;
writeRegs(data, 2);
+ MagReadStatus = 0;
}
@@ -250,12 +259,17 @@
void FXOS8700Q_mag::getAxis(MotionSensorDataUnits &data) {
int16_t t[3];
uint8_t res[6];
- readRegs(FXOS8700Q_M_OUT_X_MSB, res, 6);
-
- t[0] = (res[0] << 8) | res[1];
- t[1] = (res[2] << 8) | res[3];
- t[2] = (res[4] << 8) | res[5];
-
+
+ if(MagReadStatus) {
+ t[0] = (SensorBuffer[6] << 8) | SensorBuffer[7];
+ t[1] = (SensorBuffer[8] << 8) | SensorBuffer[9];
+ t[2] = (SensorBuffer[10] << 8) | SensorBuffer[11];
+ } else {
+ readRegs(FXOS8700Q_M_OUT_X_MSB, res, 6);
+ t[0] = (res[0] << 8) | res[1];
+ t[1] = (res[2] << 8) | res[3];
+ t[2] = (res[4] << 8) | res[5];
+ }
data.x = ((float) t[0]) * 0.1f;
data.y = ((float) t[1]) * 0.1f;
data.z = ((float) t[2]) * 0.1f;
@@ -263,7 +277,7 @@
void FXOS8700Q_mag::getAxis(MotionSensorDataCounts &data) {
- int16_t acc;
+
uint8_t res[6];
readRegs(FXOS8700Q_M_OUT_X_MSB, res, 6);
--- a/FXOS8700Q.h Sat Apr 26 01:36:41 2014 +0000 +++ b/FXOS8700Q.h Wed May 07 18:08:08 2014 +0000 @@ -139,7 +139,9 @@ private: I2C m_i2c; int m_addr; - + char sbuf[12]; + int sstatus; + void writeRegs(uint8_t * data, int len); int16_t getAccAxis(uint8_t addr);
FXOS8700Q Accelerometer / Magnetometer
Freescale Multi-Sensor (Multi-B) Shield