江协科技stm32————10-5 硬件I2C读写MPU6050

步骤

一、配置I2C外设,对I2C2外设进行初始化(MyI2C_Init) 

  • 开启I2C外设和对应的GPIO口的时钟
  • 把I2C对应的GPIO口初始化为复用开漏模式
  • 使用结构体配置I2C
  • I2C_Cmd,使能I2C

I2C_GenerateSTART        //生产起始条件

I2C_GenerateSTOP        //生产终止条件

I2C_AcknowledgeConfig        //配置ACK应答使能

I2C_SendData        //把数据写入DR寄存器

I2C_ReceiveData        //读取DR数据

I2C_Send7bitAddress        //发送7位地址

I2C_CheckEvent        //检查标志位

二、控制外设电路,实现指定地址写的时序(WriteReg)

三、控制外设电路,实现指定地址读的实现(ReadReg)

MPU6050.c

#include "stm32f10x.h"                  // Device header
#include "MPU6050_Reg.h"#define MPU6050_ADDRESS		0xD0void MPU6050_waitEvent(I2C_TypeDef* I2Cx, uint32_t I2C_EVENT)
{uint32_t Timeout;Timeout = 10000;while(I2C_CheckEvent(I2Cx , I2C_EVENT) != SUCCESS)	{Timeout --; 	//超时退出机制if(Timeout == 0){break;}}}void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
{I2C_GenerateSTART(I2C2 , ENABLE);	//起始MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_MODE_SELECT);	//检测EV5I2C_Send7bitAddress(I2C2 , MPU6050_ADDRESS  ,I2C_Direction_Transmitter);	//发送7位地址MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);	//检测EV6I2C_SendData(I2C2 , RegAddress);	//发送数据MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTING);	//检测EV8I2C_SendData(I2C2 , Data);MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTED);	//检测EV8_2I2C_GenerateSTOP(I2C2 , ENABLE);	//终止 }uint8_t MPU6050_ReadReg(uint8_t RegAddress)
{uint8_t Data;I2C_GenerateSTART(I2C2 , ENABLE);	//起始MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_MODE_SELECT);	//检测EV5I2C_Send7bitAddress(I2C2 , MPU6050_ADDRESS  ,I2C_Direction_Transmitter);	//发送7位地址MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);	//检测EV6I2C_SendData(I2C2 , RegAddress);	//发送数据MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTED);	//检测EV8I2C_GenerateSTART(I2C2 , ENABLE);	//重复起始条件MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_MODE_SELECT);	//检测EV5I2C_Send7bitAddress(I2C2 , MPU6050_ADDRESS  ,I2C_Direction_Receiver);	//接收7位地址MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);	//检测EV6I2C_AcknowledgeConfig(I2C2 , DISABLE);	//设置ack=0I2C_GenerateSTOP(I2C2 ,ENABLE); //stop = 1 申请产生终止条件MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_BYTE_RECEIVED);	//检测EV7Data = I2C_ReceiveData(I2C2);	//数值赋给DataI2C_AcknowledgeConfig(I2C2 , ENABLE);	//设置ack=1return Data;
}void MPU6050_Init(void)
{
//	MyI2C_Init();RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2 , ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;	//复用AF:GPIO的控制权要交给硬件外设 开漏OD:I2C协议的要求GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);I2C_InitTypeDef I2C_Initstructure;I2C_Initstructure.I2C_Mode = I2C_Mode_I2C;I2C_Initstructure.I2C_ClockSpeed = 50000;I2C_Initstructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_Initstructure.I2C_Ack = I2C_Ack_Enable;I2C_Initstructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_Initstructure.I2C_OwnAddress1 = 0x00;I2C_Init(I2C2 , &I2C_Initstructure);I2C_Cmd(I2C2 , ENABLE);MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);//解除睡眠、选择陀螺仪时钟MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);//6个轴均不待机MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);//10分频MPU6050_WriteReg(MPU6050_CONFIG, 0x06);//配置寄存器MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);//陀螺仪配置寄存器MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);//加速度配置寄存器
}uint8_t MPU6050_GetID(void)
{return MPU6050_ReadReg(MPU6050_WHO_AM_I);
}void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ, int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)	
//分别读取6个轴数据寄存器的高位和低位,拼接为16位数据再通过指针变量返回																
{uint8_t DataH, DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);*AccX = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);*AccY = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);*AccZ = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);*GyroX = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);*GyroY = (DataH << 8) | DataL;DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);*GyroZ = (DataH << 8) | DataL;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/412885.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LavaDome:一款基于ShadowDOM的DOM树安全隔离与封装工具

