1、mpu6050详细C语言程序/*/ 陀螺仪 MPU6050 IIC测试程序*/#include stm32f10x_lib.h#include /Keil library GPIO_InitTypeDef GPIO_InitStructure;ErrorStatus HSEStartUpStatus;#define uchar unsigned char#define uint unsigned int / 定义MPU6050内部地址#define SMPLRT_DIV 0x19 /陀螺仪采样率,典型值:0x07(125Hz)#define CONFIG 0x1A /低通滤波频率,典型值:0x
2、06(5Hz)#define GYRO_CONFIG 0x1B /陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)#define ACCEL_CONFIG 0x1C /加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)#define ACCEL_XOUT_H 0x3B#define ACCEL_XOUT_L 0x3C#define ACCEL_YOUT_H 0x3D#define ACCEL_YOUT_L 0x3E#define ACCEL_ZOUT_H 0x3F#define ACCEL_ZOUT_L 0x40/#define TEMP_OUT_
3、H 0x41/#define TEMP_OUT_L 0x42/#define GYRO_XOUT_H 0x43#define GYRO_XOUT_L 0x44 #define GYRO_YOUT_H 0x45#define GYRO_YOUT_L 0x46#define GYRO_ZOUT_H 0x47#define GYRO_ZOUT_L 0x48#define PWR_MGMT_1 0x6B /电源管理,典型值:0x00(正常启用)/#define WHO_AM_I 0x75 /IIC地址寄存器(默认数值0x68,只读)/*#define MPU6050_Addr 0xD0 /定义器件在I
4、IC总线中的从地址,根据ALT ADDRESS地址引脚不同修改unsigned char TX_DATA4; /显示据缓存区unsigned char BUF10; /接收数据缓存区char test=0; /IIC用到short T_X,T_Y,T_Z,T_T; /X,Y,Z轴,温度/模拟IIC端口输出输入定义#define SCL_H GPIOB-BSRR = GPIO_Pin_6#define SCL_L GPIOB-BRR = GPIO_Pin_6 #define SDA_H GPIOB-BSRR = GPIO_Pin_7#define SDA_L GPIOB-BRR = GPIO_P
5、in_7#define SCL_read GPIOB-IDR & GPIO_Pin_6#define SDA_read GPIOB-IDR & GPIO_Pin_7/* 函数申明 -*/void RCC_Configuration(void);void GPIO_Configuration(void);void NVIC_Configuration(void);void USART1_Configuration(void);void WWDG_Configuration(void);void Delay(u32 nTime);void Delayms(vu32 m); /* 变量定义 -*/
6、/*/void DATA_printf(uchar *s,short temp_data) if(temp_data0) temp_data=-temp_data; *s=-; else *s= ; *+s =temp_data/100+0x30; temp_data=temp_data%100; /取余运算 *+s =temp_data/10+0x30; temp_data=temp_data%10; /取余运算 *+s =temp_data+0x30; /* Function Name : I2C_GPIO_Config* Description : Configration Simula
7、tion IIC GPIO* Input : None * Output : None* Return : None* */void I2C_GPIO_Config(void) GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOB, &GPIO_InitStruct
8、ure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOB, &GPIO_InitStructure);/* Function Name : I2C_delay* Description : Simulation IIC Timing series delay* Input : None* Output : None* Return
9、 : None* */void I2C_delay(void) u8 i=30; /这里可以优化速度 ,经测试最低到5还能写入 while(i) i-; void delay5ms(void) int i=5000; while(i) i-; /* Function Name : I2C_Start* Description : Master Start Simulation IIC Communication* Input : None* Output : None* Return : Wheather Start* */bool I2C_Start(void) SDA_H; SCL_H;
10、I2C_delay(); if(!SDA_read)return FALSE; /SDA线为低电平则总线忙,退出 SDA_L; I2C_delay(); if(SDA_read) return FALSE; /SDA线为高电平则总线出错,退出 SDA_L; I2C_delay(); return TRUE;/* Function Name : I2C_Stop* Description : Master Stop Simulation IIC Communication* Input : None* Output : None* Return : None* */void I2C_Stop(v
11、oid) SCL_L; I2C_delay(); SDA_L; I2C_delay(); SCL_H; I2C_delay(); SDA_H; I2C_delay(); /* Function Name : I2C_Ack* Description : Master Send Acknowledge Single* Input : None* Output : None* Return : None* */void I2C_Ack(void) SCL_L; I2C_delay(); SDA_L; I2C_delay(); SCL_H; I2C_delay(); SCL_L; I2C_delay
12、(); /* Function Name : I2C_NoAck* Description : Master Send No Acknowledge Single* Input : None* Output : None* Return : None* */void I2C_NoAck(void) SCL_L; I2C_delay(); SDA_H; I2C_delay(); SCL_H; I2C_delay(); SCL_L; I2C_delay(); /* Function Name : I2C_WaitAck* Description : Master Reserive Slave Ac
13、knowledge Single* Input : None* Output : None* Return : Wheather Reserive Slave Acknowledge Single* */bool I2C_WaitAck(void) /返回为:=1有ACK,=0无ACK SCL_L; I2C_delay(); SDA_H; I2C_delay(); SCL_H; I2C_delay(); if(SDA_read) SCL_L; I2C_delay(); return FALSE; SCL_L; I2C_delay(); return TRUE;/* Function Name
14、: I2C_SendByte* Description : Master Send a Byte to Slave* Input : Will Send Date* Output : None* Return : None* */void I2C_SendByte(u8 SendByte) /数据从高位到低位/ u8 i=8; while(i-) SCL_L; I2C_delay(); if(SendByte&0x80) SDA_H; else SDA_L; SendByte=1; I2C_delay(); SCL_H; I2C_delay(); SCL_L; /* Function Name
15、 : I2C_RadeByte* Description : Master Reserive a Byte From Slave* Input : None* Output : None* Return : Date From Slave * */unsigned char I2C_RadeByte(void) /数据从高位到低位/ u8 i=8; u8 ReceiveByte=0; SDA_H; while(i-) ReceiveByte7) | SlaveAddress & 0xFFFE);/设置高起始地址+器件地址 if(!I2C_WaitAck()I2C_Stop(); return
16、FALSE; I2C_SendByte(REG_Address ); /设置低起始地址 I2C_WaitAck(); I2C_SendByte(REG_data); I2C_WaitAck(); I2C_Stop(); delay5ms(); return TRUE;/单字节读取*unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address) unsigned char REG_data; if(!I2C_Start()return FALSE; I2C_SendByte(SlaveAddress)
17、; /I2C_SendByte(REG_Address & 0x0700) 7) | REG_Address & 0xFFFE);/设置高起始地址+器件地址 if(!I2C_WaitAck()I2C_Stop();test=1; return FALSE; I2C_SendByte(u8) REG_Address); /设置低起始地址 I2C_WaitAck(); I2C_Start(); I2C_SendByte(SlaveAddress+1); I2C_WaitAck(); REG_data= I2C_RadeByte(); I2C_NoAck(); I2C_Stop(); /return
18、 TRUE; return REG_data; /* 函数名称 : RCC_Configuration(void)* 函数功能 : 时钟初始化* 输 入 : 无* 输 出 : 无* 返 回 : 无*/void RCC_Configuration(void) /* RCC system reset(for debug purpose) */ RCC_DeInit(); /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON); /* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp()
19、; if(HSEStartUpStatus = SUCCESS) /* HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_Div1); /* PCLK2 = HCLK */ RCC_PCLK2Config(RCC_HCLK_Div1); /* PCLK1 = HCLK/2 */ RCC_PCLK1Config(RCC_HCLK_Div2); /* Flash 2 wait state */ FLASH_SetLatency(FLASH_Latency_2); /* Enable Prefetch Buffer */ FLASH_PrefetchBufferC
20、md(FLASH_PrefetchBuffer_Enable); /* PLLCLK = 8MHz * 9 = 72 MHz */ RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /* Enable PLL */ RCC_PLLCmd(ENABLE); /* Wait till PLL is ready */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET) /* Select PLL as system clock source */ RCC_SYSCLKConfig(RCC_SYSC
21、LKSource_PLLCLK); /* Wait till PLL is used as system clock source */ while(RCC_GetSYSCLKSource() != 0x08) /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG | RCC_APB2Periph_AFIO , ENABLE); /* 函数名称 : GPIO_Configuration(void)* 函数功能 : 端口初始化* 输 入 : 无* 输 出 : 无* 返 回 : 无*/void GPIO_Configuration(
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2