STM32 模拟 IIC 读取 MPU6050 程序实现

先点赞,再看博客,顺便点个关注鼓励一下。
如果文章看完,觉得不错的话可以点个收藏,日后不迷路。

此程序是博主几年前写的,有读者问,就整理发出来了;IIC 驱动和源代码文件可以去我的博客资源免费下载
有的程序语句没有注释,不懂或有问题的可以在下面留言。

STM32 模拟 IIC 读取 MPU6050 程序实现

1 前言

    准备工作:

  1. STM32 开发板 (本程序虽是基于STM32F407VGT6写的,但是全平台可用,只需更改相关宏定义)
  2. MPU6050

2 程序设计

1.1 C 文件

/******************************************************************\
**	本程序只供学习使用,未经作者许可,不得用于其它任何用途		      **
**																  **
**	硬件平台:STM32F407VGT6					                      **
**	开发环境:MDK-ARM( 5.14 )									  **
**																  **
**	作    者:Brendon Tan										  **
**	完成日期:2016.11.30										      **
**																  **
**	文件名称:mpu6050.c											  **
**	文件说明:MPU6050 读取驱动									  **
**																  **
**	Copyright(C) 2016-2026,@Brendon_Tan				              **
\******************************************************************/

#include "mpu6050.h"


unsigned char MPU6050_Buffer[14];


/* MPU6050 Init Configuration */
void MPU6050_Init(void)
{
	IIC_Init();
	
	MPU6050_Set_DeviceReset(Enable);				// RST
	delay_ms(100);
	MPU6050_Set_DeviceReset(Disable);
	MPU6050_Set_SleepMode(Disable);					// WAKE
	delay_ms(10);
	MPU6050_Set_Clock(MPU6050_CLOCK_PLL_ZGYRO);		// CLOCK
	delay_ms(10);
	MPU6050_Set_GyroRange(MPU6050_GYRO_FS_2000);	// ±2000°/s
	delay_ms(10);
	MPU6050_Set_AccelRange(MPU6050_ACCEL_FS_4);		// ±4G
	delay_ms(10);
	MPU6050_Set_DLPF(MPU6050_DLPF_BW_42);			// 42Hz DLPF
	delay_ms(10);
	MPU6050_Set_SmplrtDiv(1);						// 1000Hz
	delay_ms(10);
	MPU6050_Write_REG(MPU6050_PWR_MGMT_2_REG, 0X00);//GYRO and ACCEL Output
	delay_ms(10);
	MPU6050_Set_IICMasterMode(Disable);				// DISEN IIC Master Mode
	delay_ms(10);
	MPU6050_Set_IICBypassMode(Enable);				// MCU could Ask IIC
	delay_ms(10);
}


/* Read Gyro and Accel Data from MPU6050	*/
void MPU6050_Read(void)
{
	MPU6050_Read_nData(MPU6050_ACCEL_XOUT_H_REG, MPU6050_Buffer, 14);
}


/* Write REG Data to MPU6050				*/
/* reg_addr:		寄存器地址				*/
/* write_data:		写入指令数据			    */
void MPU6050_Write_REG(unsigned char reg_addr, unsigned char write_data)
{
	IIC_Write_Data(MPU6050_ADDR, reg_addr, write_data);
}


/* Read n REG Data from MPU6050				*/
/* reg_addr:		寄存器地址				*/
/* *buf:			读取数据数组			    */
/* num:				读取数据数量			    */
void MPU6050_Read_nData(unsigned char reg_addr, unsigned char *buf, unsigned char num)
{
	IIC_Read_nData(MPU6050_ADDR, reg_addr, num, &(*buf));
}


/* Write One Bit Data to MPU6050 REG Data	*/
/* reg_addr:		寄存器地址				*/
/* bit_num:			写入位的序号(第几位)	    */
/* bit_data:		写入位的数据(0/1)		*/
void MPU6050_Write_Bit(unsigned char reg_addr, unsigned int bit_num, unsigned char bit_data)
{
	IIC_Write_Bit(MPU6050_ADDR, reg_addr, bit_num, bit_data);
}


