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:
Thu Jun 18 22:53:07 2015 +0000
Revision:
10:834488c11340
Parent:
9:5553a64d0762
Child:
11:aee7dea904e2
Update driver based on changes to MotionSensor

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 #ifndef FXOS8700Q_H
JimCarver 0:2562215f5bc0 18 #define FXOS8700Q_H
JimCarver 0:2562215f5bc0 19
JimCarver 0:2562215f5bc0 20 #include "mbed.h"
JimCarver 5:c4176a12f7d5 21 #include "MotionSensor.h"
sam_grove 10:834488c11340 22
JimCarver 0:2562215f5bc0 23 // FXOS8700CQ I2C address
JimCarver 1:8b53edef272f 24 #define FXOS8700CQ_SLAVE_ADDR0 (0x1E<<1) // with pins SA0=0, SA1=0
JimCarver 1:8b53edef272f 25 #define FXOS8700CQ_SLAVE_ADDR1 (0x1D<<1) // with pins SA0=1, SA1=0
JimCarver 1:8b53edef272f 26 #define FXOS8700CQ_SLAVE_ADDR2 (0x1C<<1) // with pins SA0=0, SA1=1
JimCarver 1:8b53edef272f 27 #define FXOS8700CQ_SLAVE_ADDR3 (0x1F<<1) // with pins SA0=1, SA1=1
JimCarver 0:2562215f5bc0 28 // FXOS8700CQ internal register addresses
JimCarver 1:8b53edef272f 29 #define FXOS8700Q_STATUS 0x00
JimCarver 1:8b53edef272f 30 #define FXOS8700Q_OUT_X_MSB 0x01
JimCarver 1:8b53edef272f 31 #define FXOS8700Q_OUT_Y_MSB 0x03
JimCarver 1:8b53edef272f 32 #define FXOS8700Q_OUT_Z_MSB 0x05
JimCarver 1:8b53edef272f 33 #define FXOS8700Q_M_OUT_X_MSB 0x33
JimCarver 1:8b53edef272f 34 #define FXOS8700Q_M_OUT_Y_MSB 0x35
JimCarver 1:8b53edef272f 35 #define FXOS8700Q_M_OUT_Z_MSB 0x37
JimCarver 1:8b53edef272f 36 #define FXOS8700Q_WHOAMI 0x0D
JimCarver 1:8b53edef272f 37 #define FXOS8700Q_XYZ_DATA_CFG 0x0E
JimCarver 1:8b53edef272f 38 #define FXOS8700Q_CTRL_REG1 0x2A
JimCarver 1:8b53edef272f 39 #define FXOS8700Q_M_CTRL_REG1 0x5B
JimCarver 1:8b53edef272f 40 #define FXOS8700Q_M_CTRL_REG2 0x5C
JimCarver 1:8b53edef272f 41 #define FXOS8700Q_WHOAMI_VAL 0xC7
JimCarver 0:2562215f5bc0 42
JimCarver 3:eb1271ef90bc 43
sam_grove 10:834488c11340 44 /** FXOS8700Q accelerometer example
sam_grove 10:834488c11340 45 @code
sam_grove 10:834488c11340 46 #include "mbed.h"
sam_grove 10:834488c11340 47 #include "FXOS8700Q.h"
sam_grove 10:834488c11340 48 I2C i2c(PTE25, PTE24);
sam_grove 10:834488c11340 49 FXOS8700QAccelerometer acc(i2c, FXOS8700CQ_SLAVE_ADDR1); // Configured for the FRDM-K64F with onboard sensors
sam_grove 10:834488c11340 50 FXOS8700QMagnetometer mag(i2c, FXOS8700CQ_SLAVE_ADDR1);
sam_grove 10:834488c11340 51 int main(void)
sam_grove 10:834488c11340 52 {
sam_grove 10:834488c11340 53 motion_data_units_t acc_data, mag_data;
sam_grove 10:834488c11340 54 motion_data_counts_t acc_raw, mag_raw;
sam_grove 10:834488c11340 55 float faX, faY, faZ, fmX, fmY, fmZ, tmp_float;
sam_grove 10:834488c11340 56 int16_t raX, raY, raZ, rmX, rmY, rmZ, tmp_int;
sam_grove 10:834488c11340 57 acc.enable();
sam_grove 10:834488c11340 58 mag.enable();
sam_grove 10:834488c11340 59 while (true) {
sam_grove 10:834488c11340 60 // counts based results
sam_grove 10:834488c11340 61 acc.getAxis(acc_raw);
sam_grove 10:834488c11340 62 mag.getAxis(mag_raw);
sam_grove 10:834488c11340 63 acc.getX(raX);
sam_grove 10:834488c11340 64 acc.getY(raY);
sam_grove 10:834488c11340 65 acc.getZ(raZ);
sam_grove 10:834488c11340 66 mag.getX(rmX);
sam_grove 10:834488c11340 67 mag.getY(rmY);
sam_grove 10:834488c11340 68 mag.getZ(rmZ);
sam_grove 10:834488c11340 69 // unit based results
sam_grove 10:834488c11340 70 acc.getAxis(acc_data);
sam_grove 10:834488c11340 71 mag.getAxis(mag_data);
sam_grove 10:834488c11340 72 acc.getX(faX);
sam_grove 10:834488c11340 73 acc.getY(faY);
sam_grove 10:834488c11340 74 acc.getZ(faZ);
sam_grove 10:834488c11340 75 mag.getX(fmX);
sam_grove 10:834488c11340 76 mag.getY(fmY);
sam_grove 10:834488c11340 77 mag.getZ(fmZ);
sam_grove 10:834488c11340 78 wait(0.1f);
sam_grove 10:834488c11340 79 }
sam_grove 10:834488c11340 80 }
sam_grove 10:834488c11340 81 @endcode
sam_grove 10:834488c11340 82 */
JimCarver 3:eb1271ef90bc 83
sam_grove 10:834488c11340 84 /** FXOS8700Q driver class
sam_grove 10:834488c11340 85 */
sam_grove 10:834488c11340 86 class FXOS8700Q : public MotionSensor
JimCarver 0:2562215f5bc0 87 {
JimCarver 0:2562215f5bc0 88 public:
sam_grove 10:834488c11340 89
sam_grove 10:834488c11340 90 /** Read a device register
sam_grove 10:834488c11340 91 @param addr The address to read from
sam_grove 10:834488c11340 92 @param data The data to read from it
sam_grove 10:834488c11340 93 @param len The amount of data to read from it
sam_grove 10:834488c11340 94 @return 0 if successful, negative number otherwise
sam_grove 10:834488c11340 95 */
sam_grove 10:834488c11340 96 void readRegs(int addr, uint8_t *data, uint32_t len) const;
JimCarver 1:8b53edef272f 97
sam_grove 10:834488c11340 98 /** Read the ID from a whoAmI register
sam_grove 10:834488c11340 99 @return The device whoAmI register contents
sam_grove 10:834488c11340 100 */
sam_grove 10:834488c11340 101 uint8_t whoAmI(void) const;
sam_grove 10:834488c11340 102
sam_grove 10:834488c11340 103 virtual void enable(void) const;
sam_grove 10:834488c11340 104 virtual void disable(void) const;
sam_grove 10:834488c11340 105 virtual uint32_t sampleRate(uint32_t frequency) const;
sam_grove 10:834488c11340 106 virtual uint32_t dataReady(void) const;
JimCarver 1:8b53edef272f 107
sam_grove 10:834488c11340 108 protected:
sam_grove 10:834488c11340 109 I2C *_i2c;
sam_grove 10:834488c11340 110 uint8_t _addr;
sam_grove 10:834488c11340 111
sam_grove 10:834488c11340 112 /** FXOS8700Q constructor
sam_grove 10:834488c11340 113 @param i2c a configured i2c object
sam_grove 10:834488c11340 114 @param addr addr of the I2C peripheral as wired
sam_grove 10:834488c11340 115 */
sam_grove 10:834488c11340 116 FXOS8700Q(I2C &i2c, uint8_t addr);
JimCarver 0:2562215f5bc0 117
sam_grove 10:834488c11340 118 /** FXOS8700Q deconstructor
sam_grove 10:834488c11340 119 */
sam_grove 10:834488c11340 120 ~FXOS8700Q();
sam_grove 10:834488c11340 121
sam_grove 10:834488c11340 122 void writeRegs(uint8_t *data, uint32_t len) const;
sam_grove 10:834488c11340 123 int16_t getSensorAxis(uint8_t addr) const;
sam_grove 10:834488c11340 124 };
sam_grove 10:834488c11340 125
sam_grove 10:834488c11340 126 /** FXOS8700QAccelerometer interface
sam_grove 10:834488c11340 127 */
sam_grove 10:834488c11340 128 class FXOS8700QAccelerometer : public FXOS8700Q
sam_grove 10:834488c11340 129 {
sam_grove 10:834488c11340 130 public:
sam_grove 10:834488c11340 131
sam_grove 10:834488c11340 132 FXOS8700QAccelerometer(I2C &i2c, uint8_t addr) : FXOS8700Q(i2c, addr) {}
sam_grove 10:834488c11340 133
sam_grove 10:834488c11340 134 virtual int16_t getX(int16_t &x) const;
sam_grove 10:834488c11340 135 virtual int16_t getY(int16_t &y) const;
sam_grove 10:834488c11340 136 virtual int16_t getZ(int16_t &z) const;
sam_grove 10:834488c11340 137 virtual float getX(float &x) const;
sam_grove 10:834488c11340 138 virtual float getY(float &y) const;
sam_grove 10:834488c11340 139 virtual float getZ(float &z) const;
sam_grove 10:834488c11340 140 virtual void getAxis(motion_data_counts_t &xyz) const;
sam_grove 10:834488c11340 141 virtual void getAxis(motion_data_units_t &xyz) const;
JimCarver 6:cdc362f08339 142
JimCarver 6:cdc362f08339 143 };
JimCarver 1:8b53edef272f 144
sam_grove 10:834488c11340 145 /** FXOS8700QMagnetometer interface
sam_grove 10:834488c11340 146 */
sam_grove 10:834488c11340 147 class FXOS8700QMagnetometer : public FXOS8700Q
JimCarver 6:cdc362f08339 148 {
JimCarver 6:cdc362f08339 149 public:
JimCarver 0:2562215f5bc0 150
sam_grove 10:834488c11340 151 FXOS8700QMagnetometer(I2C &i2c, uint8_t addr) : FXOS8700Q(i2c, addr) {}
JimCarver 6:cdc362f08339 152
sam_grove 10:834488c11340 153 virtual int16_t getX(int16_t &x) const;
sam_grove 10:834488c11340 154 virtual int16_t getY(int16_t &y) const;
sam_grove 10:834488c11340 155 virtual int16_t getZ(int16_t &z) const;
sam_grove 10:834488c11340 156 virtual float getX(float &x) const;
sam_grove 10:834488c11340 157 virtual float getY(float &y) const;
sam_grove 10:834488c11340 158 virtual float getZ(float &z) const;
sam_grove 10:834488c11340 159 virtual void getAxis(motion_data_counts_t &xyz) const;
sam_grove 10:834488c11340 160 virtual void getAxis(motion_data_units_t &xyz) const;
JimCarver 0:2562215f5bc0 161
JimCarver 0:2562215f5bc0 162 };
JimCarver 0:2562215f5bc0 163
JimCarver 0:2562215f5bc0 164 #endif