I want to be able to read the gyro and accelerometer values from the MPU6050 sensor.
As a base start I downloaded the NRF5 SDK V15.3.0 and modified twi_sensor_pca10056 program using editor software Kielu5 to initialize the MPU6050. My current problem is that I am not getting correct values from the gyro and accelerometer. The problem I think is coming from the MPU6050 initialization. Because the TWI supposed to work fine since its a working project and I also tested the UART by sending some initial test strings before operating.
I modified the project by including the following MPU related libraries in the main project:
sensor_mpu6050.h
sensor_mpu6050.c
I am connecting the SCL and SDL to the following respective board pins:
SCL = MPU6050_SCL_PIN, // PIN 0.27
SDA = MPU6050_SDA_PIN, // PIN 0.26
In the main.c , I am initializing the MPU and trying to read the MPU values and displaying them on a serial terminal window using UART.
THIS IS THE main.c
/**
* Copyright (c) 2015 - 2019, Nordic Semiconductor ASA
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form, except as embedded into a Nordic
* Semiconductor ASA integrated circuit in a product or a software update for
* such product, must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* 4. This software, with or without modification, must only be used with a
* Nordic Semiconductor ASA integrated circuit.
*
* 5. Any software provided in binary form under this license must not be reverse
* engineered, decompiled, modified and/or disassembled.
*
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
/** @file
* @defgroup tw_sensor_example main.c
* @{
* @ingroup nrf_twi_example
* @brief TWI Sensor Example main file.
*
* This file contains the source code for a sample application using TWI.
*
*/
#include <stdio.h>
#include "boards.h"
#include "app_util_platform.h"
#include "app_error.h"
#include "nrf_drv_twi.h"
#include "nrf_delay.h"
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#include "sensor_mpu6050.h"
#include "nrf_pwr_mgmt.h"
#include "app_uart.h"
/* TWI instance ID. */
#define TWI_INSTANCE_ID 0
/* Common addresses definition for temperature sensor. */
#define LM75B_ADDR (0x90U >> 1) // 1001 0000 >> 1 = 0100 1000
#define LM75B_REG_TEMP 0x00U
#define LM75B_REG_CONF 0x01U
#define LM75B_REG_THYST 0x02U
#define LM75B_REG_TOS 0x03U
/* Mode for LM75B. */
#define NORMAL_MODE 0U
/* Common addresses definition for MPU6050. */
#define MPU6050_ADDR 0x
float MPU6050_Acc[3] = {0};
float MPU6050_Gyro[3] = {0};
bool i2c_write( uint8_t device_address, uint8_t register_address, uint8_t *value, uint8_t number_of_bytes );
bool i2c_read( uint8_t device_address, uint8_t register_address, uint8_t *destination, uint8_t number_of_bytes );
#define C_Output_Acc 0x61 // "a" Command: Output acc data
#define C_Output_Gyro 0x67 // "g" Command: Output gyro data
#define Output_Select_Gyro 0x01
#define Output_Select_Acc 0x00
#define Default_Zero 0x00
uint8_t StringSelect; // 1 = Output Gryo, 0 = Output Acc
char printf_buffer[256]; // Output Buffer
uint16_t length; // Output Buffer Length
/* Indicates if operation on TWI has ended. */
static volatile bool m_xfer_done = false;
/* TWI instance. */
static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);
/* Buffer for samples read from temperature sensor. */
static uint8_t m_sample;
/**
* @brief Function for setting active mode on MMA7660 accelerometer.
*/
void LM75B_set_mode(void)
{
ret_code_t err_code;
/* Writing to LM75B_REG_CONF "0" set temperature sensor in NORMAL mode. */
uint8_t reg[2] = {LM75B_REG_CONF, NORMAL_MODE};
err_code = nrf_drv_twi_tx(&m_twi, LM75B_ADDR, reg, sizeof(reg), false);
APP_ERROR_CHECK(err_code);
while (m_xfer_done == false);
/* Writing to pointer byte. */
reg[0] = LM75B_REG_TEMP;
m_xfer_done = false;
err_code = nrf_drv_twi_tx(&m_twi, LM75B_ADDR, reg, 1, false);
APP_ERROR_CHECK(err_code);
while (m_xfer_done == false);
}
/**
* @brief Function for handling data from temperature sensor.
*
* @param[in] temp Temperature in Celsius degrees read from sensor.
*/
__STATIC_INLINE void data_handler(uint8_t temp)
{
NRF_LOG_INFO("Temperature: %d Celsius degrees.", temp);
}
/**
* @brief TWI events handler.
*/
void twi_handler(nrf_drv_twi_evt_t const * p_event, void * p_context)
{
switch (p_event->type)
{
case NRF_DRV_TWI_EVT_DONE:
if (p_event->xfer_desc.type == NRF_DRV_TWI_XFER_RX)
{
data_handler(m_sample);
}
m_xfer_done = true;
break;
default:
break;
}
}
/**
* @brief UART initialization.
*/
void twi_init (void)
{
ret_code_t err_code;
const nrf_drv_twi_config_t twi_MPU6050_config = {
.scl = MPU6050_SCL_PIN, // PIN 0.27
.sda = MPU6050_SDA_PIN, // PIN 0.26
.frequency = NRF_DRV_TWI_FREQ_100K,
.interrupt_priority = APP_IRQ_PRIORITY_LOW,
.clear_bus_init = false
};
err_code = nrf_drv_twi_init(&m_twi, &twi_MPU6050_config, twi_handler, NULL);
APP_ERROR_CHECK(err_code);
nrf_drv_twi_enable(&m_twi);
}
/**
* @brief Function for reading data from temperature sensor.
*/
static void read_sensor_data()
{
m_xfer_done = false;
/* Read 1 byte from the specified address - skip 3 bits dedicated for fractional part of temperature. */
ret_code_t err_code = nrf_drv_twi_rx(&m_twi, LM75B_ADDR, &m_sample, sizeof(m_sample));
APP_ERROR_CHECK(err_code);
}
/**
* @brief Function for writing data from MPU6050 sensor.
*/
bool i2c_write(uint8_t device_address, uint8_t register_address, uint8_t *value, uint8_t number_of_bytes )
{
uint8_t w_data[number_of_bytes+1], i;
w_data[0] = register_address;
for ( i = 0 ; i < number_of_bytes ; i++ )
{
w_data[i+1] = value[i];
}
nrf_drv_twi_tx(&m_twi, (device_address)>>1, w_data, number_of_bytes+1, false);
return true;
}
/**
* @brief Function for reading data from MPU6050 sensor.
*/
bool i2c_read(uint8_t device_address, uint8_t register_address, uint8_t * destination, uint8_t number_of_bytes)
{
nrf_drv_twi_tx(&m_twi, (device_address)>>1, ®ister_address, 1, true);
nrf_drv_twi_rx(&m_twi, (device_address)>>1, destination, number_of_bytes);
return true;
}
/**@brief Function for handling the idle state (main loop).
*
* @details If there is no pending log operation, then sleep until next the next event occurs.
*/
static void idle_state_handle(void)
{
UNUSED_RETURN_VALUE(NRF_LOG_PROCESS());
nrf_pwr_mgmt_run();
}
/**
* @brief Function for main application entry.
*/
int main(void)
{
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();
NRF_LOG_INFO("\r\nTWI example started");
NRF_LOG_FLUSH();
twi_init(); //I2C Init
nrf_delay_ms(50);
MPU6050_Init(); //Sensor Init
StringSelect = 1;
length = Default_Zero;
// Enter main loop.
for (;;)
{
memset(printf_buffer, 0x00, sizeof(printf_buffer));
if(StringSelect == 1)
{ //if(StringSelect == Output_Select_Gyro)
snprintf(printf_buffer, 100, "G: %.1f; %.1f; %.1f", MPU6050_Gyro[0], MPU6050_Gyro[1], MPU6050_Gyro[2]);
}
else{
snprintf(printf_buffer,100, "A: %.1f; %.1f; %.1f", MPU6050_Acc[0], MPU6050_Acc[1], MPU6050_Acc[2]);
}
length = strlen(printf_buffer);
//uint32_t err_code = ble_nus_data_send(&m_nus, (uint8_t *)printf_buffer, &length, m_conn_handle);
nrf_delay_ms(500);
MPU6050_GetAccData(MPU6050_Acc);
nrf_delay_ms(50);
MPU6050_GetGyroData(MPU6050_Gyro);
//idle_state_handle();
NRF_LOG_FLUSH();
}
}
/** @} */
THIS IS THE sensor_mpu.c
#include "sensor_mpu6050.h"
void MPU6050_Init(void)
{
uint8_t chipid = 0;
uint8_t tmp = 0;
//reset the chip
tmp = 0x80;
i2c_write(MPU6050_I2C_ADDRESS ,MPU6050_PWR_MGMT_1, &tmp, 0x01);
for(int i=0; i<30000; i++){__ASM("nop");}
//wakeup the chip
tmp = 0x00;
i2c_write(MPU6050_I2C_ADDRESS ,MPU6050_PWR_MGMT_1, &tmp, 0x01);
//read chip id
i2c_read(MPU6050_I2C_ADDRESS ,MPU6050_WHO_AM_I, &chipid, 0x01);
for(int i=0; i<30000; i++){__ASM("nop");}
//internal 20MHz oscillator
tmp = 0x00;
i2c_write(MPU6050_I2C_ADDRESS ,MPU6050_PWR_MGMT_1, &tmp, 0x01);
//read MPU6050_PWR_MGMT_2 register
i2c_read(MPU6050_I2C_ADDRESS ,MPU6050_PWR_MGMT_2, &tmp, 0x01);
//enable acc/gyro xyz
tmp &= ~(0x38 | 0x07);
i2c_write(MPU6050_I2C_ADDRESS ,MPU6050_PWR_MGMT_2, &tmp, 0x01);
//acc +-2g
tmp = ( 0x00 << 3 );
i2c_write(MPU6050_I2C_ADDRESS ,MPU6050_ACCEL_CONFIG, &tmp, 0x01);
//gyro 2000dps
tmp = ( 0x03 << 3 );
i2c_write(MPU6050_I2C_ADDRESS ,MPU6050_GYRO_CONFIG, &tmp, 0x01);
}
void MPU6050_GetAccData(float *acc)
{
uint8_t tmp[6] = {0};
int16_t tmp_int[3] = {0};
i2c_read(MPU6050_I2C_ADDRESS ,MPU6050_ACCEL_XOUT_H, tmp, 0x06);
tmp_int[0] = (int16_t)((tmp[0]<< 8) | tmp[1]);
tmp_int[1] = (int16_t)((tmp[2]<< 8) | tmp[3]);
tmp_int[2] = (int16_t)((tmp[4]<< 8) | tmp[5]);
acc[0] = (float)(tmp_int[0]) * 0.00059854736328125f;
acc[1] = (float)(tmp_int[1]) * 0.00059854736328125f;
acc[2] = (float)(tmp_int[2]) * 0.00059854736328125f;
}
void MPU6050_GetGyroData(float *gyro)
{
uint8_t tmp[6] = {0};
int16_t tmp_int[3] = {0};
i2c_read(MPU6050_I2C_ADDRESS ,MPU6050_GYRO_XOUT_H, tmp, 0x06);
tmp_int[0] = (int16_t)((tmp[0]<< 8) | tmp[1]);
tmp_int[1] = (int16_t)((tmp[2]<< 8) | tmp[3]);
tmp_int[2] = (int16_t)((tmp[4]<< 8) | tmp[5]);
gyro[0] = (float)(tmp_int[0]) * 0.001064225153455f;
gyro[1] = (float)(tmp_int[1]) * 0.001064225153455f;
gyro[2] = (float)(tmp_int[2]) * 0.001064225153455f;
}
THIS IS THE sensor_mpu.h
#ifndef __MPU6050_H__ #define __MPU6050_H__ #include <stdio.h> #include "boards.h" #include "app_util_platform.h" #include "app_error.h" #include "nrf_drv_twi.h" #include "nrf_delay.h" #include "nrf_log.h" #include "nrf_log_ctrl.h" #include "nrf_log_default_backends.h" #define MPU6050_AUX_VDDIO 0x01 // R/W #define MPU6050_SMPLRT_DIV 0x19 // R/W #define MPU6050_CONFIG 0x1A // R/W #define MPU6050_GYRO_CONFIG 0x1B // R/W #define MPU6050_ACCEL_CONFIG 0x1C // R/W #define MPU6050_FF_THR 0x1D // R/W #define MPU6050_FF_DUR 0x1E // R/W #define MPU6050_MOT_THR 0x1F // R/W #define MPU6050_MOT_DUR 0x20 // R/W #define MPU6050_ZRMOT_THR 0x21 // R/W #define MPU6050_ZRMOT_DUR 0x22 // R/W #define MPU6050_FIFO_EN 0x23 // R/W #define MPU6050_I2C_MST_CTRL 0x24 // R/W #define MPU6050_I2C_SLV0_ADDR 0x25 // R/W #define MPU6050_I2C_SLV0_REG 0x26 // R/W #define MPU6050_I2C_SLV0_CTRL 0x27 // R/W #define MPU6050_I2C_SLV1_ADDR 0x28 // R/W #define MPU6050_I2C_SLV1_REG 0x29 // R/W #define MPU6050_I2C_SLV1_CTRL 0x2A // R/W #define MPU6050_I2C_SLV2_ADDR 0x2B // R/W #define MPU6050_I2C_SLV2_REG 0x2C // R/W #define MPU6050_I2C_SLV2_CTRL 0x2D // R/W #define MPU6050_I2C_SLV3_ADDR 0x2E // R/W #define MPU6050_I2C_SLV3_REG 0x2F // R/W #define MPU6050_I2C_SLV3_CTRL 0x30 // R/W #define MPU6050_I2C_SLV4_ADDR 0x31 // R/W #define MPU6050_I2C_SLV4_REG 0x32 // R/W #define MPU6050_I2C_SLV4_DO 0x33 // R/W #define MPU6050_I2C_SLV4_CTRL 0x34 // R/W #define MPU6050_I2C_SLV4_DI 0x35 // R #define MPU6050_I2C_MST_STATUS 0x36 // R #define MPU6050_INT_PIN_CFG 0x37 // R/W #define MPU6050_INT_ENABLE 0x38 // R/W #define MPU6050_INT_STATUS 0x3A // R #define MPU6050_ACCEL_XOUT_H 0x3B // R #define MPU6050_ACCEL_XOUT_L 0x3C // R #define MPU6050_ACCEL_YOUT_H 0x3D // R #define MPU6050_ACCEL_YOUT_L 0x3E // R #define MPU6050_ACCEL_ZOUT_H 0x3F // R #define MPU6050_ACCEL_ZOUT_L 0x40 // R #define MPU6050_TEMP_OUT_H 0x41 // R #define MPU6050_TEMP_OUT_L 0x42 // R #define MPU6050_GYRO_XOUT_H 0x43 // R #define MPU6050_GYRO_XOUT_L 0x44 // R #define MPU6050_GYRO_YOUT_H 0x45 // R #define MPU6050_GYRO_YOUT_L 0x46 // R #define MPU6050_GYRO_ZOUT_H 0x47 // R #define MPU6050_GYRO_ZOUT_L 0x48 // R #define MPU6050_EXT_SENS_DATA_00 0x49 // R #define MPU6050_EXT_SENS_DATA_01 0x4A // R #define MPU6050_EXT_SENS_DATA_02 0x4B // R #define MPU6050_EXT_SENS_DATA_03 0x4C // R #define MPU6050_EXT_SENS_DATA_04 0x4D // R #define MPU6050_EXT_SENS_DATA_05 0x4E // R #define MPU6050_EXT_SENS_DATA_06 0x4F // R #define MPU6050_EXT_SENS_DATA_07 0x50 // R #define MPU6050_EXT_SENS_DATA_08 0x51 // R #define MPU6050_EXT_SENS_DATA_09 0x52 // R #define MPU6050_EXT_SENS_DATA_10 0x53 // R #define MPU6050_EXT_SENS_DATA_11 0x54 // R #define MPU6050_EXT_SENS_DATA_12 0x55 // R #define MPU6050_EXT_SENS_DATA_13 0x56 // R #define MPU6050_EXT_SENS_DATA_14 0x57 // R #define MPU6050_EXT_SENS_DATA_15 0x58 // R #define MPU6050_EXT_SENS_DATA_16 0x59 // R #define MPU6050_EXT_SENS_DATA_17 0x5A // R #define MPU6050_EXT_SENS_DATA_18 0x5B // R #define MPU6050_EXT_SENS_DATA_19 0x5C // R #define MPU6050_EXT_SENS_DATA_20 0x5D // R #define MPU6050_EXT_SENS_DATA_21 0x5E // R #define MPU6050_EXT_SENS_DATA_22 0x5F // R #define MPU6050_EXT_SENS_DATA_23 0x60 // R #define MPU6050_MOT_DETECT_STATUS 0x61 // R #define MPU6050_I2C_SLV0_DO 0x63 // R/W #define MPU6050_I2C_SLV1_DO 0x64 // R/W #define MPU6050_I2C_SLV2_DO 0x65 // R/W #define MPU6050_I2C_SLV3_DO 0x66 // R/W #define MPU6050_I2C_MST_DELAY_CTRL 0x67 // R/W #define MPU6050_SIGNAL_PATH_RESET 0x68 // R/W #define MPU6050_MOT_DETECT_CTRL 0x69 // R/W #define MPU6050_USER_CTRL 0x6A // R/W #define MPU6050_PWR_MGMT_1 0x6B // R/W #define MPU6050_PWR_MGMT_2 0x6C // R/W #define MPU6050_FIFO_COUNTH 0x72 // R/W #define MPU6050_FIFO_COUNTL 0x73 // R/W #define MPU6050_FIFO_R_W 0x74 // R/W #define MPU6050_WHO_AM_I 0x75 // R #define MPU6050_D0 0 #define MPU6050_D1 1 #define MPU6050_D2 2 #define MPU6050_D3 3 #define MPU6050_D4 4 #define MPU6050_D5 5 #define MPU6050_D6 6 #define MPU6050_D7 7 // AUX_VDDIO Register //#define MPU6050_AUX_VDDIO MPU6050_D7 // I2C high: 1=VDD, 0=VLOGIC // CONFIG Register // DLPF is Digital Low Pass Filter for both gyro and accelerometers. // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_DLPF_CFG0 MPU6050_D0 #define MPU6050_DLPF_CFG1 MPU6050_D1 #define MPU6050_DLPF_CFG2 MPU6050_D2 #define MPU6050_EXT_SYNC_SET0 MPU6050_D3 #define MPU6050_EXT_SYNC_SET1 MPU6050_D4 #define MPU6050_EXT_SYNC_SET2 MPU6050_D5 // Combined definitions for the EXT_SYNC_SET values #define MPU6050_EXT_SYNC_SET_0 (0) #define MPU6050_EXT_SYNC_SET_1 (bit(MPU6050_EXT_SYNC_SET0)) #define MPU6050_EXT_SYNC_SET_2 (bit(MPU6050_EXT_SYNC_SET1)) #define MPU6050_EXT_SYNC_SET_3 (bit(MPU6050_EXT_SYNC_SET1)|bit(MPU6050_EXT_SYNC_SET0)) #define MPU6050_EXT_SYNC_SET_4 (bit(MPU6050_EXT_SYNC_SET2)) #define MPU6050_EXT_SYNC_SET_5 (bit(MPU6050_EXT_SYNC_SET2)|bit(MPU6050_EXT_SYNC_SET0)) #define MPU6050_EXT_SYNC_SET_6 (bit(MPU6050_EXT_SYNC_SET2)|bit(MPU6050_EXT_SYNC_SET1)) #define MPU6050_EXT_SYNC_SET_7 (bit(MPU6050_EXT_SYNC_SET2)|bit(MPU6050_EXT_SYNC_SET1)|bit(MPU6050_EXT_SYNC_SET0)) // Alternative names for the combined definitions. #define MPU6050_EXT_SYNC_DISABLED MPU6050_EXT_SYNC_SET_0 #define MPU6050_EXT_SYNC_TEMP_OUT_L MPU6050_EXT_SYNC_SET_1 #define MPU6050_EXT_SYNC_GYRO_XOUT_L MPU6050_EXT_SYNC_SET_2 #define MPU6050_EXT_SYNC_GYRO_YOUT_L MPU6050_EXT_SYNC_SET_3 #define MPU6050_EXT_SYNC_GYRO_ZOUT_L MPU6050_EXT_SYNC_SET_4 #define MPU6050_EXT_SYNC_ACCEL_XOUT_L MPU6050_EXT_SYNC_SET_5 #define MPU6050_EXT_SYNC_ACCEL_YOUT_L MPU6050_EXT_SYNC_SET_6 #define MPU6050_EXT_SYNC_ACCEL_ZOUT_L MPU6050_EXT_SYNC_SET_7 // Combined definitions for the DLPF_CFG values #define MPU6050_DLPF_CFG_0 (0) #define MPU6050_DLPF_CFG_1 (bit(MPU6050_DLPF_CFG0)) #define MPU6050_DLPF_CFG_2 (bit(MPU6050_DLPF_CFG1)) #define MPU6050_DLPF_CFG_3 (bit(MPU6050_DLPF_CFG1)|bit(MPU6050_DLPF_CFG0)) #define MPU6050_DLPF_CFG_4 (bit(MPU6050_DLPF_CFG2)) #define MPU6050_DLPF_CFG_5 (bit(MPU6050_DLPF_CFG2)|bit(MPU6050_DLPF_CFG0)) #define MPU6050_DLPF_CFG_6 (bit(MPU6050_DLPF_CFG2)|bit(MPU6050_DLPF_CFG1)) #define MPU6050_DLPF_CFG_7 (bit(MPU6050_DLPF_CFG2)|bit(MPU6050_DLPF_CFG1)|bit(MPU6050_DLPF_CFG0)) // Alternative names for the combined definitions // This name uses the bandwidth (Hz) for the accelometer, // for the gyro the bandwidth is almost the same. #define MPU6050_DLPF_260HZ MPU6050_DLPF_CFG_0 #define MPU6050_DLPF_184HZ MPU6050_DLPF_CFG_1 #define MPU6050_DLPF_94HZ MPU6050_DLPF_CFG_2 #define MPU6050_DLPF_44HZ MPU6050_DLPF_CFG_3 #define MPU6050_DLPF_21HZ MPU6050_DLPF_CFG_4 #define MPU6050_DLPF_10HZ MPU6050_DLPF_CFG_5 #define MPU6050_DLPF_5HZ MPU6050_DLPF_CFG_6 #define MPU6050_DLPF_RESERVED MPU6050_DLPF_CFG_7 // GYRO_CONFIG Register // The XG_ST, YG_ST, ZG_ST are bits for selftest. // The FS_SEL sets the range for the gyro. // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_FS_SEL0 MPU6050_D3 #define MPU6050_FS_SEL1 MPU6050_D4 #define MPU6050_ZG_ST MPU6050_D5 #define MPU6050_YG_ST MPU6050_D6 #define MPU6050_XG_ST MPU6050_D7 // Combined definitions for the FS_SEL values #define MPU6050_FS_SEL_0 (0) #define MPU6050_FS_SEL_1 (bit(MPU6050_FS_SEL0)) #define MPU6050_FS_SEL_2 (bit(MPU6050_FS_SEL1)) #define MPU6050_FS_SEL_3 (bit(MPU6050_FS_SEL1)|bit(MPU6050_FS_SEL0)) // Alternative names for the combined definitions // The name uses the range in degrees per second. #define MPU6050_FS_SEL_250 MPU6050_FS_SEL_0 #define MPU6050_FS_SEL_500 MPU6050_FS_SEL_1 #define MPU6050_FS_SEL_1000 MPU6050_FS_SEL_2 #define MPU6050_FS_SEL_2000 MPU6050_FS_SEL_3 // ACCEL_CONFIG Register // The XA_ST, YA_ST, ZA_ST are bits for selftest. // The AFS_SEL sets the range for the accelerometer. // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_ACCEL_HPF0 MPU6050_D0 #define MPU6050_ACCEL_HPF1 MPU6050_D1 #define MPU6050_ACCEL_HPF2 MPU6050_D2 #define MPU6050_AFS_SEL0 MPU6050_D3 #define MPU6050_AFS_SEL1 MPU6050_D4 #define MPU6050_ZA_ST MPU6050_D5 #define MPU6050_YA_ST MPU6050_D6 #define MPU6050_XA_ST MPU6050_D7 // Combined definitions for the ACCEL_HPF values #define MPU6050_ACCEL_HPF_0 (0) #define MPU6050_ACCEL_HPF_1 (bit(MPU6050_ACCEL_HPF0)) #define MPU6050_ACCEL_HPF_2 (bit(MPU6050_ACCEL_HPF1)) #define MPU6050_ACCEL_HPF_3 (bit(MPU6050_ACCEL_HPF1)|bit(MPU6050_ACCEL_HPF0)) #define MPU6050_ACCEL_HPF_4 (bit(MPU6050_ACCEL_HPF2)) #define MPU6050_ACCEL_HPF_7 (bit(MPU6050_ACCEL_HPF2)|bit(MPU6050_ACCEL_HPF1)|bit(MPU6050_ACCEL_HPF0)) // Alternative names for the combined definitions // The name uses the Cut-off frequency. #define MPU6050_ACCEL_HPF_RESET MPU6050_ACCEL_HPF_0 #define MPU6050_ACCEL_HPF_5HZ MPU6050_ACCEL_HPF_1 #define MPU6050_ACCEL_HPF_2_5HZ MPU6050_ACCEL_HPF_2 #define MPU6050_ACCEL_HPF_1_25HZ MPU6050_ACCEL_HPF_3 #define MPU6050_ACCEL_HPF_0_63HZ MPU6050_ACCEL_HPF_4 #define MPU6050_ACCEL_HPF_HOLD MPU6050_ACCEL_HPF_7 // Combined definitions for the AFS_SEL values #define MPU6050_AFS_SEL_0 (0) #define MPU6050_AFS_SEL_1 (bit(MPU6050_AFS_SEL0)) #define MPU6050_AFS_SEL_2 (bit(MPU6050_AFS_SEL1)) #define MPU6050_AFS_SEL_3 (bit(MPU6050_AFS_SEL1)|bit(MPU6050_AFS_SEL0)) // Alternative names for the combined definitions // The name uses the full scale range for the accelerometer. #define MPU6050_AFS_SEL_2G MPU6050_AFS_SEL_0 #define MPU6050_AFS_SEL_4G MPU6050_AFS_SEL_1 #define MPU6050_AFS_SEL_8G MPU6050_AFS_SEL_2 #define MPU6050_AFS_SEL_16G MPU6050_AFS_SEL_3 // FIFO_EN Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_SLV0_FIFO_EN MPU6050_D0 #define MPU6050_SLV1_FIFO_EN MPU6050_D1 #define MPU6050_SLV2_FIFO_EN MPU6050_D2 #define MPU6050_ACCEL_FIFO_EN MPU6050_D3 #define MPU6050_ZG_FIFO_EN MPU6050_D4 #define MPU6050_YG_FIFO_EN MPU6050_D5 #define MPU6050_XG_FIFO_EN MPU6050_D6 #define MPU6050_TEMP_FIFO_EN MPU6050_D7 // I2C_MST_CTRL Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_MST_CLK0 MPU6050_D0 #define MPU6050_I2C_MST_CLK1 MPU6050_D1 #define MPU6050_I2C_MST_CLK2 MPU6050_D2 #define MPU6050_I2C_MST_CLK3 MPU6050_D3 #define MPU6050_I2C_MST_P_NSR MPU6050_D4 #define MPU6050_SLV_3_FIFO_EN MPU6050_D5 #define MPU6050_WAIT_FOR_ES MPU6050_D6 #define MPU6050_MULT_MST_EN MPU6050_D7 // Combined definitions for the I2C_MST_CLK #define MPU6050_I2C_MST_CLK_0 (0) #define MPU6050_I2C_MST_CLK_1 (bit(MPU6050_I2C_MST_CLK0)) #define MPU6050_I2C_MST_CLK_2 (bit(MPU6050_I2C_MST_CLK1)) #define MPU6050_I2C_MST_CLK_3 (bit(MPU6050_I2C_MST_CLK1)|bit(MPU6050_I2C_MST_CLK0)) #define MPU6050_I2C_MST_CLK_4 (bit(MPU6050_I2C_MST_CLK2)) #define MPU6050_I2C_MST_CLK_5 (bit(MPU6050_I2C_MST_CLK2)|bit(MPU6050_I2C_MST_CLK0)) #define MPU6050_I2C_MST_CLK_6 (bit(MPU6050_I2C_MST_CLK2)|bit(MPU6050_I2C_MST_CLK1)) #define MPU6050_I2C_MST_CLK_7 (bit(MPU6050_I2C_MST_CLK2)|bit(MPU6050_I2C_MST_CLK1)|bit(MPU6050_I2C_MST_CLK0)) #define MPU6050_I2C_MST_CLK_8 (bit(MPU6050_I2C_MST_CLK3)) #define MPU6050_I2C_MST_CLK_9 (bit(MPU6050_I2C_MST_CLK3)|bit(MPU6050_I2C_MST_CLK0)) #define MPU6050_I2C_MST_CLK_10 (bit(MPU6050_I2C_MST_CLK3)|bit(MPU6050_I2C_MST_CLK1)) #define MPU6050_I2C_MST_CLK_11 (bit(MPU6050_I2C_MST_CLK3)|bit(MPU6050_I2C_MST_CLK1)|bit(MPU6050_I2C_MST_CLK0)) #define MPU6050_I2C_MST_CLK_12 (bit(MPU6050_I2C_MST_CLK3)|bit(MPU6050_I2C_MST_CLK2)) #define MPU6050_I2C_MST_CLK_13 (bit(MPU6050_I2C_MST_CLK3)|bit(MPU6050_I2C_MST_CLK2)|bit(MPU6050_I2C_MST_CLK0)) #define MPU6050_I2C_MST_CLK_14 (bit(MPU6050_I2C_MST_CLK3)|bit(MPU6050_I2C_MST_CLK2)|bit(MPU6050_I2C_MST_CLK1)) #define MPU6050_I2C_MST_CLK_15 (bit(MPU6050_I2C_MST_CLK3)|bit(MPU6050_I2C_MST_CLK2)|bit(MPU6050_I2C_MST_CLK1)|bit(MPU6050_I2C_MST_CLK0)) // Alternative names for the combined definitions // The names uses I2C Master Clock Speed in kHz. #define MPU6050_I2C_MST_CLK_348KHZ MPU6050_I2C_MST_CLK_0 #define MPU6050_I2C_MST_CLK_333KHZ MPU6050_I2C_MST_CLK_1 #define MPU6050_I2C_MST_CLK_320KHZ MPU6050_I2C_MST_CLK_2 #define MPU6050_I2C_MST_CLK_308KHZ MPU6050_I2C_MST_CLK_3 #define MPU6050_I2C_MST_CLK_296KHZ MPU6050_I2C_MST_CLK_4 #define MPU6050_I2C_MST_CLK_286KHZ MPU6050_I2C_MST_CLK_5 #define MPU6050_I2C_MST_CLK_276KHZ MPU6050_I2C_MST_CLK_6 #define MPU6050_I2C_MST_CLK_267KHZ MPU6050_I2C_MST_CLK_7 #define MPU6050_I2C_MST_CLK_258KHZ MPU6050_I2C_MST_CLK_8 #define MPU6050_I2C_MST_CLK_500KHZ MPU6050_I2C_MST_CLK_9 #define MPU6050_I2C_MST_CLK_471KHZ MPU6050_I2C_MST_CLK_10 #define MPU6050_I2C_MST_CLK_444KHZ MPU6050_I2C_MST_CLK_11 #define MPU6050_I2C_MST_CLK_421KHZ MPU6050_I2C_MST_CLK_12 #define MPU6050_I2C_MST_CLK_400KHZ MPU6050_I2C_MST_CLK_13 #define MPU6050_I2C_MST_CLK_381KHZ MPU6050_I2C_MST_CLK_14 #define MPU6050_I2C_MST_CLK_364KHZ MPU6050_I2C_MST_CLK_15 // I2C_SLV0_ADDR Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_SLV0_RW MPU6050_D7 // I2C_SLV0_CTRL Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_SLV0_LEN0 MPU6050_D0 #define MPU6050_I2C_SLV0_LEN1 MPU6050_D1 #define MPU6050_I2C_SLV0_LEN2 MPU6050_D2 #define MPU6050_I2C_SLV0_LEN3 MPU6050_D3 #define MPU6050_I2C_SLV0_GRP MPU6050_D4 #define MPU6050_I2C_SLV0_REG_DIS MPU6050_D5 #define MPU6050_I2C_SLV0_BYTE_SW MPU6050_D6 #define MPU6050_I2C_SLV0_EN MPU6050_D7 // A mask for the length #define MPU6050_I2C_SLV0_LEN_MASK 0x0F // I2C_SLV1_ADDR Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_SLV1_RW MPU6050_D7 // I2C_SLV1_CTRL Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_SLV1_LEN0 MPU6050_D0 #define MPU6050_I2C_SLV1_LEN1 MPU6050_D1 #define MPU6050_I2C_SLV1_LEN2 MPU6050_D2 #define MPU6050_I2C_SLV1_LEN3 MPU6050_D3 #define MPU6050_I2C_SLV1_GRP MPU6050_D4 #define MPU6050_I2C_SLV1_REG_DIS MPU6050_D5 #define MPU6050_I2C_SLV1_BYTE_SW MPU6050_D6 #define MPU6050_I2C_SLV1_EN MPU6050_D7 // A mask for the length #define MPU6050_I2C_SLV1_LEN_MASK 0x0F // I2C_SLV2_ADDR Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_SLV2_RW MPU6050_D7 // I2C_SLV2_CTRL Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_SLV2_LEN0 MPU6050_D0 #define MPU6050_I2C_SLV2_LEN1 MPU6050_D1 #define MPU6050_I2C_SLV2_LEN2 MPU6050_D2 #define MPU6050_I2C_SLV2_LEN3 MPU6050_D3 #define MPU6050_I2C_SLV2_GRP MPU6050_D4 #define MPU6050_I2C_SLV2_REG_DIS MPU6050_D5 #define MPU6050_I2C_SLV2_BYTE_SW MPU6050_D6 #define MPU6050_I2C_SLV2_EN MPU6050_D7 // A mask for the length #define MPU6050_I2C_SLV2_LEN_MASK 0x0F // I2C_SLV3_ADDR Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_SLV3_RW MPU6050_D7 // I2C_SLV3_CTRL Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_SLV3_LEN0 MPU6050_D0 #define MPU6050_I2C_SLV3_LEN1 MPU6050_D1 #define MPU6050_I2C_SLV3_LEN2 MPU6050_D2 #define MPU6050_I2C_SLV3_LEN3 MPU6050_D3 #define MPU6050_I2C_SLV3_GRP MPU6050_D4 #define MPU6050_I2C_SLV3_REG_DIS MPU6050_D5 #define MPU6050_I2C_SLV3_BYTE_SW MPU6050_D6 #define MPU6050_I2C_SLV3_EN MPU6050_D7 // A mask for the length #define MPU6050_I2C_SLV3_LEN_MASK 0x0F // I2C_SLV4_ADDR Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_SLV4_RW MPU6050_D7 // I2C_SLV4_CTRL Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_MST_DLY0 MPU6050_D0 #define MPU6050_I2C_MST_DLY1 MPU6050_D1 #define MPU6050_I2C_MST_DLY2 MPU6050_D2 #define MPU6050_I2C_MST_DLY3 MPU6050_D3 #define MPU6050_I2C_MST_DLY4 MPU6050_D4 #define MPU6050_I2C_SLV4_REG_DIS MPU6050_D5 #define MPU6050_I2C_SLV4_INT_EN MPU6050_D6 #define MPU6050_I2C_SLV4_EN MPU6050_D7 // A mask for the delay #define MPU6050_I2C_MST_DLY_MASK 0x1F // I2C_MST_STATUS Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_SLV0_NACK MPU6050_D0 #define MPU6050_I2C_SLV1_NACK MPU6050_D1 #define MPU6050_I2C_SLV2_NACK MPU6050_D2 #define MPU6050_I2C_SLV3_NACK MPU6050_D3 #define MPU6050_I2C_SLV4_NACK MPU6050_D4 #define MPU6050_I2C_LOST_ARB MPU6050_D5 #define MPU6050_I2C_SLV4_DONE MPU6050_D6 #define MPU6050_PASS_THROUGH MPU6050_D7 // I2C_PIN_CFG Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_CLKOUT_EN MPU6050_D0 #define MPU6050_I2C_BYPASS_EN MPU6050_D1 #define MPU6050_FSYNC_INT_EN MPU6050_D2 #define MPU6050_FSYNC_INT_LEVEL MPU6050_D3 #define MPU6050_INT_RD_CLEAR MPU6050_D4 #define MPU6050_LATCH_INT_EN MPU6050_D5 #define MPU6050_INT_OPEN MPU6050_D6 #define MPU6050_INT_LEVEL MPU6050_D7 // INT_ENABLE Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_DATA_RDY_EN MPU6050_D0 #define MPU6050_I2C_MST_INT_EN MPU6050_D3 #define MPU6050_FIFO_OFLOW_EN MPU6050_D4 #define MPU6050_ZMOT_EN MPU6050_D5 #define MPU6050_MOT_EN MPU6050_D6 #define MPU6050_FF_EN MPU6050_D7 // INT_STATUS Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_DATA_RDY_INT MPU6050_D0 #define MPU6050_I2C_MST_INT MPU6050_D3 #define MPU6050_FIFO_OFLOW_INT MPU6050_D4 #define MPU6050_ZMOT_INT MPU6050_D5 #define MPU6050_MOT_INT MPU6050_D6 #define MPU6050_FF_INT MPU6050_D7 // MOT_DETECT_STATUS Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_MOT_ZRMOT MPU6050_D0 #define MPU6050_MOT_ZPOS MPU6050_D2 #define MPU6050_MOT_ZNEG MPU6050_D3 #define MPU6050_MOT_YPOS MPU6050_D4 #define MPU6050_MOT_YNEG MPU6050_D5 #define MPU6050_MOT_XPOS MPU6050_D6 #define MPU6050_MOT_XNEG MPU6050_D7 // IC2_MST_DELAY_CTRL Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_I2C_SLV0_DLY_EN MPU6050_D0 #define MPU6050_I2C_SLV1_DLY_EN MPU6050_D1 #define MPU6050_I2C_SLV2_DLY_EN MPU6050_D2 #define MPU6050_I2C_SLV3_DLY_EN MPU6050_D3 #define MPU6050_I2C_SLV4_DLY_EN MPU6050_D4 #define MPU6050_DELAY_ES_SHADOW MPU6050_D7 // SIGNAL_PATH_RESET Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_TEMP_RESET MPU6050_D0 #define MPU6050_ACCEL_RESET MPU6050_D1 #define MPU6050_GYRO_RESET MPU6050_D2 // MOT_DETECT_CTRL Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_MOT_COUNT0 MPU6050_D0 #define MPU6050_MOT_COUNT1 MPU6050_D1 #define MPU6050_FF_COUNT0 MPU6050_D2 #define MPU6050_FF_COUNT1 MPU6050_D3 #define MPU6050_ACCEL_ON_DELAY0 MPU6050_D4 #define MPU6050_ACCEL_ON_DELAY1 MPU6050_D5 // Combined definitions for the MOT_COUNT #define MPU6050_MOT_COUNT_0 (0) #define MPU6050_MOT_COUNT_1 (bit(MPU6050_MOT_COUNT0)) #define MPU6050_MOT_COUNT_2 (bit(MPU6050_MOT_COUNT1)) #define MPU6050_MOT_COUNT_3 (bit(MPU6050_MOT_COUNT1)|bit(MPU6050_MOT_COUNT0)) // Alternative names for the combined definitions #define MPU6050_MOT_COUNT_RESET MPU6050_MOT_COUNT_0 // Combined definitions for the FF_COUNT #define MPU6050_FF_COUNT_0 (0) #define MPU6050_FF_COUNT_1 (bit(MPU6050_FF_COUNT0)) #define MPU6050_FF_COUNT_2 (bit(MPU6050_FF_COUNT1)) #define MPU6050_FF_COUNT_3 (bit(MPU6050_FF_COUNT1)|bit(MPU6050_FF_COUNT0)) // Alternative names for the combined definitions #define MPU6050_FF_COUNT_RESET MPU6050_FF_COUNT_0 // Combined definitions for the ACCEL_ON_DELAY #define MPU6050_ACCEL_ON_DELAY_0 (0) #define MPU6050_ACCEL_ON_DELAY_1 (bit(MPU6050_ACCEL_ON_DELAY0)) #define MPU6050_ACCEL_ON_DELAY_2 (bit(MPU6050_ACCEL_ON_DELAY1)) #define MPU6050_ACCEL_ON_DELAY_3 (bit(MPU6050_ACCEL_ON_DELAY1)|bit(MPU6050_ACCEL_ON_DELAY0)) // Alternative names for the ACCEL_ON_DELAY #define MPU6050_ACCEL_ON_DELAY_0MS MPU6050_ACCEL_ON_DELAY_0 #define MPU6050_ACCEL_ON_DELAY_1MS MPU6050_ACCEL_ON_DELAY_1 #define MPU6050_ACCEL_ON_DELAY_2MS MPU6050_ACCEL_ON_DELAY_2 #define MPU6050_ACCEL_ON_DELAY_3MS MPU6050_ACCEL_ON_DELAY_3 // USER_CTRL Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_SIG_COND_RESET MPU6050_D0 #define MPU6050_I2C_MST_RESET MPU6050_D1 #define MPU6050_FIFO_RESET MPU6050_D2 #define MPU6050_I2C_IF_DIS MPU6050_D4 // must be 0 for MPU-6050 #define MPU6050_I2C_MST_EN MPU6050_D5 //#define MPU6050_FIFO_EN MPU6050_D6 // PWR_MGMT_1 Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_CLKSEL0 MPU6050_D0 #define MPU6050_CLKSEL1 MPU6050_D1 #define MPU6050_CLKSEL2 MPU6050_D2 #define MPU6050_TEMP_DIS MPU6050_D3 // 1: disable temperature sensor #define MPU6050_CYCLE MPU6050_D5 // 1: sample and sleep #define MPU6050_SLEEP MPU6050_D6 // 1: sleep mode #define MPU6050_DEVICE_RESET MPU6050_D7 // 1: reset to default values // Combined definitions for the CLKSEL #define MPU6050_CLKSEL_0 (0) #define MPU6050_CLKSEL_1 (bit(MPU6050_CLKSEL0)) #define MPU6050_CLKSEL_2 (bit(MPU6050_CLKSEL1)) #define MPU6050_CLKSEL_3 (bit(MPU6050_CLKSEL1)|bit(MPU6050_CLKSEL0)) #define MPU6050_CLKSEL_4 (bit(MPU6050_CLKSEL2)) #define MPU6050_CLKSEL_5 (bit(MPU6050_CLKSEL2)|bit(MPU6050_CLKSEL0)) #define MPU6050_CLKSEL_6 (bit(MPU6050_CLKSEL2)|bit(MPU6050_CLKSEL1)) #define MPU6050_CLKSEL_7 (bit(MPU6050_CLKSEL2)|bit(MPU6050_CLKSEL1)|bit(MPU6050_CLKSEL0)) // Alternative names for the combined definitions #define MPU6050_CLKSEL_INTERNAL MPU6050_CLKSEL_0 #define MPU6050_CLKSEL_X MPU6050_CLKSEL_1 #define MPU6050_CLKSEL_Y MPU6050_CLKSEL_2 #define MPU6050_CLKSEL_Z MPU6050_CLKSEL_3 #define MPU6050_CLKSEL_EXT_32KHZ MPU6050_CLKSEL_4 #define MPU6050_CLKSEL_EXT_19_2MHZ MPU6050_CLKSEL_5 #define MPU6050_CLKSEL_RESERVED MPU6050_CLKSEL_6 #define MPU6050_CLKSEL_STOP MPU6050_CLKSEL_7 // PWR_MGMT_2 Register // These are the names for the bits. // Use these only with the bit() macro. #define MPU6050_STBY_ZG MPU6050_D0 #define MPU6050_STBY_YG MPU6050_D1 #define MPU6050_STBY_XG MPU6050_D2 #define MPU6050_STBY_ZA MPU6050_D3 #define MPU6050_STBY_YA MPU6050_D4 #define MPU6050_STBY_XA MPU6050_D5 #define MPU6050_LP_WAKE_CTRL0 MPU6050_D6 #define MPU6050_LP_WAKE_CTRL1 MPU6050_D7 // Combined definitions for the LP_WAKE_CTRL #define MPU6050_LP_WAKE_CTRL_0 (0) #define MPU6050_LP_WAKE_CTRL_1 (bit(MPU6050_LP_WAKE_CTRL0)) #define MPU6050_LP_WAKE_CTRL_2 (bit(MPU6050_LP_WAKE_CTRL1)) #define MPU6050_LP_WAKE_CTRL_3 (bit(MPU6050_LP_WAKE_CTRL1)|bit(MPU6050_LP_WAKE_CTRL0)) // Alternative names for the combined definitions // The names uses the Wake-up Frequency. #define MPU6050_LP_WAKE_1_25HZ MPU6050_LP_WAKE_CTRL_0 #define MPU6050_LP_WAKE_2_5HZ MPU6050_LP_WAKE_CTRL_1 #define MPU6050_LP_WAKE_5HZ MPU6050_LP_WAKE_CTRL_2 #define MPU6050_LP_WAKE_10HZ MPU6050_LP_WAKE_CTRL_3 // Default I2C address for the MPU-6050 is 0x68. // But only if the AD0 pin is low. // Some sensor boards have AD0 high, and the // I2C address thus becomes 0xD1. #define MPU6050_I2C_ADDRESS 0xD0 void MPU6050_Init(void); void MPU6050_GetAccData(float *acc); void MPU6050_GetGyroData(float *gyro); extern bool i2c_write( uint8_t device_address, uint8_t register_address, uint8_t *value, uint8_t number_of_bytes ); extern bool i2c_read( uint8_t device_address, uint8_t register_address, uint8_t *destination, uint8_t number_of_bytes ); #endif /* __MPU6050_H__ */
I am attaching the current working project main program and the added mpu libraries, the complete project is inside NRF5 v15.3.0 , I left it there since there are certain libraries that are spread across the SDK.
Link to programs (main.c , sensor_mpu.c , sensor_mpu.h)
Document path link to current working project : nRF5_SDK_15.3.0_59ac345\examples\peripheral\twi_sensor\pca10056\blank\arm5_no_packs
I would appreciate someone's help since I'm new to this type of technology, don't hesitate to ask for more information.