Driver library for the Freescale FXOS8700Q sensor

Dependencies:   MotionSensor

Dependents:   el14dg_Project frdm_serial_peopleAndComputing simple-client-app-shield pelion-example-frdm ... more

Fork of FXOS8700Q by Freescale

Committer:
sam_grove
Date:
Fri Jun 19 12:16:44 2015 -0500
Revision:
11:aee7dea904e2
Parent:
10:834488c11340
Update addr type in readRegs parameter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 10:834488c11340 1 /* FXOS8700Q sensor driver
sam_grove 10:834488c11340 2 * Copyright (c) 2014-2015 ARM Limited
sam_grove 10:834488c11340 3 *
sam_grove 10:834488c11340 4 * Licensed under the Apache License, Version 2.0 (the "License");
sam_grove 10:834488c11340 5 * you may not use this file except in compliance with the License.
sam_grove 10:834488c11340 6 * You may obtain a copy of the License at
sam_grove 10:834488c11340 7 *
sam_grove 10:834488c11340 8 * http://www.apache.org/licenses/LICENSE-2.0
sam_grove 10:834488c11340 9 *
sam_grove 10:834488c11340 10 * Unless required by applicable law or agreed to in writing, software
sam_grove 10:834488c11340 11 * distributed under the License is distributed on an "AS IS" BASIS,
sam_grove 10:834488c11340 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sam_grove 10:834488c11340 13 * See the License for the specific language governing permissions and
sam_grove 10:834488c11340 14 * limitations under the License.
sam_grove 10:834488c11340 15 */
JimCarver 3:eb1271ef90bc 16
JimCarver 0:2562215f5bc0 17 #include "FXOS8700Q.h"
sam_grove 10:834488c11340 18
sam_grove 10:834488c11340 19 const uint16_t uint14_max = 0x3FFF;
sam_grove 10:834488c11340 20 void static inline normalize_14bits(int16_t &x)
sam_grove 10:834488c11340 21 {
sam_grove 10:834488c11340 22 x = ((x) > (uint14_max/2)) ? (x - uint14_max) : (x);
sam_grove 10:834488c11340 23 }
JimCarver 1:8b53edef272f 24
sam_grove 10:834488c11340 25 static int16_t dummy_int16_t = 0;
sam_grove 10:834488c11340 26 static float dummy_float = 0.0f;
JimCarver 1:8b53edef272f 27
sam_grove 10:834488c11340 28 FXOS8700Q::FXOS8700Q(I2C &i2c, uint8_t addr)
sam_grove 10:834488c11340 29 {
sam_grove 10:834488c11340 30 _i2c = &i2c;
sam_grove 10:834488c11340 31 _addr = addr;
JimCarver 1:8b53edef272f 32 // activate the peripheral
JimCarver 1:8b53edef272f 33 uint8_t data[2] = {FXOS8700Q_CTRL_REG1, 0x00};
sam_grove 10:834488c11340 34 _i2c->frequency(400000);
JimCarver 1:8b53edef272f 35 writeRegs(data, 2);
JimCarver 1:8b53edef272f 36 data[0] = FXOS8700Q_M_CTRL_REG1;
JimCarver 1:8b53edef272f 37 data[1] = 0x1F;
JimCarver 1:8b53edef272f 38 writeRegs(data, 2);
JimCarver 1:8b53edef272f 39 data[0] = FXOS8700Q_M_CTRL_REG2;
JimCarver 1:8b53edef272f 40 data[1] = 0x20;
JimCarver 1:8b53edef272f 41 writeRegs(data, 2);
JimCarver 1:8b53edef272f 42 data[0] = FXOS8700Q_XYZ_DATA_CFG;
JimCarver 1:8b53edef272f 43 data[1] = 0x00;
JimCarver 1:8b53edef272f 44 writeRegs(data, 2);
JimCarver 1:8b53edef272f 45 data[0] = FXOS8700Q_CTRL_REG1;
JimCarver 8:52116f8fb3da 46 data[1] = 0x1C;
JimCarver 6:cdc362f08339 47 writeRegs(data, 2);
sam_grove 10:834488c11340 48 }
sam_grove 10:834488c11340 49
sam_grove 10:834488c11340 50 FXOS8700Q::~FXOS8700Q()
sam_grove 10:834488c11340 51 {
sam_grove 10:834488c11340 52 _i2c = 0;
sam_grove 10:834488c11340 53 _addr = 0;
sam_grove 10:834488c11340 54 }
sam_grove 10:834488c11340 55
sam_grove 11:aee7dea904e2 56 void FXOS8700Q::readRegs(uint8_t addr, uint8_t *data, uint32_t len) const
sam_grove 10:834488c11340 57 {
sam_grove 11:aee7dea904e2 58 uint8_t t[1] = {addr};
sam_grove 11:aee7dea904e2 59 _i2c->write(_addr, (char *)t, sizeof(t), true);
sam_grove 10:834488c11340 60 _i2c->read(_addr, (char *)data, len);
sam_grove 10:834488c11340 61 }
sam_grove 10:834488c11340 62
sam_grove 10:834488c11340 63 uint8_t FXOS8700Q::whoAmI() const
sam_grove 10:834488c11340 64 {
sam_grove 10:834488c11340 65 uint8_t who_am_i = 0;
sam_grove 10:834488c11340 66 readRegs(FXOS8700Q_WHOAMI, &who_am_i, sizeof(who_am_i));
sam_grove 10:834488c11340 67 return who_am_i;
JimCarver 6:cdc362f08339 68 }
JimCarver 6:cdc362f08339 69
sam_grove 10:834488c11340 70 void FXOS8700Q::writeRegs(uint8_t * data, uint32_t len) const
sam_grove 10:834488c11340 71 {
sam_grove 10:834488c11340 72 _i2c->write(_addr, (char *)data, len);
sam_grove 10:834488c11340 73 }
JimCarver 6:cdc362f08339 74
sam_grove 11:aee7dea904e2 75
sam_grove 10:834488c11340 76 int16_t FXOS8700Q::getSensorAxis(uint8_t addr) const
sam_grove 10:834488c11340 77 {
sam_grove 10:834488c11340 78 uint8_t res[2];
sam_grove 10:834488c11340 79 readRegs(addr, res, sizeof(res));
sam_grove 10:834488c11340 80 return static_cast<int16_t>((res[0] << 8) | res[1]);
sam_grove 10:834488c11340 81 }
sam_grove 10:834488c11340 82
sam_grove 10:834488c11340 83 void FXOS8700Q::enable(void) const
sam_grove 10:834488c11340 84 {
JimCarver 6:cdc362f08339 85 uint8_t data[2];
sam_grove 10:834488c11340 86 readRegs(FXOS8700Q_CTRL_REG1, &data[1], 1);
JimCarver 6:cdc362f08339 87 data[1] |= 0x01;
JimCarver 6:cdc362f08339 88 data[0] = FXOS8700Q_CTRL_REG1;
sam_grove 10:834488c11340 89 writeRegs(data, sizeof(data));
JimCarver 6:cdc362f08339 90 }
JimCarver 6:cdc362f08339 91
sam_grove 10:834488c11340 92 void FXOS8700Q::disable(void) const
sam_grove 10:834488c11340 93 {
JimCarver 6:cdc362f08339 94 uint8_t data[2];
sam_grove 10:834488c11340 95 readRegs(FXOS8700Q_CTRL_REG1, &data[1], 1);
JimCarver 6:cdc362f08339 96 data[1] &= 0xFE;
JimCarver 6:cdc362f08339 97 data[0] = FXOS8700Q_CTRL_REG1;
sam_grove 10:834488c11340 98 writeRegs(data, sizeof(data));
JimCarver 1:8b53edef272f 99 }
JimCarver 0:2562215f5bc0 100
sam_grove 10:834488c11340 101 uint32_t FXOS8700Q::dataReady(void) const
sam_grove 10:834488c11340 102 {
sam_grove 10:834488c11340 103 uint8_t stat = 0;
sam_grove 10:834488c11340 104 readRegs(FXOS8700Q_STATUS, &stat, 1);
sam_grove 10:834488c11340 105 return (uint32_t)stat;
JimCarver 6:cdc362f08339 106 }
JimCarver 6:cdc362f08339 107
sam_grove 10:834488c11340 108 uint32_t FXOS8700Q::sampleRate(uint32_t frequency) const
sam_grove 10:834488c11340 109 {
JimCarver 6:cdc362f08339 110 return(50); // for now sample rate is fixed at 50Hz
JimCarver 1:8b53edef272f 111 }
JimCarver 1:8b53edef272f 112
sam_grove 10:834488c11340 113 int16_t FXOS8700QAccelerometer::getX(int16_t &x = dummy_int16_t) const
sam_grove 10:834488c11340 114 {
sam_grove 10:834488c11340 115 x = getSensorAxis(FXOS8700Q_OUT_X_MSB) >> 2;
sam_grove 10:834488c11340 116 normalize_14bits(x);
sam_grove 10:834488c11340 117 return x;
JimCarver 6:cdc362f08339 118 }
JimCarver 6:cdc362f08339 119
sam_grove 10:834488c11340 120 int16_t FXOS8700QAccelerometer::getY(int16_t &y = dummy_int16_t) const
sam_grove 10:834488c11340 121 {
sam_grove 10:834488c11340 122 y = getSensorAxis(FXOS8700Q_OUT_Y_MSB) >> 2;
sam_grove 10:834488c11340 123 normalize_14bits(y);
sam_grove 10:834488c11340 124 return y;
JimCarver 1:8b53edef272f 125 }
JimCarver 1:8b53edef272f 126
sam_grove 10:834488c11340 127 int16_t FXOS8700QAccelerometer::getZ(int16_t &z = dummy_int16_t) const
sam_grove 10:834488c11340 128 {
sam_grove 10:834488c11340 129 z = getSensorAxis(FXOS8700Q_OUT_Z_MSB) >> 2;
sam_grove 10:834488c11340 130 normalize_14bits(z);
sam_grove 10:834488c11340 131 return z;
JimCarver 0:2562215f5bc0 132 }
JimCarver 0:2562215f5bc0 133
sam_grove 10:834488c11340 134 float FXOS8700QAccelerometer::getX(float &x = dummy_float) const
sam_grove 10:834488c11340 135 {
sam_grove 10:834488c11340 136 int16_t val = getSensorAxis(FXOS8700Q_OUT_X_MSB) >> 2;
sam_grove 10:834488c11340 137 normalize_14bits(val);
sam_grove 10:834488c11340 138 x = val / 4096.0f;
sam_grove 10:834488c11340 139 return x;
JimCarver 0:2562215f5bc0 140 }
JimCarver 0:2562215f5bc0 141
sam_grove 10:834488c11340 142 float FXOS8700QAccelerometer::getY(float &y = dummy_float) const
sam_grove 10:834488c11340 143 {
sam_grove 10:834488c11340 144 int16_t val = getSensorAxis(FXOS8700Q_OUT_Y_MSB) >> 2;
sam_grove 10:834488c11340 145 normalize_14bits(val);
sam_grove 10:834488c11340 146 y = val / 4096.0f;
sam_grove 10:834488c11340 147 return y;
JimCarver 6:cdc362f08339 148 }
JimCarver 6:cdc362f08339 149
sam_grove 10:834488c11340 150 float FXOS8700QAccelerometer::getZ(float &z = dummy_float) const
sam_grove 10:834488c11340 151 {
sam_grove 10:834488c11340 152 int16_t val = getSensorAxis(FXOS8700Q_OUT_Z_MSB) >> 2;
sam_grove 10:834488c11340 153 normalize_14bits(val);
sam_grove 10:834488c11340 154 z = val / 4096.0f;
sam_grove 10:834488c11340 155 return z;
JimCarver 1:8b53edef272f 156 }
JimCarver 0:2562215f5bc0 157
sam_grove 10:834488c11340 158 void FXOS8700QAccelerometer::getAxis(motion_data_counts_t &xyz) const
sam_grove 10:834488c11340 159 {
sam_grove 10:834488c11340 160 uint8_t res[6];
sam_grove 10:834488c11340 161 readRegs(FXOS8700Q_OUT_X_MSB, res, sizeof(res));
sam_grove 10:834488c11340 162 xyz.x = static_cast<int16_t>((res[0] << 8) | res[1]) >> 2;
sam_grove 10:834488c11340 163 xyz.y = static_cast<int16_t>((res[2] << 8) | res[3]) >> 2;
sam_grove 10:834488c11340 164 xyz.z = static_cast<int16_t>((res[4] << 8) | res[5]) >> 2;
sam_grove 10:834488c11340 165 normalize_14bits(xyz.x);
sam_grove 10:834488c11340 166 normalize_14bits(xyz.y);
sam_grove 10:834488c11340 167 normalize_14bits(xyz.z);
JimCarver 6:cdc362f08339 168 }
JimCarver 6:cdc362f08339 169
sam_grove 10:834488c11340 170 void FXOS8700QAccelerometer::getAxis(motion_data_units_t &xyz) const
sam_grove 10:834488c11340 171 {
sam_grove 10:834488c11340 172 motion_data_counts_t _xyz;
sam_grove 10:834488c11340 173 FXOS8700QAccelerometer::getAxis(_xyz);
sam_grove 10:834488c11340 174 xyz.x = _xyz.x / 4096.0f;
sam_grove 10:834488c11340 175 xyz.y = _xyz.y / 4096.0f;
sam_grove 10:834488c11340 176 xyz.z = _xyz.z / 4096.0f;
JimCarver 6:cdc362f08339 177 }
JimCarver 6:cdc362f08339 178
sam_grove 10:834488c11340 179 int16_t FXOS8700QMagnetometer::getX(int16_t &x = dummy_int16_t) const
sam_grove 10:834488c11340 180 {
sam_grove 10:834488c11340 181 x = getSensorAxis(FXOS8700Q_M_OUT_X_MSB);
sam_grove 10:834488c11340 182 return x;
JimCarver 6:cdc362f08339 183 }
JimCarver 6:cdc362f08339 184
sam_grove 10:834488c11340 185 int16_t FXOS8700QMagnetometer::getY(int16_t &y = dummy_int16_t) const
sam_grove 10:834488c11340 186 {
sam_grove 10:834488c11340 187 y = getSensorAxis(FXOS8700Q_M_OUT_Y_MSB);
sam_grove 10:834488c11340 188 return y;
JimCarver 6:cdc362f08339 189 }
JimCarver 6:cdc362f08339 190
sam_grove 10:834488c11340 191 int16_t FXOS8700QMagnetometer::getZ(int16_t &z = dummy_int16_t) const
sam_grove 10:834488c11340 192 {
sam_grove 10:834488c11340 193 z = getSensorAxis(FXOS8700Q_M_OUT_Z_MSB);
sam_grove 10:834488c11340 194 return z;
JimCarver 6:cdc362f08339 195 }
JimCarver 6:cdc362f08339 196
sam_grove 10:834488c11340 197 float FXOS8700QMagnetometer::getX(float &x = dummy_float) const
sam_grove 10:834488c11340 198 {
sam_grove 10:834488c11340 199 x = static_cast<float>(getSensorAxis(FXOS8700Q_M_OUT_X_MSB)) * 0.1f;
sam_grove 10:834488c11340 200 return x;
JimCarver 6:cdc362f08339 201 }
JimCarver 6:cdc362f08339 202
sam_grove 10:834488c11340 203 float FXOS8700QMagnetometer::getY(float &y = dummy_float) const
sam_grove 10:834488c11340 204 {
sam_grove 10:834488c11340 205 y = static_cast<float>(getSensorAxis(FXOS8700Q_M_OUT_Y_MSB)) * 0.1f;
sam_grove 10:834488c11340 206 return y;
sam_grove 10:834488c11340 207 }
JimCarver 6:cdc362f08339 208
sam_grove 10:834488c11340 209 float FXOS8700QMagnetometer::getZ(float &z = dummy_float) const
sam_grove 10:834488c11340 210 {
sam_grove 10:834488c11340 211 z = static_cast<float>(getSensorAxis(FXOS8700Q_M_OUT_Z_MSB)) * 0.1f;
sam_grove 10:834488c11340 212 return z;
JimCarver 6:cdc362f08339 213 }
JimCarver 6:cdc362f08339 214
sam_grove 10:834488c11340 215 void FXOS8700QMagnetometer::getAxis(motion_data_counts_t &xyz) const
sam_grove 10:834488c11340 216 {
JimCarver 6:cdc362f08339 217 uint8_t res[6];
sam_grove 10:834488c11340 218 readRegs(FXOS8700Q_M_OUT_X_MSB, res, sizeof(res));
sam_grove 10:834488c11340 219 xyz.x = (res[0] << 8) | res[1];
sam_grove 10:834488c11340 220 xyz.y = (res[2] << 8) | res[3];
sam_grove 10:834488c11340 221 xyz.z = (res[4] << 8) | res[5];
JimCarver 6:cdc362f08339 222 }
JimCarver 6:cdc362f08339 223
sam_grove 10:834488c11340 224 void FXOS8700QMagnetometer::getAxis(motion_data_units_t &xyz) const
sam_grove 10:834488c11340 225 {
sam_grove 10:834488c11340 226 motion_data_counts_t _xyz;
sam_grove 10:834488c11340 227 FXOS8700QMagnetometer::getAxis(_xyz);
sam_grove 10:834488c11340 228 xyz.x = static_cast<float>(_xyz.x * 0.1f);
sam_grove 10:834488c11340 229 xyz.y = static_cast<float>(_xyz.y * 0.1f);
sam_grove 10:834488c11340 230 xyz.z = static_cast<float>(_xyz.z * 0.1f);
JimCarver 1:8b53edef272f 231 }