关于LavaDome LavaDome是一款针对HTML代码安全和Web安全的强大工具&#xff0c;该工具基于ShadowDOM实现其功能&#xff0c;可以帮助广大研究人员实现安全的DOM节点/树隔离和封装。 在当今的Web标准下&#xff0c;尚无既定方法可以安全地选择性地隔离DOM子树。换句话说&#x…

Unity获取SceneView尺寸

获取SceneView尺寸 var sceneView SceneView.lastActiveSceneView; var size new Vector2(sceneView.position.width,sceneView.position.height);

设计模式结构型模式之代理模式

结构型模式之代理模式 一、概念和使用场景1、概念2、核心思想3、java实现代理模式的方式4、使用场景 二、示例讲解1. 静态代理2. 动态代理 三、总结1、使用规则2、代理模式的优点包括&#xff1a;3、代理模式的缺点包括&#xff1a; 一、概念和使用场景 1、概念 代理模式是一…

笔记:应用Visual Studio Profiler识别和解决内存泄漏问题

一、目的&#xff1a;应用Visual Studio Profiler识别和解决内存泄漏问题 识别和解决内存泄漏问题是确保应用程序稳定性和性能的关键步骤。 二、实现 以下是如何使用 Visual Studio Profiler 识别和解决内存泄漏问题的详细步骤&#xff1a; 1. 启动内存分析 1. 打开项目&…

Windows环境CP Editor安装使用方法

step0&#xff1a;下载软件包&#xff0c;附件有已经下载的安装包 Download CP Editor | CP Editor step1&#xff1a;下载后双击安装即可(记住安装路径) step2&#xff1a;找到安装目录下的cpeditor\mingw64\bin配置环境变量 step3&#xff1a;双击打开即可使用

《王者荣耀》游戏玩法与部分机制分析

目录 游戏机制 MOBA核心玩法 匹配机制 游戏模式 隐藏分机制 游戏规则 总结 王者荣耀的ELO匹配机制是如何具体工作的&#xff1f; 王者荣耀中隐藏分机制的详细规则是什么&#xff1f;&#xff08;难绷&#xff01;&#xff09; 王者荣耀边境突围和五军对决模式的具体玩…

全局页面数据渲染--SAAS本地化及未来之窗行业应用跨平台架构

