This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Initialization and operation of sensor mpu6050 with nrf52840 development board

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 results are that when I am printing the gyro and accelerometer values serially on UART the values are not being printed. 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.

I am attaching the current working project inside the nRF5 SDK v15.3.0  ,Since there are certain libraries are spread across the SDK.

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.

Parents Reply Children
  • CONTENT OF 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;
    }
    
    

    CONTENT OF 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__ */
    

    CONTENT OF 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, &register_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();
        }
    		
    }
    
    /** @} */
    

Related