ADXL362 accelerometer library

Dependents:   BLENano_SimpleTemplate_adxl362_170813 nRF51_ADXL3xx

Fork of ADXL362 by Analog Devices

Committer:
Jun_adi
Date:
Tue Aug 22 05:25:20 2017 +0000
Revision:
2:fe49d0e51baa
Parent:
1:ae171c032dc0
Change headder file for BLE nano;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adisuciu 0:2e21c4508cab 1 #ifndef ADXL362_H_
adisuciu 0:2e21c4508cab 2 #define ADXL362_H_
adisuciu 0:2e21c4508cab 3
adisuciu 0:2e21c4508cab 4 /**
adisuciu 0:2e21c4508cab 5 * @file ADXL362.cpp
adisuciu 0:2e21c4508cab 6 * @brief Header file for ADXL362
adisuciu 0:2e21c4508cab 7 * @author Analog Devices Inc.
adisuciu 0:2e21c4508cab 8 *
adisuciu 0:2e21c4508cab 9 * For support please go to:
adisuciu 0:2e21c4508cab 10 * Github: https://github.com/analogdevicesinc/mbed-adi
adisuciu 0:2e21c4508cab 11 * Support: https://ez.analog.com/community/linux-device-drivers/microcontroller-no-os-drivers
adisuciu 0:2e21c4508cab 12 * Product: http://www.analog.com/adxl362
adisuciu 0:2e21c4508cab 13 * More: https://wiki.analog.com/resources/tools-software/mbed-drivers-all
adisuciu 0:2e21c4508cab 14
adisuciu 0:2e21c4508cab 15 ********************************************************************************
adisuciu 0:2e21c4508cab 16 * Copyright 2016(c) Analog Devices, Inc.
adisuciu 0:2e21c4508cab 17 *
adisuciu 0:2e21c4508cab 18 * All rights reserved.
adisuciu 0:2e21c4508cab 19 *
adisuciu 0:2e21c4508cab 20 * Redistribution and use in source and binary forms, with or without
adisuciu 0:2e21c4508cab 21 * modification, are permitted provided that the following conditions are met:
adisuciu 0:2e21c4508cab 22 * - Redistributions of source code must retain the above copyright
adisuciu 0:2e21c4508cab 23 * notice, this list of conditions and the following disclaimer.
adisuciu 0:2e21c4508cab 24 * - Redistributions in binary form must reproduce the above copyright
adisuciu 0:2e21c4508cab 25 * notice, this list of conditions and the following disclaimer in
adisuciu 0:2e21c4508cab 26 * the documentation and/or other materials provided with the
adisuciu 0:2e21c4508cab 27 * distribution.
adisuciu 0:2e21c4508cab 28 * - Neither the name of Analog Devices, Inc. nor the names of its
adisuciu 0:2e21c4508cab 29 * contributors may be used to endorse or promote products derived
adisuciu 0:2e21c4508cab 30 * from this software without specific prior written permission.
adisuciu 0:2e21c4508cab 31 * - The use of this software may or may not infringe the patent rights
adisuciu 0:2e21c4508cab 32 * of one or more patent holders. This license does not release you
adisuciu 0:2e21c4508cab 33 * from the requirement that you obtain separate licenses from these
adisuciu 0:2e21c4508cab 34 * patent holders to use this software.
adisuciu 0:2e21c4508cab 35 * - Use of the software either in source or binary form, must be run
adisuciu 0:2e21c4508cab 36 * on or directly connected to an Analog Devices Inc. component.
adisuciu 0:2e21c4508cab 37 *
adisuciu 0:2e21c4508cab 38 * THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
adisuciu 0:2e21c4508cab 39 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
adisuciu 0:2e21c4508cab 40 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
adisuciu 0:2e21c4508cab 41 * IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
adisuciu 0:2e21c4508cab 42 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
adisuciu 0:2e21c4508cab 43 * LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR
adisuciu 0:2e21c4508cab 44 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
adisuciu 0:2e21c4508cab 45 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
adisuciu 0:2e21c4508cab 46 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
adisuciu 0:2e21c4508cab 47 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
adisuciu 0:2e21c4508cab 48 *
adisuciu 0:2e21c4508cab 49 ********************************************************************************/
adisuciu 0:2e21c4508cab 50
adisuciu 0:2e21c4508cab 51 #include "mbed.h"
adisuciu 0:2e21c4508cab 52
adisuciu 1:ae171c032dc0 53 /**
adisuciu 1:ae171c032dc0 54 * @brief Analog devices ADXL362 Digital Output MEMS Accelerometer
adisuciu 1:ae171c032dc0 55 */
adisuciu 0:2e21c4508cab 56 class ADXL362
adisuciu 0:2e21c4508cab 57 {
adisuciu 0:2e21c4508cab 58 public:
adisuciu 0:2e21c4508cab 59
adisuciu 0:2e21c4508cab 60 /* Temperature parameters */
adisuciu 0:2e21c4508cab 61 typedef enum {
adisuciu 0:2e21c4508cab 62 DEVID_AD = 0x00,
adisuciu 0:2e21c4508cab 63 DEVID_MST = 0x01,
adisuciu 0:2e21c4508cab 64 PARTID = 0x02,
adisuciu 0:2e21c4508cab 65 REVID = 0x03,
adisuciu 0:2e21c4508cab 66 XDATA = 0x08,
adisuciu 0:2e21c4508cab 67 YDATA = 0x09,
adisuciu 0:2e21c4508cab 68 ZDATA = 0x0A,
adisuciu 0:2e21c4508cab 69 STATUS = 0x0B,
adisuciu 0:2e21c4508cab 70 FIFO_ENTRIES_L = 0x0C,
adisuciu 0:2e21c4508cab 71 FIFO_ENTRIES_H = 0x0D,
adisuciu 0:2e21c4508cab 72 XDATA_L = 0x0E,
adisuciu 0:2e21c4508cab 73 XDATA_H = 0x0F,
adisuciu 0:2e21c4508cab 74 YDATA_L = 0x10,
adisuciu 0:2e21c4508cab 75 YDATA_H = 0x11,
adisuciu 0:2e21c4508cab 76 ZDATA_L = 0x12,
adisuciu 0:2e21c4508cab 77 ZDATA_H = 0x13,
adisuciu 0:2e21c4508cab 78 TEMP_L = 0x14,
adisuciu 0:2e21c4508cab 79 TEMP_H = 0x15,
adisuciu 0:2e21c4508cab 80 // Reserved = 0x16;
adisuciu 0:2e21c4508cab 81 // Reserved = 0x17;
adisuciu 0:2e21c4508cab 82 SOFT_RESET = 0x1F,
adisuciu 0:2e21c4508cab 83 THRESH_ACT_L = 0x20,
adisuciu 0:2e21c4508cab 84 THRESH_ACT_H = 0x21,
adisuciu 0:2e21c4508cab 85 TIME_ACT = 0x22,
adisuciu 0:2e21c4508cab 86 THRESH_INACT_L = 0x23,
adisuciu 0:2e21c4508cab 87 THRESH_INACT_H = 0x24,
adisuciu 0:2e21c4508cab 88 TIME_INACT_L = 0x25,
adisuciu 0:2e21c4508cab 89 TIME_INACT_H = 0x26,
adisuciu 0:2e21c4508cab 90 ACT_INACT_CTL = 0x27,
adisuciu 0:2e21c4508cab 91 FIFO_CONTROL = 0x28,
adisuciu 0:2e21c4508cab 92 FIFO_SAMPLES = 0x29,
adisuciu 0:2e21c4508cab 93 INTMAP1 = 0x2A,
adisuciu 0:2e21c4508cab 94 INTMAP2 = 0x2B,
adisuciu 0:2e21c4508cab 95 FILTER_CTL = 0x2C,
adisuciu 0:2e21c4508cab 96 POWER_CTL = 0x2D,
adisuciu 0:2e21c4508cab 97 SELF_TEST = 0x2E,
adisuciu 0:2e21c4508cab 98 } ADXL362_register_t;
adisuciu 0:2e21c4508cab 99
adisuciu 0:2e21c4508cab 100 typedef enum {
adisuciu 0:2e21c4508cab 101 STANDBY = 0x00,
adisuciu 0:2e21c4508cab 102 MEASUREMENT = 0x02
adisuciu 0:2e21c4508cab 103 } ADXL362_modes_t;
adisuciu 0:2e21c4508cab 104
adisuciu 0:2e21c4508cab 105 typedef enum {
adisuciu 0:2e21c4508cab 106 ERR_USER_REGS = 0x80,
adisuciu 0:2e21c4508cab 107 AWAKE = 0x40,
adisuciu 0:2e21c4508cab 108 INACT = 0x20,
adisuciu 0:2e21c4508cab 109 ACT = 0x10,
adisuciu 0:2e21c4508cab 110 FIFO_OVERRUN = 0x08,
adisuciu 0:2e21c4508cab 111 FIFO_WATERMARK = 0x04,
adisuciu 0:2e21c4508cab 112 FIFO_READY = 0x02,
adisuciu 0:2e21c4508cab 113 DATA_READY = 0x01
adisuciu 0:2e21c4508cab 114 } ADXL362_STATUS_reg_bits_t;
adisuciu 0:2e21c4508cab 115
adisuciu 0:2e21c4508cab 116 typedef enum {
adisuciu 0:2e21c4508cab 117 LINKLOOP1 = 0x20,
adisuciu 0:2e21c4508cab 118 LINKLOOP0 = 0x10,
adisuciu 0:2e21c4508cab 119 DEFAULTMODE = 0x00,
adisuciu 0:2e21c4508cab 120 LINKED_MODE = 0x10,
adisuciu 0:2e21c4508cab 121 LOOP_MODE = 0x30,
adisuciu 0:2e21c4508cab 122 INACT_REF = 0x08,
adisuciu 0:2e21c4508cab 123 INACT_EN = 0x04,
adisuciu 0:2e21c4508cab 124 ACT_REF = 0x02,
adisuciu 0:2e21c4508cab 125 ACT_EN = 0x01
adisuciu 0:2e21c4508cab 126 } ADXL362_ACT_INACT_CTL_reg_bits_t;
adisuciu 0:2e21c4508cab 127
adisuciu 0:2e21c4508cab 128 typedef enum {
adisuciu 0:2e21c4508cab 129 AH = 0x08,
adisuciu 0:2e21c4508cab 130 FIFO_TEMP = 0x04,
adisuciu 0:2e21c4508cab 131 FIFO_MODE1 = 0x02,
adisuciu 0:2e21c4508cab 132 FIFO_MODE = 0x01,
adisuciu 0:2e21c4508cab 133 } ADXL362_FIFO_CONTROL_reg_bits_t;
adisuciu 0:2e21c4508cab 134
adisuciu 0:2e21c4508cab 135 typedef enum {
adisuciu 0:2e21c4508cab 136 FIFO_DISABLED = 0x00,
adisuciu 0:2e21c4508cab 137 FIFO_OLDEST = 0x01,
adisuciu 0:2e21c4508cab 138 FIFO_STREAM = 0x02,
adisuciu 0:2e21c4508cab 139 FIFO_TRIGGERED = 0x03,
adisuciu 0:2e21c4508cab 140 } ADXL362_FIFO_modes_t;
adisuciu 0:2e21c4508cab 141
adisuciu 0:2e21c4508cab 142 typedef enum {
adisuciu 0:2e21c4508cab 143 INT_LOW = 0x80,
adisuciu 0:2e21c4508cab 144 INT_AWAKE = 0x40,
adisuciu 0:2e21c4508cab 145 INT_INACT = 0x20,
adisuciu 0:2e21c4508cab 146 INT_ACT = 0x10,
adisuciu 0:2e21c4508cab 147 INT_FIFO_OVERRUN = 0x08,
adisuciu 0:2e21c4508cab 148 INT_FIFO_WATERMARK = 0x04,
adisuciu 0:2e21c4508cab 149 INT_FIFO_READY = 0x02,
adisuciu 0:2e21c4508cab 150 INT_DATA_READY = 0x01
adisuciu 0:2e21c4508cab 151 } ADXL362_INTMAP_reg_bits_t;
adisuciu 0:2e21c4508cab 152
adisuciu 0:2e21c4508cab 153 typedef enum {
adisuciu 0:2e21c4508cab 154 RANGE1 = 0x80,
adisuciu 0:2e21c4508cab 155 RANGE0 = 0x40,
adisuciu 0:2e21c4508cab 156 RANGE2G = 0x00,
adisuciu 0:2e21c4508cab 157 RANGE4G = 0x40,
adisuciu 0:2e21c4508cab 158 RANGE8G = 0x80,
adisuciu 0:2e21c4508cab 159 HALF_BW = 0x10,
adisuciu 0:2e21c4508cab 160 EXT_SAMPLE = 0x08,
adisuciu 0:2e21c4508cab 161 ODR2 = 0x04,
adisuciu 0:2e21c4508cab 162 ODR1 = 0x02,
adisuciu 0:2e21c4508cab 163 ODR0 = 0x01,
adisuciu 0:2e21c4508cab 164 ODR12HZ = 0x00,
adisuciu 0:2e21c4508cab 165 ODR25HZ = 0x01,
adisuciu 0:2e21c4508cab 166 ODR50Hz = 0x02,
adisuciu 0:2e21c4508cab 167 ODR100HZ = 0x03,
adisuciu 0:2e21c4508cab 168 ODR200Hz = 0x04,
adisuciu 0:2e21c4508cab 169 ODR400HZ = 0x07
adisuciu 0:2e21c4508cab 170 } ADXL362_FILTER_CTL_reg_bits_t;
adisuciu 0:2e21c4508cab 171
adisuciu 0:2e21c4508cab 172 typedef enum {
adisuciu 0:2e21c4508cab 173 EXT_CLK = 0x40,
adisuciu 0:2e21c4508cab 174 LOW_NOISE1 = 0x20,
adisuciu 0:2e21c4508cab 175 LOW_NOISE0 = 0x10,
adisuciu 0:2e21c4508cab 176 NORMAL_OPERATION = 0x00,
adisuciu 0:2e21c4508cab 177 LOW_NOISE = 0x10,
adisuciu 0:2e21c4508cab 178 ULTRALOW_NOISE = 0x20,
adisuciu 0:2e21c4508cab 179 WAKEUP = 0x08,
adisuciu 0:2e21c4508cab 180 AUTOSLEEP = 0x04,
adisuciu 0:2e21c4508cab 181 MEASURE1 = 0x02,
adisuciu 0:2e21c4508cab 182 MEASURE0 = 0x01,
adisuciu 0:2e21c4508cab 183 } ADXL362_POWER_CTL_reg_bits_t;
adisuciu 0:2e21c4508cab 184
adisuciu 0:2e21c4508cab 185 /** SPI configuration & constructor */
Jun_adi 2:fe49d0e51baa 186 // ADXL362(PinName CS = SPI_CS, PinName MOSI = SPI_MOSI, PinName MISO =
Jun_adi 2:fe49d0e51baa 187 // SPI_MISO, PinName SCK = SPI_SCK);
Jun_adi 2:fe49d0e51baa 188 ADXL362(PinName CS, PinName MOSI, PinName MISO, PinName SCK);
adisuciu 0:2e21c4508cab 189 void frequency(int hz);
adisuciu 0:2e21c4508cab 190
adisuciu 0:2e21c4508cab 191 /** Low level SPI bus comm methods */
adisuciu 0:2e21c4508cab 192 void reset(void);
adisuciu 0:2e21c4508cab 193 void write_reg(ADXL362_register_t reg, uint8_t data);
adisuciu 0:2e21c4508cab 194 uint8_t read_reg(ADXL362_register_t reg);
adisuciu 0:2e21c4508cab 195 uint16_t read_reg_u16(ADXL362_register_t reg);
adisuciu 0:2e21c4508cab 196 void write_reg_u16(ADXL362_register_t reg, uint16_t data);
adisuciu 0:2e21c4508cab 197
adisuciu 0:2e21c4508cab 198 /** ADXL general register R/W methods */
adisuciu 0:2e21c4508cab 199 void set_power_ctl_reg(uint8_t data);
adisuciu 0:2e21c4508cab 200 void set_filter_ctl_reg(uint8_t data);
adisuciu 0:2e21c4508cab 201 uint8_t read_status();
adisuciu 0:2e21c4508cab 202 void set_mode(ADXL362_modes_t mode);
adisuciu 0:2e21c4508cab 203
adisuciu 0:2e21c4508cab 204 /** ADXL X/Y/Z/T scanning methods*/
adisuciu 0:2e21c4508cab 205 uint64_t scan();
adisuciu 0:2e21c4508cab 206 uint8_t scanx_u8();
adisuciu 0:2e21c4508cab 207 uint16_t scanx();
adisuciu 0:2e21c4508cab 208 uint8_t scany_u8();
adisuciu 0:2e21c4508cab 209 uint16_t scany();
adisuciu 0:2e21c4508cab 210 uint8_t scanz_u8();
adisuciu 0:2e21c4508cab 211 uint16_t scanz();
adisuciu 0:2e21c4508cab 212 uint16_t scant();
adisuciu 0:2e21c4508cab 213
adisuciu 0:2e21c4508cab 214 /** ADXL362 activity methods */
adisuciu 0:2e21c4508cab 215 void set_activity_threshold(uint16_t threshold);
adisuciu 0:2e21c4508cab 216 void set_activity_time(uint8_t time);
adisuciu 0:2e21c4508cab 217 void set_inactivity_threshold(uint16_t threshold);
adisuciu 0:2e21c4508cab 218 void set_inactivity_time(uint16_t time);
adisuciu 0:2e21c4508cab 219 void set_act_inact_ctl_reg(uint8_t data);
adisuciu 0:2e21c4508cab 220
adisuciu 0:2e21c4508cab 221 /** ADXL362 interrupt methods */
adisuciu 0:2e21c4508cab 222 void set_interrupt1_pin(PinName in, uint8_t data, void (*callback_rising)(void), void (*callback_falling)(void), PinMode pull = PullNone);
adisuciu 0:2e21c4508cab 223 void set_interrupt2_pin(PinName in, uint8_t data, void (*callback_rising)(void), void (*callback_falling)(void), PinMode pull = PullNone);
adisuciu 0:2e21c4508cab 224 void enable_interrupt1();
adisuciu 0:2e21c4508cab 225 void enable_interrupt2();
adisuciu 0:2e21c4508cab 226 void disable_interrupt1();
adisuciu 0:2e21c4508cab 227 void disable_interrupt2();
adisuciu 0:2e21c4508cab 228
adisuciu 0:2e21c4508cab 229 void set_polling_interrupt1_pin(PinName in, uint8_t data, PinMode pull = PullNone);
adisuciu 0:2e21c4508cab 230 void set_polling_interrupt2_pin(PinName in, uint8_t data, PinMode pull = PullNone);
adisuciu 0:2e21c4508cab 231
adisuciu 0:2e21c4508cab 232 bool get_int1();
adisuciu 0:2e21c4508cab 233 bool get_int2();
adisuciu 0:2e21c4508cab 234
adisuciu 0:2e21c4508cab 235 /** ADXL362 FIFO methods */
adisuciu 0:2e21c4508cab 236 uint16_t fifo_read_nr_of_entries();
adisuciu 0:2e21c4508cab 237 void fifo_setup(bool store_temp, ADXL362_FIFO_modes_t mode, uint16_t nr_of_entries);
adisuciu 0:2e21c4508cab 238 uint16_t fifo_read_u16();
adisuciu 0:2e21c4508cab 239 uint64_t fifo_scan();
adisuciu 0:2e21c4508cab 240
adisuciu 0:2e21c4508cab 241 SPI adxl362; ///< SPI instance of the ADXL362
adisuciu 0:2e21c4508cab 242 DigitalOut cs; ///< DigitalOut instance for the chipselect of the ADXL362
adisuciu 0:2e21c4508cab 243
adisuciu 0:2e21c4508cab 244 private:
adisuciu 0:2e21c4508cab 245
adisuciu 0:2e21c4508cab 246 InterruptIn *_int1;
adisuciu 0:2e21c4508cab 247 InterruptIn *_int2;
adisuciu 0:2e21c4508cab 248 DigitalIn _int1_poll;
adisuciu 0:2e21c4508cab 249 DigitalIn _int2_poll;
adisuciu 0:2e21c4508cab 250 bool _int1_act_low;
adisuciu 0:2e21c4508cab 251 bool _int2_act_low;
adisuciu 0:2e21c4508cab 252 bool _temp_stored_in_fifo;
adisuciu 0:2e21c4508cab 253
adisuciu 0:2e21c4508cab 254 const static uint8_t _DUMMY_BYTE = 0xAA;
adisuciu 0:2e21c4508cab 255 const static uint8_t _WRITE_REG_CMD = 0x0A; // write register
adisuciu 0:2e21c4508cab 256 const static uint8_t _READ_REG_CMD = 0x0B; // read register
adisuciu 0:2e21c4508cab 257 const static uint8_t _READ_FIFO_CMD = 0x0D; // read FIFO
adisuciu 0:2e21c4508cab 258 const static uint8_t _SPI_MODE = 0;
adisuciu 0:2e21c4508cab 259 };
adisuciu 0:2e21c4508cab 260
adisuciu 0:2e21c4508cab 261 #endif