/**
******************************************************************************
* @file mpu6050.c
* @author Waao
* @version V1.0.0
* @date 16-Feb-2019
* @brief This file contains some board support package's functions for the MPU6050.
*
******************************************************************************
* @attention
*
* None
*
******************************************************************************
*/#include"mpu6050.h"/**
* @brief Initialize the MPU6050 through operate the register
* @param None
* @retval None
*/voidMPU6050_Init(void){int i=0,j=0;//We need wait a moment before initialize the MPU6050for(i=0;i<1000;i++){for(j=0;j<1000;j++){;}}I2C_TRANSMIT_Byte(MPU6050_RA_PWR_MGMT_1,0x00);//Breaking the sleep statusI2C_TRANSMIT_Byte(MPU6050_RA_SMPLRT_DIV ,0x07);//Configure gyroscope simple ratioI2C_TRANSMIT_Byte(MPU6050_RA_CONFIG ,0x06);I2C_TRANSMIT_Byte(MPU6050_RA_ACCEL_CONFIG ,0x01);//Configure accelerometer working in 16G modeI2C_TRANSMIT_Byte(MPU6050_RA_GYRO_CONFIG,0x18);//Gyroscope self detect and measurement scope£, typical values£: 0x18}/**
* @brief Get the ID number of the MPU6050 through read the
* value of the WHO_AM_I register.
* @param None
* @retval None
*/
uint8_t MPU6050ReadID(void){unsignedchar Re =0;I2C_BufferRead(&Re,MPU6050_RA_WHO_AM_I,1);//Read the device addressif(Re !=0x68){printf("MPU6050 dectected error!\r\n");return0;}else{printf("MPU6050 ID = %d\r\n",Re);return1;}}/**
* @brief Get the value of the accelerometer
* @param accData: The container to contain the value of the accelerometer
* @retval
*/voidMPU6050ReadAcc(short*accData){
u8 buf[6];I2C_BufferRead(buf, MPU6050_ACC_OUT,6);
accData[0]=(buf[0]<<8)| buf[1];
accData[1]=(buf[2]<<8)| buf[3];
accData[2]=(buf[4]<<8)| buf[5];}/**
* @brief Get the value of the gyroscope
* @param gyroData: The container to contain the value of the gyroscope
* @retval
*/voidMPU6050ReadGyro(short*gyroData){
u8 buf[6];I2C_BufferRead(buf,MPU6050_GYRO_OUT,6);
gyroData[0]=(buf[0]<<8)| buf[1];
gyroData[1]=(buf[2]<<8)| buf[3];
gyroData[2]=(buf[4]<<8)| buf[5];}
bsp_i2c.c
/**
* @brief Read the data from EEPROM.
* On the procedure of Reading of the data, first we should thansmit the
* start signal, address of peripherals and the address of the buffer
* just like the procedure of writting of the data. But once when we
* check the EV8 occur, we shoule thansmit the start signal and the address
* of peripherals again, but this time we should select the I2C_Direction_Receiver
* rather than the I2C_Direction_Transmitter. And then we can directly
* receive the data.
* @param pBuffer: The pointer of the buffer.
* ReadAddr: Read address.
* NumByteToRead: The number of bytes what we read.
* @retval None
*/
uint32_t I2C_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead){
timeout = TIMEOUT;while(I2C_GetFlagStatus(I2C_, I2C_FLAG_BUSY)){
timeout--;if(timeout ==0)returnTIME_OUT_CallBack(30);}I2C_GenerateSTART(I2C_, ENABLE);
timeout = TIMEOUT;while(!(I2C_CheckEvent(I2C_, I2C_EVENT_MASTER_MODE_SELECT)))// EV5{
timeout--;if(timeout ==0)returnTIME_OUT_CallBack(31);}I2C_Send7bitAddress(I2C_, MPU6050_ADDRESS <<1, I2C_Direction_Transmitter);
timeout = TIMEOUT;while(!(I2C_CheckEvent(I2C_, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)))// EV6{
timeout--;if(timeout ==0)returnTIME_OUT_CallBack(32);}I2C_Cmd(I2C_, ENABLE);// Clear the EV6I2C_SendData(I2C_, ReadAddr);
timeout = TIMEOUT;while(!(I2C_CheckEvent(I2C_, I2C_EVENT_MASTER_BYTE_TRANSMITTING)))// EV8{
timeout--;if(timeout ==0)returnTIME_OUT_CallBack(33);}//-------------------- Again ----------------------- I2C_GenerateSTART(I2C_, ENABLE);
timeout = TIMEOUT;while(!(I2C_CheckEvent(I2C_, I2C_EVENT_MASTER_MODE_SELECT)))// EV5{
timeout--;if(timeout ==0)returnTIME_OUT_CallBack(34);}I2C_Send7bitAddress(I2C_, MPU6050_ADDRESS <<1, I2C_Direction_Receiver);
timeout = TIMEOUT;while(!(I2C_CheckEvent(I2C_, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)))// EV6{
timeout--;if(timeout ==0)returnTIME_OUT_CallBack(35);}while(NumByteToRead){if(NumByteToRead ==1){I2C_AcknowledgeConfig(I2C_, DISABLE);I2C_GenerateSTOP(I2C_, ENABLE);}
timeout = LONG_TIMEOUT;while(!(I2C_CheckEvent(I2C_, I2C_EVENT_MASTER_BYTE_RECEIVED)))// EV6{
timeout--;if(timeout ==0)returnTIME_OUT_CallBack(36);}*pBuffer =I2C_ReceiveData(I2C_);
pBuffer++;
NumByteToRead--;}I2C_AcknowledgeConfig(I2C_, ENABLE);return1;}
main.c
#include<mpu6050.h>#include<bsp_usart.h>#include<bsp_led.h>#include<bsp_i2c.h>#include<bsp_systick.h>intmain(void){short acc[3]={0}, gyro[3]={0}, i =0;USART_GPIO_Config();USART1_Config();SysTick_Init();I2C_FINAL_Config();MPU6050_Init();MPU6050ReadID();while(1){MPU6050ReadAcc(acc);printf("\nThe value of accelerometer is: \n");for(i=0; i<3; i++){printf("%8d ", acc[i]);}MPU6050ReadGyro(gyro);printf("\nThe value of gyroscope is: \n");for(i=0; i<3; i++){printf("%8d ", gyro[i]);}Delay(100000);}}