Statistics
| Branch: | Tag: | Revision:

amiro-lld / include / alld_mpu6050.h @ 3389f547

History | View | Annotate | Download (5.012 KB)

1 3389f547 Simon Welzel
/*
2
 * sd_hal_mpu6050.h
3
 *
4
 *  Created on: Feb 19, 2016
5
 *      Author: Sina Darvishi
6
 */
7
8
#ifndef DRIVERS_MYLIB_MPU6050_H_
9
#define DRIVERS_MYLIB_MPU6050_H_
10
11
/*
12
 C++ detection
13
#ifdef __cplusplus
14
extern "C" {
15
#endif
16
*/
17
18
#include <amiro-lld.h>
19
#include <periphAL.h> // should already be included by line above this
20
21
#if defined(AMIROLLD_CFG_USE_MPU6050) || defined(__DOXYGEN__)
22
23
#include <stdint.h>
24
25
/**
26
 * @defgroup SD_MPU6050_Macros
27
 * @brief    Library defines
28
 * @{
29
 */
30
31
32
/* Default I2C clock */
33
#ifndef MPU6050_I2C_CLOCK
34
#define MPU6050_I2C_CLOCK              400000            /*!< Default I2C clock speed */
35
#endif
36
37
/**
38
 * @brief  Data rates predefined constants
39
 * @{
40
 */
41
#define SD_MPU6050_DataRate_8KHz       0   /*!< Sample rate set to 8 kHz */
42
#define SD_MPU6050_DataRate_4KHz       1   /*!< Sample rate set to 4 kHz */
43
#define SD_MPU6050_DataRate_2KHz       3   /*!< Sample rate set to 2 kHz */
44
#define SD_MPU6050_DataRate_1KHz       7   /*!< Sample rate set to 1 kHz */
45
#define SD_MPU6050_DataRate_500Hz      15  /*!< Sample rate set to 500 Hz */
46
#define SD_MPU6050_DataRate_250Hz      31  /*!< Sample rate set to 250 Hz */
47
#define SD_MPU6050_DataRate_125Hz      63  /*!< Sample rate set to 125 Hz */
48
#define SD_MPU6050_DataRate_100Hz      79  /*!< Sample rate set to 100 Hz */
49
/**
50
 * @}
51
 */
52
53
/**
54
 * @}
55
 */
56
57
/**
58
 * @defgroup SD_MPU6050_Typedefs
59
 * @brief    Library Typedefs
60
 * @{
61
 */
62
63
/**
64
 * @brief I2C address masks. TODO: Set to MPU6050 adresses!
65
 */
66
enum {
67
  MPU6050_LLD_I2C_ADDR_FIXED   = 0x0040u,
68
  MPU6050_LLD_I2C_ADDR_A0      = 0x0001u,
69
  MPU6050_LLD_I2C_ADDR_A1      = 0x0004u,
70
};
71
72
/**
73
 * @brief Registers. TODO: Adjust to MPU6050 registers
74
 */
75
typedef enum {
76
  MPU6050_LLD_REGISTER_CONFIGURATION = 0x00,
77
  MPU6050_LLD_REGISTER_SHUNT_VOLTAGE = 0x01,
78
  MPU6050_LLD_REGISTER_BUS_VOLTAGE   = 0x02,
79
  MPU6050_LLD_REGISTER_POWER         = 0x03,
80
  MPU6050_LLD_REGISTER_CURRENT       = 0x04,
81
  MPU6050_LLD_REGISTER_CALIBRATION   = 0x05,
82
} mpu6050_lld_register_t;
83
84
/**
85
 * @brief  MPU6050 can have 2 different slave addresses, depends on it's input AD0 pin
86
 *         This feature allows you to use 2 different sensors with this library at the same time
87
 */
88
typedef enum  {
89
        SD_MPU6050_Device_0 = 0x00, /*!< AD0 pin is set to low */
90
        SD_MPU6050_Device_1 = 0x02  /*!< AD0 pin is set to high */
91
} SD_MPU6050_Device;
92
93
/**
94
 * @brief  MPU6050 result enumeration
95
 */
