A basic library for the FXOS8700Q combination accelerometer / magnetometer
Dependents: K64F_eCompass_LCD Hello_FXOS8700Q rtos_compass K64F_eCompass ... more
This library supports the 6 axis combination Accelerometer / Magnetometer. Functions are provided to retrieve data in raw 16 bit signed integers or unit converted G's and micro-teslas
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 |
diff -r 52116f8fb3da -r 5553a64d0762 FXOS8700Q.cpp --- 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);
diff -r 52116f8fb3da -r 5553a64d0762 FXOS8700Q.h --- 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);