/* Write len Bit Data to MPU6050 REG Data	*/
/* reg_addr:		寄存器地址				*/
/* bit_start:		写入位起始位的序号		*/
/* len:				写入数据的长度			*/
/* bit_data:		写入位的数据(0xXX)		*/
void MPU6050_Write_nBit(unsigned char reg_addr, unsigned char bit_start, unsigned int len, unsigned char bit_data)
{
	IIC_Write_nBit(MPU6050_ADDR, reg_addr, bit_start, len, bit_data);
}


/* Set Device Reset of MPU6050  (EN / DISEN)*/
/* enabled:			0:	正常状态			    */
/* 					1:	复位状态(完成后置1)	*/
void MPU6050_Set_DeviceReset(unsigned char enabled)
{
	MPU6050_Write_Bit(MPU6050_PWR_MGMT_1_REG, MPU6050_PWR_MGMT_1_DEVICE_RESET_BIT, enabled);
}


/* Set Sleep Mode of MPU6050  (EN / DISEN)	*/
/* enabled:			0:	解除休眠			    */
/* 					1:	进入休眠			    */
void MPU6050_Set_SleepMode(unsigned char enabled)
{
	MPU6050_Write_Bit(MPU6050_PWR_MGMT_1_REG, MPU6050_PWR_MGMT_1_SLEEP_BIT, enabled);
}


/* Set Work Clock of MPU6050				*/
/* clock_source:	时钟源					*/
/* MPU6050_CLOCK_INTERNAL_8M	内部8M时钟	*/
/* MPU6050_CLOCK_PLL_XGYRO		X轴参考PLL	*/
/* MPU6050_CLOCK_PLL_YGYRO		Y轴参考PLL	*/
/* MPU6050_CLOCK_PLL_ZGYRO		Z轴参考PLL	*/
/* MPU6050_CLOCK_PLL_EXT32K		外部32.768K	*/
/* MPU6050_CLOCK_PLL_EXT19M		外部19.2M	*/
/* MPU6050_CLOCK_KEEP_RESET		停止,复位	*/
void MPU6050_Set_Clock(unsigned char clock_source)
{
	MPU6050_Write_nBit(MPU6050_PWR_MGMT_1_REG, MPU6050_PWR_MGMT_1_CLKSEL_BIT, MPU6050_PWR_MGMT_1_CLKSEL_LENGTH, clock_source);
}


/* Set Smplrt Div of MPU6050				*/
/* div:				分频系数(分频采样时钟)	*/
/* 					采样时钟由DLPF BW 决定	*/
void MPU6050_Set_SmplrtDiv(unsigned char div)
{
	MPU6050_Write_REG(MPU6050_SAMPLE_DIV_REG, div-1);
}


/* Set Gyro Range of MPU6050				*/
/* gyro_range:		陀螺仪量程				*/
/* MPU6050_GYRO_FS_250			±250°/s		*/
/* MPU6050_GYRO_FS_500			±500°/s		*/
/* MPU6050_GYRO_FS_1000			±1000°/s	*/
/* MPU6050_GYRO_FS_2000			±2000°/s	*/
void MPU6050_Set_GyroRange(unsigned char gyro_range)
{
	MPU6050_Write_nBit(MPU6050_GYRO_CONFIG_REG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, gyro_range);
	MPU6050_Write_nBit(MPU6050_GYRO_CONFIG_REG, MPU6050_GCONFIG_XG_ST_BIT, 3, 0x00);	//不自检
}


/* Set Accel Range of MPU6050				*/
/* accel_range:		加速度计量程			    */
/* MPU6050_ACCEL_FS_2			±2g			*/
/* MPU6050_ACCEL_FS_4			±4g			*/
/* MPU6050_ACCEL_FS_8			±8g			*/
/* MPU6050_ACCEL_FS_16			±16g		*/
void MPU6050_Set_AccelRange(unsigned char accel_range)
{
	MPU6050_Write_nBit(MPU6050_ACCEL_CONFIG_REG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, accel_range);
	MPU6050_Write_nBit(MPU6050_ACCEL_CONFIG_REG, MPU6050_ACONFIG_XA_ST_BIT, 3, 0x00);	//不自检
}