一、代码 /* 未来之窗通用数据渲染// 定义了一个名为"未来之窗_人工智能_前端口_数据渲染到界面"的函数 function 未来之窗_人工智能_前端口_数据渲染到界面(obj, 前置参数) {// 开启一个控制台分组&#xff0c;用于组织相关的输出信息console.group("未来之窗…

MySQL集群的基础部署及主从复制详解

一、Msql在服务器中的部署方法 官网&#xff1a;http://www.mysql.com 在企业中90%的服务器操作系统均为Linux 在企业中对于Mysql的安装通常用源码编译的方式来进行 1.1 在Linux下部署MySQL 1.1.1 部署环境 主机IP角色MySQL-node1172.25.254.13masterMySQL-node2172.25.…

Linux--IO模型_多路转接

目录 0.往期文章 1.五种IO模型介绍 概念 调用函数&#xff08;非阻塞IO&#xff09; 2.详解多路转接 之select select函数介绍 设置文件描述符 写一个基于select的TCP服务器 辅助库 基于TCP的Socket封装 服务器代码 测试服务器 小结 3.详解多路转接 之poll poll函…

基于OpenCV+MFC的KCF测速软件

基于OpenCVMFC的KCF测速软件 引言原理介绍使用介绍&#xff08;1&#xff09;主界面&#xff08;2&#xff09;打开视频&#xff08;3&#xff09;点击KCF测速&#xff08;4&#xff09;框选待检测目标&#xff08;5&#xff09;测速结果 资源链接&#xff08;包含源码&#xf…

SpringMVC处理流程介绍

SpringMVC请求处理流程 发起请求到前端控制器(DispatcherServlet)前端控制器请求HandlerMapping查找Handler(可以根据xml配置,注解进行查找) 对应Spring源码 //在类DispatcherServlet里面 protected void doDispatch(HttpServletRequest request, HttpServletResponse respon…

static关键字与单例模式

可以修饰属性变量&#xff0c;方法和代码段 static修饰的属性称为静态属性或类属性&#xff0c; 在类加载时就在方法区为属性开辟存储空间&#xff0c;无论创建多少个对象&#xff0c;静态属性在内存中只有一份。 可以使用 类名.静态属性 的方式引用 static修饰的方法称为静态…

FPGA第 5 篇,FPGA技术优略势,FPGA学习方向,FPGA学习路线(FPGA专业知识的学习方向,FPGA现场可编程门阵列学习路线和方向)

前言 前几篇讲了一下FPGA的发展和应用&#xff0c;以及未来前景。具体详细&#xff0c;请看 FPGA发展和应用&#xff0c;以及未来前景https://blog.csdn.net/weixin_65793170/category_12665249.html 这里我们来&#xff0c;记录一下&#xff0c;FPGA专业知识的学习路线 一.…

第22周:调用Gensim库训练Word2Vec模型

目录 前言 一、Word2vec基本知识 1.1 Word2Vec是什么 1.2 Word2Vec两种主要模型架构 1.2.1 CBOW模型 1.2.2 Skip-gram模型 1.3 实例说明 1.4 调用方法 二、准备工作 2.1 安装Gensim库 2.2 对原始语料分词 2.2 添加自定义停用词 三、训练Word2Vec模型 四、模型应用…

快速掌握GPTEngineer:用AI创建网页应用的实用教程

今天来聊聊一个非常有趣的工具——GPTEngineer。这是一个基于AI的网页开发平台&#xff0c;特别适合那些不熟悉编程但又想快速创建网页应用的人。如果你想用简单的文本描述来生成一个网站或者应用&#xff0c;GPTEngineer可能就是你需要的。我们一步步看看如何使用它。 1. 了解…

Spring Boot 入门

1.1.1 什么是Spring Boot Spring Boot是一个开源的Java应用框架&#xff0c;由Pivotal团队提供&#xff0c;旨在简化Spring应用的初始搭建以及开发过程。‌ Spring Boot通过使用特定的配置方式&#xff0c;使得开发人员不再需要定义样板化的配置&#xff0c;从而在快速应用开发…

中仕公考:公务员考试缺考有影响吗?

公务员考试缺考的影响根据考试阶段的不同又所区别&#xff0c;中仕为大家介绍一下&#xff1a; 笔试阶段的缺考后果&#xff1a; 在公务员考试中&#xff0c;若考生未能按时参加笔试&#xff0c;将自动视为放弃该次考试机会。此行为不会对考生的个人信用产生任何负面效应&…

Win10 安装 Rabbitmq

参考文档&#xff1a;https://www.rabbitmq.com/docs/install-windows 一、安装 Erlang 语言 安装 RabbitMQ 需要该语言的支持才能安装 下载地址&#xff1a;https://erlang.org/download/otp_versions_tree.html 点击这里下载最新版本&#xff1a;27.0.1 直接默认 next 更…

【计算机网络】计算机网络的性能指标

1B/s 8bps &#xff0c;MB/s 8Mbps 信道&#xff08;Channel&#xff09;&#xff1a;表示向某一方向传送信息的通道&#xff08;信道≠通信线路&#xff09;&#xff0c;一条通信线路在逻辑上往往对应一条发送信道和一条接收信道。

数盟IOS端可信ID

一、基本情况介绍 数盟IOS端可信ID介绍页: 数字联盟 数盟号称是还原出原生的IDFA, 但是苹果官网这么介绍&#xff1a; 用户开启跟踪允许跟踪后&#xff0c;APP才可以请求获取IDFA&#xff0c;且用户交互界面允许后&#xff0c;APP才能获取到IDFA. 官网给出的基本架构&#xf…