FXOS8700CQ, 6-Axis Sensor with Integrated Linear Accelerometer and Magnetometer

Dependents:   test_FXOS8700CQ testSensor

Committer:
Rhyme
Date:
Fri Dec 25 05:41:05 2015 +0000
Revision:
0:08ed32d49eca
First working version. Only init and read from the data sheet implemented.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:08ed32d49eca 1 #include "mbed.h"
Rhyme 0:08ed32d49eca 2 #include "FXOS8700CQ.h"
Rhyme 0:08ed32d49eca 3
Rhyme 0:08ed32d49eca 4 /* Register Address definitions */
Rhyme 0:08ed32d49eca 5 #define REG_STATUS 0x00
Rhyme 0:08ed32d49eca 6 #define REG_OUT_X_MSB 0x01
Rhyme 0:08ed32d49eca 7 #define REG_OUT_X_LSB 0x02
Rhyme 0:08ed32d49eca 8 #define REG_OUT_Y_MSB 0x03
Rhyme 0:08ed32d49eca 9 #define REG_OUT_Y_LSB 0x04
Rhyme 0:08ed32d49eca 10 #define REG_OUT_Z_MSB 0x05
Rhyme 0:08ed32d49eca 11 #define REG_OUT_Z_LSB 0x06
Rhyme 0:08ed32d49eca 12 /* RESERVED 0x07 */
Rhyme 0:08ed32d49eca 13 /* RESERVED 0x08 */
Rhyme 0:08ed32d49eca 14 #define REG_F_SETUP 0x09
Rhyme 0:08ed32d49eca 15 #define REG_TRIG_CFG 0x0A
Rhyme 0:08ed32d49eca 16 #define REG_SYSMOD 0x0B
Rhyme 0:08ed32d49eca 17 #define REG_INT_SOURCE 0x0C
Rhyme 0:08ed32d49eca 18 #define REG_WHO_AM_I 0x0D
Rhyme 0:08ed32d49eca 19 #define REG_XYZ_DATA_CFG 0x0E
Rhyme 0:08ed32d49eca 20 #define REG_HP_FILTER_CUTOFF 0x0F
Rhyme 0:08ed32d49eca 21 #define REG_PL_STATUS 0x10
Rhyme 0:08ed32d49eca 22 #define REG_PL_CFG 0x11
Rhyme 0:08ed32d49eca 23 #define REG_PL_COUNT 0x12
Rhyme 0:08ed32d49eca 24 #define REG_PL_BF_ZCOMP 0x13
Rhyme 0:08ed32d49eca 25 #define REG_PL_THS_REG 0x14
Rhyme 0:08ed32d49eca 26 #define REG_A_FFMT_CFG 0x15
Rhyme 0:08ed32d49eca 27 #define REG_A_FFMT_SRC 0x16
Rhyme 0:08ed32d49eca 28 #define REG_A_FFMT_THS 0x17
Rhyme 0:08ed32d49eca 29 #define REG_A_FFMT_COUNT 0x18
Rhyme 0:08ed32d49eca 30 /* RESERVED 0x19 */
Rhyme 0:08ed32d49eca 31 /* RESERVED 0x1A */
Rhyme 0:08ed32d49eca 32 /* RESERVED 0x1B */
Rhyme 0:08ed32d49eca 33 /* RESERVED 0x1C */
Rhyme 0:08ed32d49eca 34 #define REG_TRANSIENT_CFG 0x1D
Rhyme 0:08ed32d49eca 35 #define REG_TRANSIENT_SRC 0x1E
Rhyme 0:08ed32d49eca 36 #define REG_TRANSIENT_THS 0x1F
Rhyme 0:08ed32d49eca 37 #define REG_TRANSIENT_COUNT 0x20
Rhyme 0:08ed32d49eca 38 #define REG_PULSE_CFG 0x21
Rhyme 0:08ed32d49eca 39 #define REG_PULSE_SRC 0x22
Rhyme 0:08ed32d49eca 40 #define REG_PULSE_THSX 0x23
Rhyme 0:08ed32d49eca 41 #define REG_PULSE_THSY 0x24
Rhyme 0:08ed32d49eca 42 #define REG_PULSE_THSZ 0x25
Rhyme 0:08ed32d49eca 43 #define REG_PULSE_TMLT 0x26
Rhyme 0:08ed32d49eca 44 #define REG_PULSE_LTCY 0x27
Rhyme 0:08ed32d49eca 45 #define REG_PULSE_WIND 0x28
Rhyme 0:08ed32d49eca 46 #define REG_ASLP_COUNT 0x29
Rhyme 0:08ed32d49eca 47 #define REG_CTRL_REG1 0x2A
Rhyme 0:08ed32d49eca 48 #define REG_CTRL_REG2 0x2B
Rhyme 0:08ed32d49eca 49 #define REG_CTRL_REG3 0x2C
Rhyme 0:08ed32d49eca 50 #define REG_CTRL_REG4 0x2D
Rhyme 0:08ed32d49eca 51 #define REG_CTRL_REG5 0x2E
Rhyme 0:08ed32d49eca 52 #define REG_OFF_X 0x2F
Rhyme 0:08ed32d49eca 53 #define REG_OFF_Y 0x30
Rhyme 0:08ed32d49eca 54 #define REG_OFF_Z 0x31
Rhyme 0:08ed32d49eca 55 #define REG_M_DR_STATUS 0x32
Rhyme 0:08ed32d49eca 56 #define REG_M_OUT_X_MSB 0x33
Rhyme 0:08ed32d49eca 57 #define REG_M_OUT_X_LSB 0x34
Rhyme 0:08ed32d49eca 58 #define REG_M_OUT_Y_MSB 0x35
Rhyme 0:08ed32d49eca 59 #define REG_M_OUT_Y_LSB 0x36
Rhyme 0:08ed32d49eca 60 #define REG_M_OUT_Z_MSB 0x37
Rhyme 0:08ed32d49eca 61 #define REG_M_OUT_Z_LSB 0x38
Rhyme 0:08ed32d49eca 62 #define REG_CMP_X_MSB 0x39
Rhyme 0:08ed32d49eca 63 #define REG_CMP_X_LSB 0x3A
Rhyme 0:08ed32d49eca 64 #define REG_CMP_Y_MSB 0x3B
Rhyme 0:08ed32d49eca 65 #define REG_CMP_Y_LSB 0x3C
Rhyme 0:08ed32d49eca 66 #define REG_CMP_Z_MSB 0x3D
Rhyme 0:08ed32d49eca 67 #define REG_CMP_Z_LSB 0x3E
Rhyme 0:08ed32d49eca 68 #define REG_M_OFF_X_MSB 0x3F
Rhyme 0:08ed32d49eca 69 #define REG_M_OFF_X_LSB 0x40
Rhyme 0:08ed32d49eca 70 #define REG_M_OFF_Y_MSB 0x41
Rhyme 0:08ed32d49eca 71 #define REG_M_OFF_Y_LSB 0x42
Rhyme 0:08ed32d49eca 72 #define REG_M_OFF_Z_MSB 0x43
Rhyme 0:08ed32d49eca 73 #define REG_M_OFF_Z_LSB 0x44
Rhyme 0:08ed32d49eca 74 #define REG_MAX_X_MSB 0x45
Rhyme 0:08ed32d49eca 75 #define REG_MAX_X_LSB 0x46
Rhyme 0:08ed32d49eca 76 #define REG_MAX_Y_MSB 0x47
Rhyme 0:08ed32d49eca 77 #define REG_MAX_Y_LSB 0x48
Rhyme 0:08ed32d49eca 78 #define REG_MAX_Z_MSB 0x49
Rhyme 0:08ed32d49eca 79 #define REG_MAX_Z_LSB 0x4A
Rhyme 0:08ed32d49eca 80 #define REG_MIN_X_MSB 0x4B
Rhyme 0:08ed32d49eca 81 #define REG_MIN_X_LSB 0x4C
Rhyme 0:08ed32d49eca 82 #define REG_MIN_Y_MSB 0x4D
Rhyme 0:08ed32d49eca 83 #define REG_MIN_Y_LSB 0x4E
Rhyme 0:08ed32d49eca 84 #define REG_MIN_Z_MSB 0x4F
Rhyme 0:08ed32d49eca 85 #define REG_MIN_Z_LSB 0x50
Rhyme 0:08ed32d49eca 86 #define REG_TEMP 0x51
Rhyme 0:08ed32d49eca 87 #define REG_M_THS_CFG 0x52
Rhyme 0:08ed32d49eca 88 #define REG_M_THS_SRC 0x53
Rhyme 0:08ed32d49eca 89 #define REG_M_THS_X_MSB 0x54
Rhyme 0:08ed32d49eca 90 #define REG_M_THS_X_LSB 0x55
Rhyme 0:08ed32d49eca 91 #define REG_M_THS_Y_MSB 0x56
Rhyme 0:08ed32d49eca 92 #define REG_M_THS_Y_LSB 0x57
Rhyme 0:08ed32d49eca 93 #define REG_M_THS_Z_MSB 0x58
Rhyme 0:08ed32d49eca 94 #define REG_M_THS_Z_LSB 0x59
Rhyme 0:08ed32d49eca 95 #define REG_M_THS_COUNT 0x5A
Rhyme 0:08ed32d49eca 96 #define REG_M_CTRL_REG1 0x5B
Rhyme 0:08ed32d49eca 97 #define REG_M_CTRL_REG2 0x5C
Rhyme 0:08ed32d49eca 98 #define REG_M_CTRL_REG3 0x5D
Rhyme 0:08ed32d49eca 99 #define REG_M_INT_SRC 0x5E
Rhyme 0:08ed32d49eca 100 #define REG_A_VECM_CFG 0x5F
Rhyme 0:08ed32d49eca 101 #define REG_A_VECM_THS_MSB 0x60
Rhyme 0:08ed32d49eca 102 #define REG_A_VECM_THS_LSB 0x61
Rhyme 0:08ed32d49eca 103 #define REG_A_VECM_CNT 0x62
Rhyme 0:08ed32d49eca 104 #define REG_A_VECM_INITX_MSB 0x63
Rhyme 0:08ed32d49eca 105 #define REG_A_VECM_INITX_LSB 0x64
Rhyme 0:08ed32d49eca 106 #define REG_A_VECM_INITY_MSB 0x65
Rhyme 0:08ed32d49eca 107 #define REG_A_VECM_INITY_LSB 0x66
Rhyme 0:08ed32d49eca 108 #define REG_A_VECM_INITZ_MSB 0x67
Rhyme 0:08ed32d49eca 109 #define REG_A_VECM_INITZ_LSB 0x68
Rhyme 0:08ed32d49eca 110 #define REG_M_VECM_CFG 0x69
Rhyme 0:08ed32d49eca 111 #define REG_M_VECM_THS_MSB 0x6A
Rhyme 0:08ed32d49eca 112 #define REG_M_VECM_THS_LSB 0x6B
Rhyme 0:08ed32d49eca 113 #define REG_M_VECM_CNT 0x6C
Rhyme 0:08ed32d49eca 114 #define REG_M_VECM_INITX_MSB 0x6D
Rhyme 0:08ed32d49eca 115 #define REG_M_VECM_INITX_LSB 0x6E
Rhyme 0:08ed32d49eca 116 #define REG_M_VECM_INITY_MSB 0x6F
Rhyme 0:08ed32d49eca 117 #define REG_M_VECM_INITY_LSB 0x70
Rhyme 0:08ed32d49eca 118 #define REG_M_VECM_INITZ_MSB 0x71
Rhyme 0:08ed32d49eca 119 #define REG_M_VECM_INITZ_LSB 0x72
Rhyme 0:08ed32d49eca 120 #define REG_A_FFMT_THS_X_MSB 0x73
Rhyme 0:08ed32d49eca 121 #define REG_A_FFMT_THS_X_LSB 0x74
Rhyme 0:08ed32d49eca 122 #define REG_A_FFMT_THS_Y_MSB 0x75
Rhyme 0:08ed32d49eca 123 #define REG_A_FFMT_THS_Y_LSB 0x76
Rhyme 0:08ed32d49eca 124 #define REG_A_FFMT_THS_Z_MSB 0x77
Rhyme 0:08ed32d49eca 125 #define REG_A_FFMT_THS_Z_LSB 0x78
Rhyme 0:08ed32d49eca 126 /* RESERVED 0x79 */
Rhyme 0:08ed32d49eca 127
Rhyme 0:08ed32d49eca 128 #define FXOS8700CQ_WHO_AM_I 0xC7
Rhyme 0:08ed32d49eca 129
Rhyme 0:08ed32d49eca 130 FXOS8700CQ::FXOS8700CQ(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1)
Rhyme 0:08ed32d49eca 131 {
Rhyme 0:08ed32d49eca 132 // activate the peripheral
Rhyme 0:08ed32d49eca 133 }
Rhyme 0:08ed32d49eca 134
Rhyme 0:08ed32d49eca 135 FXOS8700CQ::~FXOS8700CQ() { }
Rhyme 0:08ed32d49eca 136
Rhyme 0:08ed32d49eca 137 void FXOS8700CQ::readRegs(int addr, uint8_t * data, int len)
Rhyme 0:08ed32d49eca 138 {
Rhyme 0:08ed32d49eca 139 char t[1] = {addr} ;
Rhyme 0:08ed32d49eca 140 m_i2c.write(m_addr, t, 1, true) ;
Rhyme 0:08ed32d49eca 141 m_i2c.read(m_addr, (char*)data, len) ;
Rhyme 0:08ed32d49eca 142 }
Rhyme 0:08ed32d49eca 143
Rhyme 0:08ed32d49eca 144 void FXOS8700CQ::writeRegs(uint8_t * data, int len)
Rhyme 0:08ed32d49eca 145 {
Rhyme 0:08ed32d49eca 146 m_i2c.write(m_addr, (char *)data, len) ;
Rhyme 0:08ed32d49eca 147 }
Rhyme 0:08ed32d49eca 148
Rhyme 0:08ed32d49eca 149 void FXOS8700CQ::standby(void)
Rhyme 0:08ed32d49eca 150 {
Rhyme 0:08ed32d49eca 151 uint8_t data[2] ;
Rhyme 0:08ed32d49eca 152 data[0] = REG_CTRL_REG1 ;
Rhyme 0:08ed32d49eca 153 data[1] = 0x00 ;
Rhyme 0:08ed32d49eca 154 writeRegs(data, 2) ;
Rhyme 0:08ed32d49eca 155 }
Rhyme 0:08ed32d49eca 156
Rhyme 0:08ed32d49eca 157 void FXOS8700CQ::activate(void)
Rhyme 0:08ed32d49eca 158 {
Rhyme 0:08ed32d49eca 159 uint8_t data[2] ;
Rhyme 0:08ed32d49eca 160 data[0] = REG_CTRL_REG1 ;
Rhyme 0:08ed32d49eca 161 data[1] = 0x01 ;
Rhyme 0:08ed32d49eca 162 writeRegs(data, 2) ;
Rhyme 0:08ed32d49eca 163 }
Rhyme 0:08ed32d49eca 164
Rhyme 0:08ed32d49eca 165 void FXOS8700CQ::init(void)
Rhyme 0:08ed32d49eca 166 {
Rhyme 0:08ed32d49eca 167 uint8_t data[2] ;
Rhyme 0:08ed32d49eca 168 readRegs(REG_WHO_AM_I, data, 1) ;
Rhyme 0:08ed32d49eca 169 if (data[0] != FXOS8700CQ_WHO_AM_I) {
Rhyme 0:08ed32d49eca 170 printf("Wrong FXOS8700CQ id[0x%02X], 0x%02X expected\n",
Rhyme 0:08ed32d49eca 171 data[0], FXOS8700CQ_WHO_AM_I ) ;
Rhyme 0:08ed32d49eca 172 }
Rhyme 0:08ed32d49eca 173 /* write 0000_0000 = 0x00 to CTRL_REG1 => standby */
Rhyme 0:08ed32d49eca 174 data[0] = REG_CTRL_REG1 ;
Rhyme 0:08ed32d49eca 175 data[1] = 0x00 ;
Rhyme 0:08ed32d49eca 176 writeRegs(data, 2) ;
Rhyme 0:08ed32d49eca 177 /* write 0001_1111 = 0x1F to M_CTRL_REG1 */
Rhyme 0:08ed32d49eca 178 data[0] = REG_M_CTRL_REG1 ;
Rhyme 0:08ed32d49eca 179 data[1] = 0x1F ;
Rhyme 0:08ed32d49eca 180 writeRegs(data, 2) ;
Rhyme 0:08ed32d49eca 181 /* write 0010_0000 = 0x20 to M_CTRL_REG2 */
Rhyme 0:08ed32d49eca 182 data[0] = REG_M_CTRL_REG2 ;
Rhyme 0:08ed32d49eca 183 data[1] = 0x20 ;
Rhyme 0:08ed32d49eca 184 writeRegs(data, 2) ;
Rhyme 0:08ed32d49eca 185 /* write 0000_0001 = 0x01 to XYZ_DATA_CFG */
Rhyme 0:08ed32d49eca 186 data[0] = REG_XYZ_DATA_CFG ;
Rhyme 0:08ed32d49eca 187 data[1] = 0x01 ;
Rhyme 0:08ed32d49eca 188 writeRegs(data, 2) ;
Rhyme 0:08ed32d49eca 189 /* write 0000_1101 = 0x0D to CTRL_REG1 */
Rhyme 0:08ed32d49eca 190 data[0] = REG_CTRL_REG1 ;
Rhyme 0:08ed32d49eca 191 data[1] = 0x0D ;
Rhyme 0:08ed32d49eca 192 writeRegs(data, 2) ;
Rhyme 0:08ed32d49eca 193 }
Rhyme 0:08ed32d49eca 194
Rhyme 0:08ed32d49eca 195 void FXOS8700CQ::readAccMgnData(int16_t *accData, int16_t *mgnData)
Rhyme 0:08ed32d49eca 196 {
Rhyme 0:08ed32d49eca 197 uint8_t buf[13] ; /* status + acc (6bytes) + mgn (6bytes) */
Rhyme 0:08ed32d49eca 198 readRegs(REG_STATUS, buf, 13) ;
Rhyme 0:08ed32d49eca 199 // copy the 14 bit accelerometer byte data into 16 bit words
Rhyme 0:08ed32d49eca 200 accData[0] = (int16_t)((buf[1] << 8) | buf[2]) >> 2 ;
Rhyme 0:08ed32d49eca 201 accData[1] = (int16_t)((buf[3] << 8) | buf[4]) >> 2 ;
Rhyme 0:08ed32d49eca 202 accData[2] = (int16_t)((buf[5] << 8) | buf[6]) >> 2 ;
Rhyme 0:08ed32d49eca 203 // copy the magnetometer byte data into 16 bit words
Rhyme 0:08ed32d49eca 204 mgnData[0] = (buf[ 7] << 8) | buf[ 8] ;
Rhyme 0:08ed32d49eca 205 mgnData[1] = (buf[ 9] << 8) | buf[10] ;
Rhyme 0:08ed32d49eca 206 mgnData[2] = (buf[11] << 8) | buf[12] ;
Rhyme 0:08ed32d49eca 207 }