Added support for temperature measurement. Added only to magnetometer class.

Dependencies:   MotionSensor

Fork of FXOS8700Q by Freescale

Committer:
Pythia
Date:
Wed Jul 22 13:15:24 2015 +0000
Revision:
12:0ab2a7fab065
Parent:
11:aee7dea904e2
Added temperature measurement.
; The functionality is added only to magnetic sensor portion as physically is dependent on enabling the magnetic portion.

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