/* Set DLPF BandWidth of MPU6050			*/
/* bandwidth:		频率带宽(留低滤高)		*/
/* 							带宽	采样时钟*/
/* MPU6050_DLPF_BW_256		256Hz	8KHz	*/
/* MPU6050_DLPF_BW_188		188Hz	1KHz	*/
/* MPU6050_DLPF_BW_98		 98Hz	1KHz	*/
/* MPU6050_DLPF_BW_42		 42Hz	1KHz	*/
/* MPU6050_DLPF_BW_20		 20Hz	1KHz	*/
/* MPU6050_DLPF_BW_10		 10Hz	1KHz	*/
/* MPU6050_DLPF_BW_2		  2Hz	1KHz	*/
void MPU6050_Set_DLPF(unsigned char dlpf_bandwidth)
{
	MPU6050_Write_nBit(MPU6050_CONFIG_REG, MPU6050_CFG_DLPF_CFG_BIT, MPU6050_CFG_DLPF_CFG_LENGTH, dlpf_bandwidth);
}


/* Set IIC Master Mode of MPU6050			*/
/* enabled:			0:	辅助IIC总线(从机)	*/
/* 					1:	使能IIC主机模式		*/
void MPU6050_Set_IICMasterMode(unsigned char enabled)
{
	MPU6050_Write_Bit(MPU6050_USER_CTRL_REG, MPU6050_USER_CTRL_I2C_MST_EN_BIT, enabled);
}


/* Set IIC Bypass Mode of MPU6050			*/
/* enabled:			0:	MCU不能直接访问设备	*/
/* 					1:	MCU可以直接访问设备	*/
void MPU6050_Set_IICBypassMode(unsigned char enabled)
{
	MPU6050_Write_Bit(MPU6050_INT_PIN_CFG_REG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled);
}

/************************ END of the File *************************/

1.2 H 文件

/******************************************************************\
**	本程序只供学习使用,未经作者许可,不得用于其它任何用途		      **
**																  **
**	硬件平台:STM32F407VGT6					                      **
**	开发环境:MDK-ARM( 5.14 )									  **
**																  **
**	作    者:Brendon Tan										  **
**	完成日期:2016.11.30										      **
**																  **
**	文件名称:mpu6050.h											  **
**	文件说明:MPU6050 读取驱动									  **
**																  **
**	Copyright(C) 2016-2026,@Brendon_Tan				              **
\******************************************************************/

#ifndef _mpu6050_H
#define _mpu6050_H

#include "includes.h"


/* Define of the MPU_60X0 REG		*/
/* REG Data from MPU-6050 DataSheet	*/
/* MPU-6000 and MPU-6050 Register Map and Descriptions	*/
/* Revision:4.0											*/
/* Release Date: 03/09/2012								*/

#define MPU6050_SELF_TEST_X_REG				0X0D	//自检寄存器X					R/W
#define MPU6050_SELF_TEST_Y_REG				0X0E	//自检寄存器Y					R/W
#define MPU6050_SELF_TEST_Z_REG				0X0F	//自检寄存器Z					R/W

#define MPU6050_SELF_TEST_A_REG				0X10	//自检寄存器A					R/W

#define MPU6050_SAMPLE_DIV_REG				0X19	//采样频率分频器				    R/W
#define MPU6050_CONFIG_REG					0X1A	//配置寄存器					    R/W
#define MPU6050_GYRO_CONFIG_REG				0X1B	//陀螺仪配置寄存器				R/W
#define MPU6050_ACCEL_CONFIG_REG			0X1C	//加速度计配置寄存器			    R/W

#define MPU6050_MOT_THR_REG					0X1F	//运动检测阀值设置寄存器		    R/W

