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.
Fork of FXOS8700Q by
Revision 9:5553a64d0762, committed 2014-05-07
- Comitter:
- JimCarver
- Date:
- Wed May 07 18:08:08 2014 +0000
- Parent:
- 8:52116f8fb3da
- Child:
- 10:834488c11340
- 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);
