Blame view

RIOT/drivers/include/mma8x5x.h 6.95 KB
a752c7ab   elopes   add first test an...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
  /*
   * Copyright (C) 2014 PHYTEC Messtechnik GmbH
   *               2016 Freie Universitรคt Berlin
   *
   * This file is subject to the terms and conditions of the GNU Lesser
   * General Public License v2.1. See the file LICENSE in the top level
   * directory for more details.
   */
  
  /**
   * @defgroup    drivers_mma8x5x MMA8x5x Accelerometer
   * @ingroup     drivers_sensors
   * @brief       Driver for the Freescale MMA8x5x 3-Axis accelerometer.
   *              The driver will initialize the accelerometer for best
   *              resolution. After the initialization the accelerometer will make
   *              measurements at periodic times. The measurements period and
   *              scale range can be determined by accelerometer initialization.
   *              This driver only implements basic functionality (i.e. no support
   *              for external interrupt pins).
   *
   * @{
   *
   * @file
   * @brief       Interface definition for the MMA8x5x accelerometer driver.
   *
   * @author      Johann Fischer <j.fischer@phytec.de>
   * @author      Hauke Petersen <hauke.petersen@fu-berlin.de>
   */
  
  #ifndef MMA8X5X_H
  #define MMA8X5X_H
  
  #include <stdint.h>
  #include "periph/i2c.h"
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  #ifndef MMA8X5X_I2C_ADDRESS
  #define MMA8X5X_I2C_ADDRESS           0x1D /**< Accelerometer Default Address */
  #endif
  
  /**
   * @brief   Devices supported by this driver
   */
  enum {
      MMA8X5X_TYPE_MMA8652 = 0x4a,    /**< MMA8652 */
      MMA8X5X_TYPE_MMA8653 = 0x5a,    /**< MMA8653 */
      MMA8X5X_TYPE_MMA8451 = 0x1a,    /**< MMA8451 */
      MMA8X5X_TYPE_MMA8452 = 0x2a,    /**< MMA8452 */
      MMA8X5X_TYPE_MMA8453 = 0x3a     /**< MMA8453 */
  };
  
  /**
   * @brief   Available sampling rates
   */
  enum {
      MMA8X5X_RATE_800HZ = (0 << 3),  /**< 800 Hz Ouput Data Rate in WAKE mode */
      MMA8X5X_RATE_400HZ = (1 << 3),  /**< 400 Hz Ouput Data Rate in WAKE mode */
      MMA8X5X_RATE_200HZ = (2 << 3),  /**< 200 Hz Ouput Data Rate in WAKE mode */
      MMA8X5X_RATE_100HZ = (3 << 3),  /**< 100 Hz Ouput Data Rate in WAKE mode */
      MMA8X5X_RATE_50HZ  = (4 << 3),  /**< 50 Hz Ouput Data Rate in WAKE mode */
      MMA8X5X_RATE_1HZ25 = (5 << 3),  /**< 12.5 Hz Ouput Data Rate in WAKE mode */
      MMA8X5X_RATE_6HZ25 = (6 << 3),  /**< 6.25 Hz Ouput Data Rate in WAKE mode */
      MMA8X5X_RATE_1HZ56 = (7 << 3)   /**< 1.56 Hz Ouput Data Rate in WAKE mode */
  };
  
  /**
   * @brief   Available range options
   */
  enum {
      MMA8X5X_RANGE_2G = 0,           /**< +/- 2 g Full Scale Range */
      MMA8X5X_RANGE_4G = 1,           /**< +/- 4 g Full Scale Range */
      MMA8X5X_RANGE_8G = 2            /**< +/- 8 g Full Scale Range */
  };
  
  /**
   * @brief   Named return values
   */
  enum {
      MMA8X5X_OK          =  0,       /**< everything was fine */
      MMA8X5X_DATA_READY  =  1,       /**< new data ready to be read */
      MMA8X5X_NOI2C       = -1,       /**< I2C communication failed */
      MMA8X5X_NODEV       = -2,       /**< no MMA8X5X device found on the bus */
      MMA8X5X_NODATA      = -3        /**< no data available */
  };
  
  /**
   * @brief   Configuration parameters
   */
  typedef struct {
      i2c_t i2c;                  /**< I2C bus the device is connected to */
      uint8_t addr;               /**< I2C bus address of the device */
      uint8_t type;               /**< device type */
      uint8_t rate;               /**< sampling rate to use */
      uint8_t range;              /**< scale range to use */
      uint8_t offset[3];          /**< data offset in X, Y, and Z direction */
  } mma8x5x_params_t;
  
  /**
   * @brief   Device descriptor for MMA8x5x accelerometers
   */
  typedef struct {
      mma8x5x_params_t params;    /**< device configuration parameters */
  } mma8x5x_t;
  
  /**
   * @brief   Data type for the result data
   */
  typedef struct {
      int16_t x;                  /**< acceleration in X direction */
      int16_t y;                  /**< acceleration in Y direction */
      int16_t z;                  /**< acceleration in Z direction */
  } mma8x5x_data_t;
  
  /**
   * @brief   Initialize the MMA8x5x accelerometer driver.
   *
   * @param[out] dev          device descriptor of accelerometer to initialize
   * @param[in]  params       configuration parameters
   *
   * @return                  MMA8X5X_OK on success
   * @return                  MMA8X5X_NOI2C if initialization of I2C bus failed
   * @return                  MMA8X5X_NODEV if accelerometer test failed
   */
  int mma8x5x_init(mma8x5x_t *dev, const mma8x5x_params_t *params);
  
  /**
   * @brief   Set user offset correction
   *
   * Offset correction registers will be erased after accelerometer reset.
   *
   * @param[out] dev          device descriptor of accelerometer to initialize
   * @param[in]  x            offset correction value for x-axis
   * @param[in]  y            offset correction value for y-axis
   * @param[in]  z            offset correction value for z-axis
   */
  void mma8x5x_set_user_offset(const mma8x5x_t *dev, int8_t x, int8_t y, int8_t z);
  
  /**
   * @brief   Set active mode, this enables periodic measurements
   *
   * @param[out] dev          device descriptor of accelerometer to reset
   */
  void mma8x5x_set_active(const mma8x5x_t *dev);
  
  /**
   * @brief   Set standby mode.
   *
   * @param[in]  dev          device descriptor of accelerometer
   */
  void mma8x5x_set_standby(const mma8x5x_t *dev);
  
  /**
   * @brief   Check for new set of measurement data
   *
   * @param[in]  dev          device descriptor of accelerometer
   *
   * @return                  MMA8X5X_DATA_READY if new sample is ready
   * @return                  MMA8X5X_NODATA if nothing is available
   */
  int mma8x5x_is_ready(const mma8x5x_t *dev);
  
  /**
   * @brief   Read accelerometer's data
   *
   * Acceleration will be calculated as:<br>
   *     \f$ a = \frac{value \cdot 1000}{1024} \cdot mg \f$ if full scale is set
   *     to 2g<br>
   *     \f$ a = \frac{value \cdot 1000}{512} \cdot mg \f$ if full scale is set to
   *     4g<br>
   *     \f$ a = \frac{value \cdot 1000}{256} \cdot mg \f$ if full scale is set to
   *     8g<br>
   *
   * @param[in]  dev          device descriptor of accelerometer
   * @param[out] data         the current acceleration data [in mg]
   */
  void mma8x5x_read(const mma8x5x_t *dev, mma8x5x_data_t *data);
  
  /**
   * @brief   Configure motion detection interrupt
   *
   * User needs to configure MCU side of the selected int pin.  mma8x5x will set
   * the pin to low on interrupt.  Before another interrupt can occur, the
   * current interrupt must be acknowledged using @p mma8x5x_ack_int().
   *
   * @param[in]   dev         device descriptor of accelerometer
   * @param[in]   int_pin     select mma8x5x int pin (1 or 2)
   * @param[in]   threshold   motion detection threshold (see datasheet)
   */
  void mma8x5x_set_motiondetect(const mma8x5x_t *dev, uint8_t int_pin, uint8_t threshold);
  
  /**
   * @brief   Acknowledge motion detection interrupt
   *
   * Acknowledges (clears) a motion detection interrupt.
   * See @ref mma8x5x_set_motiondetect().
   *
   * @warning: this does incur an I2C write, thus should not be done from within
   *           the ISR.
   *
   * @param[in]   dev         device descriptor of accelerometer
   */
  void mma8x5x_ack_int(const mma8x5x_t *dev);
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif /* MMA8X5X_H */
  /** @} */