96
typedef enum  {
97
        SD_MPU6050_Result_Ok = 0x00,          /*!< Everything OK */
98
        SD_MPU6050_Result_Error,              /*!< Unknown error */
99
        SD_MPU6050_Result_DeviceNotConnected, /*!< There is no device with valid slave address */
100
        SD_MPU6050_Result_DeviceInvalid       /*!< Connected device with address is not MPU6050 */
101
} SD_MPU6050_Result;
102
103
/**
104
 * @brief  Parameters for accelerometer range
105
 */
106
typedef enum  {
107
        SD_MPU6050_Accelerometer_2G = 0x00, /*!< Range is +- 2G */
108
        SD_MPU6050_Accelerometer_4G = 0x01, /*!< Range is +- 4G */
109
        SD_MPU6050_Accelerometer_8G = 0x02, /*!< Range is +- 8G */
110
        SD_MPU6050_Accelerometer_16G = 0x03 /*!< Range is +- 16G */
111
} SD_MPU6050_Accelerometer;
112
113
/**
114
 * @brief  Parameters for gyroscope range
115
 */
116
typedef enum {
117
        SD_MPU6050_Gyroscope_250s = 0x00,  /*!< Range is +- 250 degrees/s */
118
        SD_MPU6050_Gyroscope_500s = 0x01,  /*!< Range is +- 500 degrees/s */
119
        SD_MPU6050_Gyroscope_1000s = 0x02, /*!< Range is +- 1000 degrees/s */
120
        SD_MPU6050_Gyroscope_2000s = 0x03  /*!< Range is +- 2000 degrees/s */
121
} SD_MPU6050_Gyroscope;
122
123
124
/**
125
 * @brief  Interrupts union and structure
126
 */
127
typedef union {
128
        struct {
129
                uint8_t DataReady:1;       /*!< Data ready interrupt */
130
                uint8_t reserved2:2;       /*!< Reserved bits */
131
                uint8_t Master:1;          /*!< Master interrupt. Not enabled with library */
132
                uint8_t FifoOverflow:1;    /*!< FIFO overflow interrupt. Not enabled with library */
133
                uint8_t reserved1:1;       /*!< Reserved bit */
134
                uint8_t MotionDetection:1; /*!< Motion detected interrupt */
135
                uint8_t reserved0:1;       /*!< Reserved bit */
136
        } F;
137
        uint8_t Status;
138
} SD_MPU6050_Interrupt;
139
140
/**
141
 * @brief Config register.
142
 */
143
typedef union {
144
  uint16_t data;
145
  struct {
146
    /**
147
    ina219_lld_mode_t mode : 3;
148
    ina219_lld_adc_t sadc : 4;
149
    ina219_lld_adc_t badc : 4;
150
    ina219_lld_gain_t gain : 2;
151
    ina219_lld_brng_t brng : 1;
152
    */
153
    uint8_t zero : 1;
154
    uint8_t reset : 1;
155
  } options;
156
} mpu6050_lld_cfg_t;
157
158
159
/**
160
 * @brief The MPU6050 struct.
161
 */
162
typedef struct {
163
  apalI2CDriver_t* i2cd;
164
  apalI2Caddr_t addr;   /**<The address of the module for I2C communication */
165
  uint16_t current_lsb_uA;
166
  mpu6050_lld_cfg_t *config;
167
} MPU6050Driver;
168
169
/**
170
 * @}
171
 */
172
173
/**
174
 * @defgroup SD_MPU6050_Functions
175
 * @brief    Library Functions
176
 * @{
177
 */
178
179
//from alld_ina219.h
180
apalExitStatus_t mpu6050_lld_read_register(const MPU6050Driver* const mpu6050, const mpu6050_lld_register_t addr, uint16_t* const data, const uint8_t num, const apalTime_t timeout);
181
182
apalExitStatus_t mpu6050_lld_write_register(const MPU6050Driver* const mpu6050, const mpu6050_lld_register_t addr, const uint16_t* const data, const uint8_t num, const apalTime_t timeout);
183
184
#endif /* defined(AMIROLLD_CFG_USE_MPU6050) */
185
186
#endif /* DRIVERS_MYLIB_MPU6050_H_ */