Statistics
| Branch: | Tag: | Revision:

amiro-lld / source / alld_mpu6050.c @ 3389f547

History | View | Annotate | Download (5.093 KB)

1 3389f547 Simon Welzel
/*
2
 * sd_hal_mpu6050.c
3
 *
4
 *  Created on: Feb 19, 2016
5
 *      Author: Sina Darvishi
6
 *  Edited on: Jan 15, 2019
7
 *      Editor: Simon Welzel
8
 */
9
10
/**
11
 * |----------------------------------------------------------------------
12
 * | Copyright (C) Sina Darvishi,2016
13
 * |
14
 * | This program is free software: you can redistribute it and/or modify
15
 * | it under the terms of the GNU General Public License as published by
16
 * | the Free Software Foundation, either version 3 of the License, or
17
 * | any later version.
18
 * |
19
 * | This program is distributed in the hope that it will be useful,
20
 * | but WITHOUT ANY WARRANTY; without even the implied warranty of
21
 * | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22
 * | GNU General Public License for more details.
23
 * |
24
 * | You should have received a copy of the GNU General Public License
25
 * | along with this program.  If not, see <http://www.gnu.org/licenses/>.
26
 * |----------------------------------------------------------------------
27
 */
28
29
#include "alld_mpu6050.h"
30
#include <amiro-lld.h>
31
32
#if defined(AMIROLLD_CFG_USE_MPU6050) || defined(__DOXYGEN__)
33
34
#include <stdint.h>
35
36
/* Default I2C address */
37
#define MPU6050_I2C_ADDR   0xD0
38
39
/* Who I am register value */
40
#define MPU6050_I_AM    0x68
41
42
/* MPU6050 registers */
43
#define MPU6050_AUX_VDDIO   0x01
44
#define MPU6050_SMPLRT_DIV   0x19
45
#define MPU6050_CONFIG    0x1A
46
#define MPU6050_GYRO_CONFIG   0x1B
47
#define MPU6050_ACCEL_CONFIG  0x1C
48
#define MPU6050_MOTION_THRESH  0x1F
49
#define MPU6050_INT_PIN_CFG   0x37
50
#define MPU6050_INT_ENABLE   0x38
51
#define MPU6050_INT_STATUS   0x3A
52
#define MPU6050_ACCEL_XOUT_H  0x3B
53
#define MPU6050_ACCEL_XOUT_L  0x3C
54
#define MPU6050_ACCEL_YOUT_H  0x3D
55
#define MPU6050_ACCEL_YOUT_L  0x3E
56
#define MPU6050_ACCEL_ZOUT_H  0x3F
57
#define MPU6050_ACCEL_ZOUT_L  0x40
58
#define MPU6050_TEMP_OUT_H   0x41
59
#define MPU6050_TEMP_OUT_L   0x42
60
#define MPU6050_GYRO_XOUT_H   0x43
61
#define MPU6050_GYRO_XOUT_L   0x44
62
#define MPU6050_GYRO_YOUT_H   0x45
63
#define MPU6050_GYRO_YOUT_L   0x46
64
#define MPU6050_GYRO_ZOUT_H   0x47
65
#define MPU6050_GYRO_ZOUT_L   0x48
66
#define MPU6050_MOT_DETECT_STATUS 0x61
67
#define MPU6050_SIGNAL_PATH_RESET 0x68
68
#define MPU6050_MOT_DETECT_CTRL  0x69
69
#define MPU6050_USER_CTRL   0x6A
70
#define MPU6050_PWR_MGMT_1   0x6B
71
#define MPU6050_PWR_MGMT_2   0x6C
72
#define MPU6050_FIFO_COUNTH   0x72
73
#define MPU6050_FIFO_COUNTL   0x73
74
#define MPU6050_FIFO_R_W   0x74
75
#define MPU6050_WHO_AM_I   0x75
76
77
/* Gyro sensitivities in degrees/s */
78
#define MPU6050_GYRO_SENS_250  ((float) 131)
79
#define MPU6050_GYRO_SENS_500  ((float) 65.5)
80
#define MPU6050_GYRO_SENS_1000  ((float) 32.8)
81
#define MPU6050_GYRO_SENS_2000  ((float) 16.4)
82
83
/* Acce sensitivities in g/s */
84
#define MPU6050_ACCE_SENS_2   ((float) 16384)
85
#define MPU6050_ACCE_SENS_4   ((float) 8192)
86
#define MPU6050_ACCE_SENS_8   ((float) 4096)
87
#define MPU6050_ACCE_SENS_16  ((float) 2048)
88
89
90
91
// from alld_ina219.c
92
/**
93
 * @brief Read the value of one or more of the registers.
94
 * @param[in]   i2cd        i2c driver
95
 * @param[in]   inad        ina219 driver
96
 * @param[in]   addr        register address
97
 * @param[out]  data        register content
98
 * @param[in]   num         number of subsequent registers to read
99
 * @param[in]   timeout     timeout
100
 * @return                  An indicator whether the call was successfull
101
 */
102
inline apalExitStatus_t
103
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)
104
{
105
  apalDbgAssert(mpu6050 != 0);
106
  apalDbgAssert(mpu6050->i2cd != 0);
107
  apalDbgAssert(data != 0);
108
109
  uint8_t buffer[num*2];
110
  apalExitStatus_t status = apalI2CMasterTransmit(mpu6050->i2cd, (MPU6050_LLD_I2C_ADDR_FIXED | mpu6050->addr), (uint8_t*)&addr, 1, buffer, 2*num, timeout);
111
  for (uint8_t dataIdx = 0; dataIdx < num; dataIdx++) {
112
    data[dataIdx] = (buffer[2*dataIdx] << 8) | buffer[2*dataIdx+1];
113
  }
114
  return status;
115
}
116
117
// from alld_ina219.c
118
/**
119
 * @brief Write the value of one or more of the registers.
120
 * @param[in]   i2cd        i2c driver
121
 * @param[in]   inad        ina219 driver
122
 * @param[in]   addr        register address
123
 * @param[in]   data        data to write
124
 * @param[in]   num         number of subsequent registers to read
125
 * @param[in]   timeout     timeout
126
 * @return                  An indicator whether the call was successfull
127
 */
128
inline apalExitStatus_t
129
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)
130
{
131
  apalDbgAssert(mpu6050 != 0);
132
  apalDbgAssert(mpu6050->i2cd != 0);
133
  apalDbgAssert(data != 0);
134
135
  uint8_t buffer[1+2*num];
136
  buffer[0] = addr;
137
  for (uint8_t dataIdx = 0; dataIdx < num; dataIdx++) {
138
    buffer[dataIdx*2+1] = data[dataIdx] >> 8;
139
    buffer[dataIdx*2+2] = data[dataIdx] & (0x00FFu);
140
  }
141
  return apalI2CMasterTransmit(mpu6050->i2cd, (MPU6050_LLD_I2C_ADDR_FIXED | mpu6050->addr), buffer, 1+2*num, NULL, 0, timeout);
142
}
143
144
145
146
inline apalExitStatus_t mpu6050_get_axis_x(const MPU6050Driver* const mpu6050, const mpu6050_lld_register_t addr, const uint16_t* const data, const uint8_t num, const apalTime_t timeout)
147
{
148
149
}
150
151
#endif /* AMIROLLD_CFG_USE_MPU6050*/