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

news2024/9/21 4:21:59

步骤

一、配置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		0xD0

void 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);	//检测EV5
	
	
	I2C_Send7bitAddress(I2C2 , MPU6050_ADDRESS  ,I2C_Direction_Transmitter);	//发送7位地址
	MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);	//检测EV6
	
	I2C_SendData(I2C2 , RegAddress);	//发送数据
	MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTING);	//检测EV8
	
	I2C_SendData(I2C2 , Data);
	MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTED);	//检测EV8_2

	I2C_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);	//检测EV5
	
	I2C_Send7bitAddress(I2C2 , MPU6050_ADDRESS  ,I2C_Direction_Transmitter);	//发送7位地址
	MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);	//检测EV6
	
	I2C_SendData(I2C2 , RegAddress);	//发送数据
	MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_BYTE_TRANSMITTED);	//检测EV8
	
	I2C_GenerateSTART(I2C2 , ENABLE);	//重复起始条件
	MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_MODE_SELECT);	//检测EV5
	
	I2C_Send7bitAddress(I2C2 , MPU6050_ADDRESS  ,I2C_Direction_Receiver);	//接收7位地址
	MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED);	//检测EV6
	
	I2C_AcknowledgeConfig(I2C2 , DISABLE);	//设置ack=0
	I2C_GenerateSTOP(I2C2 ,ENABLE); //stop = 1 申请产生终止条件

	MPU6050_waitEvent(I2C2 , I2C_EVENT_MASTER_BYTE_RECEIVED);	//检测EV7
	Data = I2C_ReceiveData(I2C2);	//数值赋给Data

	I2C_AcknowledgeConfig(I2C2 , ENABLE);	//设置ack=1

	return 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.coloradmin.cn/o/2091850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL:复合查询

MySQL&#xff1a;复合查询 聚合统计分组聚合统计group byhaving 多表查询自连接子查询单行子查询多行子查询多列子查询from子查询 合并查询unionunion all 内连接外连接左外连接右外连接全外连接 视图 MySQL 复合查询是数据分析和统计的强大工具&#xff0c;本博客将介绍如何使…

黑马点评——商户查询缓存(P37店铺类型查询业务添加缓存练习题答案)redis缓存、更新、穿透、雪崩、击穿、工具封装

文章目录 什么是缓存&#xff1f;添加Redis缓存店铺类型查询业务添加缓存练习题 缓存更新策略给查询商铺的缓存添加超时剔除和主动更新的策略 缓存穿透缓存空对象布隆过滤 缓存雪崩解决方案 缓存击穿解决方案基于互斥锁方式解决缓存击穿问题基于逻辑过期的方式解决缓存击穿问题…

【教程】实测np.fromiter 和 np.array 的性能

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 函数简介 np.fromiter np.array 测试代码 实验结果 结果分析 实验总结 学长想说 函数简介 np.fromiter np.fromiter 是 NumPy 提供的一…

【SuperCraft AI:无限工作流画布】

SuperCraft AI&#xff1a;无限工作流画布 SuperCraft 是一款全新的 AI 工具。它具有将手绘草图转换为不同产品图像的功能&#xff0c;提供了一个无限大的协作画布&#xff0c;让设计师能够在此手绘草图&#xff0c;并利用生成式 AI 技术将草图转化为高质量的 2D 图像和 3D 渲…

NC 二分查找-II

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 请实现有重复…

Unity TreeView扩展

实现效果 这里原来是做的一个检测网络、事件回调耗时的工具。简单改了成了一个演示TreeView的demo。实现了TreeView的基本功能并且实现了对列的排序。TreeView还可以制作点击&#xff0c;双击&#xff0c;右键等事件&#xff0c;但这里暂时不需要用到。 思维导图 工程&#xf…

arcgisjs4.0 内网部署字体不显示问题处理

问题背景问题定位解决方案 问题背景 内网环境&#xff0c;通过压缩包的hash值验证了包是一摸一样的&#xff0c;ningx也读到了index.html&#xff0c;但是网格的字提显示出不来&#xff0c;并且地图上的注记文字均不显示 本地环境地图情况&#xff1a; 内网环境地图情况&…

Bluetooth: att protocol

一篇搞懂 ATT 支持的东西都有什么。 READ_BY_GROUP_TYPE_REQ/RSP 如下是 Spec 内容: The attributes returned shall be the attributes with the lowest handles within the handle range. These are known as the requested attributes.If the attributes with the requeste…

石油设备和相关机械都包涵那些?