#define MPU6050_FIFO_EN_REG					0X23	//FIFO使能寄存器				    R/W
#define MPU6050_I2C_MST_CTRL_REG			0X24	//IIC主机控制寄存器				R/W
#define MPU6050_I2C_SLV0_ADDR_REG			0X25	//IIC从机0器件地址寄存器		    R/W
#define MPU6050_I2C_SLV0_REG_REG			0X26	//IIC从机0数据地址寄存器		    R/W
#define MPU6050_I2C_SLV0_CTRL_REG			0X27	//IIC从机0控制寄存器			    R/W
#define MPU6050_I2C_SLV1_ADDR_REG			0X28	//IIC从机1器件地址寄存器		    R/W
#define MPU6050_I2C_SLV1_REG_REG			0X29	//IIC从机1数据地址寄存器		    R/W
#define MPU6050_I2C_SLV1_CTRL_REG			0X2A	//IIC从机1控制寄存器			    R/W
#define MPU6050_I2C_SLV2_ADDR_REG			0X2B	//IIC从机2器件地址寄存器		    R/W
#define MPU6050_I2C_SLV2_REG_REG			0X2C	//IIC从机2数据地址寄存器		    R/W
#define MPU6050_I2C_SLV2_CTRL_REG			0X2D	//IIC从机2控制寄存器			    R/W
#define MPU6050_I2C_SLV3_ADDR_REG			0X2E	//IIC从机3器件地址寄存器		    R/W
#define MPU6050_I2C_SLV3_REG_REG			0X2F	//IIC从机3数据地址寄存器		    R/W
#define MPU6050_I2C_SLV3_CTRL_REG			0X30	//IIC从机3控制寄存器			    R/W
#define MPU6050_I2C_SLV4_ADDR_REG			0X31	//IIC从机4器件地址寄存器		    R/W
#define MPU6050_I2C_SLV4_REG_REG			0X32	//IIC从机4数据地址寄存器		    R/W
#define MPU6050_I2C_SLV4_DO_REG				0X33	//IIC从机4写数据寄存器			R/W
#define MPU6050_I2C_SLV4_CTRL_REG			0X34	//IIC从机4控制寄存器			    R/W
#define MPU6050_I2C_SLV4_DI_REG				0X35	//IIC从机4读数据寄存器			R
#define MPU6050_I2C_MST_STATUS_REG			0X36	//IIC主机状态寄存器				R
#define MPU6050_INT_PIN_CFG_REG				0X37	//中断/旁路设置寄存器			R/W
#define MPU6050_INT_ENABLE_REG				0X38	//中断使能寄存器				    R/W
#define MPU6050_INT_STATUS_REG				0X3A	//中断状态寄存器				    R
#define MPU6050_ACCEL_XOUT_H_REG			0X3B	//加速度值,X轴高8位寄存器		R
#define MPU6050_ACCEL_XOUT_L_REG			0X3C	//加速度值,X轴低8位寄存器		R
#define MPU6050_ACCEL_YOUT_H_REG			0X3D	//加速度值,Y轴高8位寄存器		R
#define MPU6050_ACCEL_YOUT_L_REG			0X3E	//加速度值,Y轴低8位寄存器		R
#define MPU6050_ACCEL_ZOUT_H_REG			0X3F	//加速度值,Z轴高8位寄存器		R
#define MPU6050_ACCEL_ZOUT_L_REG			0X40	//加速度值,Z轴低8位寄存器		R
#define MPU6050_TEMP_OUT_H_REG				0X41	//温度值高8位寄存器				R
#define MPU6050_TEMP_OUT_L_REG				0X42	//温度值低8位寄存器				R
#define MPU6050_GYRO_XOUT_H_REG				0X43	//陀螺仪值,X轴高8位寄存器		R
#define MPU6050_GYRO_XOUT_L_REG				0X44	//陀螺仪值,X轴低8位寄存器		R
#define MPU6050_GYRO_YOUT_H_REG				0X45	//陀螺仪值,Y轴高8位寄存器		R
#define MPU6050_GYRO_YOUT_L_REG				0X46	//陀螺仪值,Y轴低8位寄存器		R
#define MPU6050_GYRO_ZOUT_H_REG				0X47	//陀螺仪值,Z轴高8位寄存器		R
#define MPU6050_GYRO_ZOUT_L_REG				0X48	//陀螺仪值,Z轴低8位寄存器		R
#define MPU6050_EXT_SENS_DATA_00_REG		0x49	//外部传感器数据寄存器00		    R
#define MPU6050_EXT_SENS_DATA_01_REG		0x4A	//外部传感器数据寄存器01		    R
#define MPU6050_EXT_SENS_DATA_02_REG		0x4B	//外部传感器数据寄存器02		    R
#define MPU6050_EXT_SENS_DATA_03_REG		0x4C	//外部传感器数据寄存器03		    R
#define MPU6050_EXT_SENS_DATA_04_REG		0x4D	//外部传感器数据寄存器04		    R
#define MPU6050_EXT_SENS_DATA_05_REG		0x4E	//外部传感器数据寄存器05		    R
#define MPU6050_EXT_SENS_DATA_06_REG		0x4F	//外部传感器数据寄存器06		    R
#define MPU6050_EXT_SENS_DATA_07_REG		0x50	//外部传感器数据寄存器07		    R
#define MPU6050_EXT_SENS_DATA_08_REG		0x51	//外部传感器数据寄存器08		    R
#define MPU6050_EXT_SENS_DATA_09_REG		0x52	//外部传感器数据寄存器09		    R
#define MPU6050_EXT_SENS_DATA_10_REG		0x53	//外部传感器数据寄存器10		    R
#define MPU6050_EXT_SENS_DATA_11_REG		0x54	//外部传感器数据寄存器11		    R
#define MPU6050_EXT_SENS_DATA_12_REG		0x55	//外部传感器数据寄存器12		    R
#define MPU6050_EXT_SENS_DATA_13_REG		0x56	//外部传感器数据寄存器13		    R
#define MPU6050_EXT_SENS_DATA_14_REG		0x57	//外部传感器数据寄存器14		    R
#define MPU6050_EXT_SENS_DATA_15_REG		0x58	//外部传感器数据寄存器15		    R
#define MPU6050_EXT_SENS_DATA_16_REG		0x59	//外部传感器数据寄存器16		    R
#define MPU6050_EXT_SENS_DATA_17_REG		0x5A	//外部传感器数据寄存器17		    R
#define MPU6050_EXT_SENS_DATA_18_REG		0x5B	//外部传感器数据寄存器18		    R
#define MPU6050_EXT_SENS_DATA_19_REG		0x5C	//外部传感器数据寄存器19		    R
#define MPU6050_EXT_SENS_DATA_20_REG		0x5D	//外部传感器数据寄存器20		    R
#define MPU6050_EXT_SENS_DATA_21_REG		0x5E	//外部传感器数据寄存器21		    R
#define MPU6050_EXT_SENS_DATA_22_REG		0x5F	//外部传感器数据寄存器22		    R
#define MPU6050_EXT_SENS_DATA_23_REG		0x60	//外部传感器数据寄存器23		    R

