因为我的博客已经对I2C协议的详细过程已经做了一个例子!所以这个MPU6050的程序我将使用库函数完成!
第一步:硬件连接:
第二步:初始化I2C端口的函数:
/***PB6/PB7 端口初始化****/
static void I2C_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/***模式设置 使能I2C***/
static void I2C_Mode_Config(void)
{
I2C_InitTypeDef I2C_InitStructure;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 50000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd (I2C1,ENABLE);
I2C_AcknowledgeConfig(I2C1, ENABLE);
}
/***初始化***/
void I2C_MPU6050_Init(void)
{
I2C_GPIO_Config();
I2C_Mode_Config();
}
第三步:写一个写数据函数和一个读数据函数
/** 读数据函数****/
void I2C_ByteWrite(uint8_t REG_Address,uint8_t REG_data)
{
I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,SlaveAddress,I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1,REG_Address);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1,REG_data);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1,ENABLE);
}
/*** 读数据函数 **/
uint8_t I2C_ByteRead(uint8_t REG_Address)
{
uint8_t REG_data;
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,SlaveAddress,I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_Cmd(I2C1,ENABLE);
I2C_SendData(I2C1,REG_Address);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,SlaveAddress,I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
I2C_AcknowledgeConfig(I2C1,DISABLE);
I2C_GenerateSTOP(I2C1,ENABLE);
while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)));
REG_data=I2C_ReceiveData(I2C1);
return REG_data;
}
/** mpu6050初始化***/
void InitMPU6050(void)
{
I2C_ByteWrite(PWR_MGMT_1,0x00);
I2C_ByteWrite(SMPLRT_DIV,0x07);
I2C_ByteWrite(CONFIG,0x06);
I2C_ByteWrite(GYRO_CONFIG,0x18);
I2C_ByteWrite(ACCEL_CONFIG,0x01);
}
最后一步:
先写一个获取数据的函数:
unsigned int GetData(unsigned char REG_Address)
{
char H,L;
H=I2C_ByteRead(REG_Address);
L=I2C_ByteRead(REG_Address+1);
return (H<<8)+L;
}
/**打印输出**/
主函数:
int main(void)
{
//延时函数自己写
USART1_Config(); //串口数据发送自己写
I2C_MPU6050_Init();
InitMPU6050();
while(1)
{
printf("rn---------加速度X轴原始数据--------%d rn",GetData(ACCEL_XOUT_H));
printf("rn---------加速度Y轴原始数据---------%d rn",GetData(ACCEL_YOUT_H));
printf("rn---------加速度Z轴原始数据----------%d rn",GetData(ACCEL_ZOUT_H));
printf("rn---------陀螺仪X轴原始数据----------%d rn",GetData(GYRO_XOUT_H));
printf("rn---------陀螺仪Y轴原始数据----------%d rn",GetData(GYRO_YOUT_H));
printf("rn---------陀螺仪Z轴原始数据----------%d rn",GetData(GYRO_ZOUT_H));
delay_ms(2000);
printf("===================================================================== /r/n");
}
}
PC显示结果:
完成了!!!
上一篇:【STM32F103攻城笔记】STM32之MDK(Keil)环境搭建(一)
下一篇:基于STM32f103的I2C通信接口的EPPROM模块(24C256)读写程序详解2
推荐阅读
史海拾趣
华为,作为中国的科技巨头,其在电子行业的发展历程中展现出了强大的技术实力和全球视野。华为在通信领域取得了多项技术突破,如5G技术的领先和智能手机拍照技术的创新。同时,华为还积极拓展全球市场,与全球运营商建立了广泛的合作关系。然而,面对国际市场的复杂环境和竞争压力,华为也面临着诸多挑战和不确定性。
在电子行业的发展历程中,Altech公司凭借其敏锐的市场洞察力,率先投入研发铝合金汽车线束导体。随着新能源汽车市场的崛起,对高效、轻量化的线束导体需求日益增长。Altech公司成功研发出铝合金汽车线束导体,不仅满足了市场对轻量化的需求,还提高了导电性能,为新能源汽车行业带来了革命性的变革。
品质是Akros公司的生命线。公司始终坚持严格的质量控制体系,从原材料采购到产品出厂的每一个环节都进行严格把关。为了确保产品的品质稳定可靠,Akros还引进了先进的生产设备和检测仪器。同时,公司还注重持续改进,通过不断优化生产流程和提升员工技能水平,不断提高产品的品质和效率。
随着电子市场的不断发展和消费者需求的多样化,BELLING LEE公司意识到单一的产品线已无法满足市场需求。于是,公司开始积极拓展产品线,推出了包括智能手机、平板电脑、智能家居设备等一系列新产品。这些新产品不仅满足了消费者的多样化需求,也进一步巩固了公司在电子市场的领先地位。
在20世纪初,BELDEN公司在技术创新方面取得了显著突破。公司不仅将塑料绝缘材料应用于电线和电缆制造,还着眼于精密和高质量产品的需求,致力于高附加值的绝缘材料、电缆、防护和护套材料的生产。这些技术创新使得BELDEN的产品在性能和质量上都有了显著提升,进一步巩固了公司在市场中的地位。同时,公司还不断扩大产品线,增加了橡胶绝缘材料等多种新产品,满足了不同客户的需求。
市面上现在热销的P10_16X32LED点阵原理图,独家放送! 市面上现在热销的P10_16X32LED点阵原理图,独家放送!由于厂家保密不给原理图和源程序,为了方便自己和大家手工制作,熬夜绘制的详细原理图,麻烦大虾编个显示汉字的程序给我, 不胜感激! 放图:… 查看全部问答∨ |
在这里,就简单描述一下自己当时学习FPGA的经过: 1、语言的学习,当时在学校的时候听了点电子设计的课程,然后略知了点VHDL,后来发现VHDL不太实用(个人认为),所以就学习verilog HDL; 2、FPGA的学习,主要是对其的了解,刚开始学么,当时选 ...… 查看全部问答∨ |
无论是LED、萤光灯还是白炽灯具,我们都要了解其中的一个重要参数——功率因素(PFC),下我们来了解下什么是功率因素。1、功率因素功率因数表征着灯具输出有功功率的能力。功率是能量的传输率的度量,在直流电路中它是电压V和电流A和乘积。在交流 ...… 查看全部问答∨ |
我是新手刚刚开始实习,要学着用SPI协议,开发wifi。 其实代码是别人已经写好的,可惜我没学过任何有关嵌入式开发的东西(之前都是学桌面应用程序开发的) 在WM系统下的,AKU是6.1的。 希望前辈们指点下wifi开发过程中的一些流程和代码编写的经验 ...… 查看全部问答∨ |
请问有高手看得懂这个程序吗??我搞不懂怎么弄引脚锁定!~~~~ library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity correct_counter2 is port( en: in std_logic; ren: in &nb ...… 查看全部问答∨ |
|
【设计工具】说明ISE+timing+constrain+的用法 wConstraints Guide: Quick Start Guide appendix H. wUsing Timing Constraints: Developmental System Reference Guide chapter 6. wTiming Analyzer: Timing Analyzer Reference/User Guide. wTRCE: Developmental System Refer ...… 查看全部问答∨ |
|
显示的错误信息,跟不接学习板,采用硬件仿真的提示错误信息一样。 为: fatal error unknown exception in driver(#E1) session aborted!… 查看全部问答∨ |
atmel zigbee协议栈移植(zigduino开发板) 刚接触zigbee,用的板子是zigduino开发板,MCU型号是Atmel公司的Atmega128RFA1,想移植zigbee协议栈上去,但不知道从何下手。 看了开发板的用户手册,支持atmel的bitCloud SDK,看了相关资料,还是一头雾水。。。 想问问大家怎么移植bitCloud到板 ...… 查看全部问答∨ |