关键字&#xff1a;钻杆测径仪&#xff0c;泵管测径仪&#xff0c;固井管道直线度测量仪&#xff0c;输送管测径仪&#xff0c;输送管检测设备&#xff0c; 石油设备是指在石油和天然气的勘探、开发、生产、储存和运输等过程中使用的各种机械和装置。这些设备通常包括但不限于…

黄力医生科普:如何有效预防冠心病,这几个保健措施不可少!

冠心病&#xff0c;作为心血管系统的一种常见病&#xff0c;主要因冠状动脉粥样硬化导致管腔狭窄或闭塞&#xff0c;进而引发心肌缺血缺氧。此病多发于中老年群体&#xff0c;且具有一定遗传性。然而&#xff0c;无论发病因素如何&#xff0c;我们都可以通过一系列有效的预防措…

C++类和对象(6)——初始化列表

一般的初始化 class A { public:A(int a){ //一般的初始化&#xff0c;在{}括号里面给成员变量赋值_a a;cout << _a << endl;}~A() {}private:int _a; }; 用 初始化列表 初始化 当成员变量是以下两种情况时&#xff0c; 必须使用初始化列表&#xff01; cons…

单自由度无阻尼系统振动分析

特别感谢&#xff1a;https://www.bilibili.com/video/BV114411y7ab/?p6&spm_id_frompageDriver&vd_sourceebe07816bf845358030fc92d23830b29 本文图片该系列视频 tips&#xff1a;关于特征方程与振动方程&#xff1a; 特征方程有助于我们理解和确定系统的固有频率和模…

【算法】贪心算法解析:基本概念、策略证明与代码例题演示

文章目录 1. 什么是贪心算法&#xff1f;2. 贪心算法的特点3. 例题&#xff08;贪心策略&#xff09;① 找零问题② 最小路径和③ 背包问题 4. 贪心策略证明 1. 什么是贪心算法&#xff1f; 在学习贪心算法之前&#xff0c;一定要理解的是贪心策略&#xff1a; 贪心策略是一种…

Ubuntu中qt类与类信号槽的创建及使用

今天学习到了新的一个小玩意&#xff0c;我们在QT中创建一个大项目的时候一般会创建多个类&#xff0c;那我们就来学习一下如何在自定义的类中声名和使用信号与槽函数。 首先我们CTRLn来创建我们新的类&#xff1a; 我们创建新的C的类&#xff0c;一个School&#xff0c;一个S…

举办知识竞赛是线上好还是线下好

举办知识竞赛线上和线下各有优势&#xff0c;选择哪种方式取决于具体的需求和条件。 线上举办知识竞赛的优缺点&#xff1a; 优点&#xff1a; 便捷性&#xff1a;线上竞赛不受地域限制&#xff0c;参与者可以在任何有网络的地方参与。 选手数&#xff1a;可以同时满足人数较…

单门店共享自习室小程序系统源码搭建对接门禁和空开api

共享自习室小程序&#xff0c;单门店共享自习室小程序&#xff0c;有源码&#xff0c;对接门禁和电控api接口&#xff0c;php开发语言&#xff0c;前端是uniapp。可以源码搭建&#xff0c;也可以二开或定制。 一 用户端 在线选择预约时间&#xff0c;选择座位&#xff0c;选择…

macOS搭建Python3.11+Django4.2.15的平台框架使用Poetry管理

最近想使用Python开发&#xff0c;使用Django框架搭建平台&#xff0c;之前没有使用过Python&#xff0c;所以记录下整个过程&#xff1a; 1、Python版本的选择&#xff0c;直接去官网【Download Python | Python.org】看最新稳定版是哪个版本&#xff0c;选择安装&#xff0c…

Ascend C算子开发(入门)—— 什么是算子?

文章目录 Ascend C算子开发&#xff08;入门&#xff09;—— 什么是算子&#xff1f;一、从人工智能到算子1.1 人工智能的四个层面1.2 人工智能之三大流派1.3 算子、神经元、神经网络 二、算子的基本概念2.1 算子在数学中的定义&#xff1a;2.2 算子基本概念 —— 总览2.3 算子…

利用clip模型实现text2draw

参考论文 实践 有数据增强的代码 import math import collections import CLIP_.clip as clip import torch import torch.nn as nn from torchvision import models, transforms import numpy as np import webp from PIL import Image import skimage import torchvision …

基于单片机的楼宇消防控制系统设计

本设计基于单片机的楼宇消防控制系统&#xff0c;主要包括温湿度检测模块、空气质量检测模块、火焰检测模块、ZigBee通信模块、报警模块和自动喷水模块。首先&#xff0c;系统通过温湿度检测模块实时监测楼道内的温湿度状况&#xff0c;以便及时掌握火灾发生前的环境变化。其次…