#define MPU6050_I2C_SLV0_DO_REG				0X63	//IIC从机0数据寄存器			    R/W
#define MPU6050_I2C_SLV1_DO_REG				0X64	//IIC从机1数据寄存器			    R/W
#define MPU6050_I2C_SLV2_DO_REG				0X65	//IIC从机2数据寄存器			    R/W
#define MPU6050_I2C_SLV3_DO_REG				0X66	//IIC从机3数据寄存器			    R/W
#define MPU6050_I2C_MST_DELAY_CTRL_REG		0X67	//IIC主机延时管理寄存器			R/W
#define MPU6050_SIGNAL_PATH_RESET_REG		0X68	//信号通道复位寄存器			    R/W
#define MPU6050_MOT_DETECT_CTRL_REG			0X69	//运动检测控制寄存器			    R/W
#define MPU6050_USER_CTRL_REG				0X6A	//用户控制寄存器				    R/W
#define MPU6050_PWR_MGMT_1_REG				0X6B	//电源管理寄存器1				R/W
#define MPU6050_PWR_MGMT_2_REG				0X6C	//电源管理寄存器2 				R/W

#define MPU6050_FIFO_COUNTH_REG				0X72	//FIFO计数寄存器高八位			R/W
#define MPU6050_FIFO_COUNTL_REG				0X73	//FIFO计数寄存器低八位			R/W
#define MPU6050_FIFO_R_W_REG				0X74	//FIFO读写寄存器				    R/W
#define MPU6050_WHO_AM_I_REG				0X75	//器件ID寄存器					R


/* MPU6050_PWR_MGMT_1_REG ( 0x6B ) Data Define		*/
#define MPU6050_PWR_MGMT_1_DEVICE_RESET_BIT		7
#define MPU6050_PWR_MGMT_1_SLEEP_BIT			6
#define MPU6050_PWR_MGMT_1_CYCLE_BIT			5
#define MPU6050_PWR_MGMT_1_TEMP_DIS_BIT			3
#define MPU6050_PWR_MGMT_1_CLKSEL_BIT			2

#define MPU6050_PWR_MGMT_1_CLKSEL_LENGTH		3

#define MPU6050_CLOCK_INTERNAL_8M				0x00
#define MPU6050_CLOCK_PLL_XGYRO					0x01
#define MPU6050_CLOCK_PLL_YGYRO					0x02
#define MPU6050_CLOCK_PLL_ZGYRO					0x03
#define MPU6050_CLOCK_PLL_EXT32K				0x04
#define MPU6050_CLOCK_PLL_EXT19M				0x05
#define MPU6050_CLOCK_KEEP_RESET				0x07


/* MPU6050_GYRO_CONFIG_REG ( 0x1B ) Data Define		*/
#define MPU6050_GCONFIG_XG_ST_BIT		7
#define MPU6050_GCONFIG_YG_ST_BIT		6
#define MPU6050_GCONFIG_ZG_ST_BIT		5
#define MPU6050_GCONFIG_FS_SEL_BIT		4

#define MPU6050_GCONFIG_FS_SEL_LENGTH	2

#define MPU6050_GYRO_FS_250				0x00
#define MPU6050_GYRO_FS_500				0x01
#define MPU6050_GYRO_FS_1000			0x02
#define MPU6050_GYRO_FS_2000			0x03


/* MPU6050_ACCEL_CONFIG_REG ( 0x1C ) Data Define	*/
#define MPU6050_ACONFIG_XA_ST_BIT		7
#define MPU6050_ACONFIG_YA_ST_BIT		6
#define MPU6050_ACONFIG_ZA_ST_BIT		5
#define MPU6050_ACONFIG_AFS_SEL_BIT		4

#define MPU6050_ACONFIG_AFS_SEL_LENGTH	2

#define MPU6050_ACCEL_FS_2				0x00
#define MPU6050_ACCEL_FS_4				0x01
#define MPU6050_ACCEL_FS_8				0x02
#define MPU6050_ACCEL_FS_16				0x03


/* MPU6050_CONFIG_REG ( 0x1A ) Data Define			*/
#define MPU6050_CFG_EXT_SYNC_SET_BIT	5
#define MPU6050_CFG_DLPF_CFG_BIT		2

#define MPU6050_CFG_EXT_SYNC_SET_LENGTH	3
#define MPU6050_CFG_DLPF_CFG_LENGTH		3

#define MPU6050_EXT_SYNC_DISABLED		0x00
#define MPU6050_EXT_SYNC_TEMP_OUT_L		0x01
#define MPU6050_EXT_SYNC_GYRO_XOUT_L	0x02
#define MPU6050_EXT_SYNC_GYRO_YOUT_L	0x03
#define MPU6050_EXT_SYNC_GYRO_ZOUT_L	0x04
#define MPU6050_EXT_SYNC_ACCEL_XOUT_L	0x05
#define MPU6050_EXT_SYNC_ACCEL_YOUT_L	0x06
#define MPU6050_EXT_SYNC_ACCEL_ZOUT_L	0x07

#define MPU6050_DLPF_BW_256				0x00
#define MPU6050_DLPF_BW_188				0x01
#define MPU6050_DLPF_BW_98				0x02
#define MPU6050_DLPF_BW_42				0x03
#define MPU6050_DLPF_BW_20				0x04
#define MPU6050_DLPF_BW_10				0x05
#define MPU6050_DLPF_BW_5				0x06


/* MPU6050_USER_CTRL_REG ( 0x6A ) Data Define		*/
#define MPU6050_USER_CTRL_FIFO_EN_BIT			6
#define MPU6050_USER_CTRL_I2C_MST_EN_BIT		5
#define MPU6050_USER_CTRL_I2C_IF_DIS_BIT		4
#define MPU6050_USER_CTRL_FIFO_RESET_BIT		2
#define MPU6050_USER_CTRL_I2C_MST_RESET_BIT		1
#define MPU6050_USER_CTRL_SIG_COND_RESET_BIT	0


/* MPU6050_INT_PIN_CFG_REG ( 0x37 ) Data Define		*/
#define MPU6050_INTCFG_INT_LEVEL_BIT			7
#define MPU6050_INTCFG_INT_OPEN_BIT				6
#define MPU6050_INTCFG_LATCH_INT_EN_BIT			5
#define MPU6050_INTCFG_INT_RD_CLEAR_BIT			4
#define MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT		3
#define MPU6050_INTCFG_FSYNC_INT_EN_BIT			2
#define MPU6050_INTCFG_I2C_BYPASS_EN_BIT		1
#define MPU6050_INTCFG_CLKOUT_EN_BIT			0

/*********** END of Register and REG Data Bit ***********/


/* Define the Address of MPU6050 */
#define MPU6050_ADDR				MPU6050_ADDRESS_AD0_LOW
#define MPU6050_ADDRESS_AD0_LOW		0x68	//AD0 Connect to GND or Floating
#define MPU6050_ADDRESS_AD0_HIGH	0x69	//AD0 Connect to VCC(3.3)
#define MPU6050_DEFAULT_ADDRESS		MPU6050_ADDRESS_AD0_LOW


#define Enable		1
#define Disable		0


extern unsigned char MPU6050_Buffer[14];


void MPU6050_Init(void);

void MPU6050_Read(void);

void MPU6050_Write_REG(unsigned char reg_addr, unsigned char write_data);
void MPU6050_Read_nData(unsigned char reg_addr, unsigned char *buf, unsigned char num);

void MPU6050_Write_Bit(unsigned char reg_addr, unsigned int bit_num, unsigned char bit_data);
void MPU6050_Write_nBit(unsigned char reg_addr, unsigned char bit_start, unsigned int len, unsigned char bit_data);

void MPU6050_Set_DeviceReset(unsigned char enabled);
void MPU6050_Set_SleepMode(unsigned char enabled);
void MPU6050_Set_Clock(unsigned char clock_source);
void MPU6050_Set_SmplrtDiv(unsigned char div);
void MPU6050_Set_GyroRange(unsigned char gyro_range);
void MPU6050_Set_AccelRange(unsigned char accel_range);
void MPU6050_Set_DLPF(unsigned char dlpf_bandwidth);
void MPU6050_Set_IICMasterMode(unsigned char enabled);
void MPU6050_Set_IICBypassMode(unsigned char enabled);

#endif

/************************ END of the File *************************/

1.3 main 函数

注意:此函数只提供调用方法(函数内无关函数都已删除),不可生搬硬套。

int main(void)
{
	SystemInit();
	//System Set Up
	Set_Up();
	
	while(1)
	{
		//System Loop
		Loop();
	}
}

/* System Set Up */
void Set_Up(void)
{
	MPU6050_Init();
}

short int gyro_x=0;
short int gyro_y=0;
short int gyro_z=0;
short int accel_x=0;
short int accel_y=0;
short int accel_z=0;

void Loop(void)
{
	MPU6050_Read();
	
	gyro_x = ((((int16_t)MPU6050_Buffer[0])<<8) | MPU6050_Buffer[1]);
	gyro_y = ((((int16_t)MPU6050_Buffer[2])<<8) | MPU6050_Buffer[3]);
	gyro_z = ((((int16_t)MPU6050_Buffer[4])<<8) | MPU6050_Buffer[5]);
	
	accel_x = ((((int16_t)MPU6050_Buffer[ 8])<<8) | MPU6050_Buffer[ 9]);
	accel_y = ((((int16_t)MPU6050_Buffer[10])<<8) | MPU6050_Buffer[11]);
	accel_z = ((((int16_t)MPU6050_Buffer[12])<<8) | MPU6050_Buffer[13]);
}

3 最后

    本教程由 Brendon Tan 原创发布,版权所有。该文档仅供个人学习交流使用,不得用于其他用途,禁止商用, 转载或公开使用请联系作者授权。
    此教程由本人独立整理,如有不当之处,欢迎指正。

猜你喜欢

转载自blog.csdn.net/Brendon_Tan/article/details/107335787