STM32利用软件I2C通讯读MPU6050的ID号

今天的读ID号是建立在上篇文章中有了底层的I2C通讯的6个基本时序来编写的。首先需要完成的就是MPU6050的初始化函数

   然后就是编写 指定地址写函数:
        一:开始
        二:发送 从机地址+读写位(1:读  0:写)
        三:接收应答位
        四:发送 指定寄存器地址(用于指定读写哪个寄存器)
        五:接收应答位
        六:发送(要写入指定寄存器下的数据)
        七:接收应答位
        八:终止

这个过程不是自己瞎编的,而是要根据MPU6050的时序图来确定的:

接下来要写的函数是指定地址读的函数:
        一:开始
        二:发送 从机地址+读写位
        三:接收应答位
        四:发送 指定寄存器地址(用于指定读哪个寄存器)
        五:接收应答位

        六:开始
        七:发送 从机地址+读写位1(1:读  0:写)
        八:接收应答位
        九:接收一个字节(此时,总线控制权交给从机)
        十:发送应答位(0:就是给从机应答(从机继续发数据)   1:就是不给从机应答(从机停止发数据))
      十一:终止

好了,到此读写MPU6050的基本操作就都完成了,剩下的事就是往不同的寄存器内写入不同的数据,实现不同的功能了,这个明天在学习吧,今天的代码贴出来看看吧:

#include "stm32f10x.h"                  // Device header
#include "MPU6050.h"
#include "MyI2C.h"#define   MPU6050_ADDRESS             0xD0 /*指定地址写函数:一:开始二:发送 从机地址+读写位(1:读  0:写)三:接收应答位四:发送 指定寄存器地址(用于指定读写哪个寄存器)五:接收应答位六:发送(要写入指定寄存器下的数据)七:接收应答位八:终止
*/
void MPU6050_WriteReg(uint8_t Address, uint8_t Data)
{MyI2C_Star();MyI2C_SendByte(MPU6050_ADDRESS);MyI2C_ReceiveAck();MyI2C_SendByte(Address);MyI2C_ReceiveAck();MyI2C_SendByte(Data);   //如果想实现指定地址写多个数据,可以在此处加循环,循环数据个数次MyI2C_ReceiveAck();     //每次循环都要加接收应答位MyI2C_Stop();
}/*指定地址读的函数:一:开始二:发送 从机地址+读写位三:接收应答位四:发送 指定寄存器地址(用于指定读哪个寄存器)五:接收应答位六:开始七:发送 从机地址+读写位1(1:读  0:写)八:接收应答位九:接收一个字节(此时,总线控制权交给从机)十:发送应答位(0:就是给从机应答(从机继续发数据)   1:就是不给从机应答(从机停止发数据))十一:终止*/
uint8_t MPU6050_ReadReg(uint8_t Address)
{uint8_t Data;MyI2C_Star();MyI2C_SendByte(MPU6050_ADDRESS);MyI2C_ReceiveAck();MyI2C_SendByte(Address);MyI2C_ReceiveAck();MyI2C_Star();MyI2C_SendByte(MPU6050_ADDRESS | 0x01);MyI2C_ReceiveAck();Data = MyI2C_ReceiveByte();MyI2C_SendAck(1);MyI2C_Stop();return Data;
}void MPU6050_Init(void)
{MyI2C_Init();
}

写了一个MPU6050.h文件,方便测试一下今天的功能:

#ifndef __MPU6050_H
#define __MPU6050_Hvoid MPU6050_Init(void);uint8_t MPU6050_ReadReg(uint8_t Address);void MPU6050_WriteReg(uint8_t Address, uint8_t Data);#endif

然后就是主函数调用一下,验证结果了:

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "MPU6050.h"
#include "MPU6050_Reg.h"int main(void)
{OLED_Init();       //oled  屏幕初始化MPU6050_Init();uint8_t ID = MPU6050_ReadReg(MPU6050_WHO_AM_I);OLED_ShowHexNum(1,1, ID, 2);while(1){}
}

编译下载后的结果如图:

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

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

相关文章

ESP-IDF移植lvgl 驱动 ST7789

文章目录 1 前言2 准备3 移植LVGL3.1 工程准备3.2 修改 CMakeLists.txt文件编译 LVGL3.3 编译LVGL 4 编译 ST7789 LCD驱动5 发现问题 1 前言 本教程开始学习 LVGL的,开始之前要把环境配置好,首先就需要移植 lvgl,使用的是 esp32 环境&#xf…

kafka学习记录

文章目录 windows单机版kafka搭建步骤主题的增删改查操作消息的生产与消费 Windows集群版kafka搭建步骤 prettyZoo 尚硅谷Kafka教程,2024新版kafka视频,零基础入门到实战 【尚硅谷】Kafka3.x教程(从入门到调优,深入全面&#xff0…

plsql developer 一键格式化sql/美化sql

PL/SQL 格式化工具 以 Oracle SQL Developer 为例,使用一键格式化的步骤如下: 打开 Oracle SQL Developer。在“文件”菜单中,选择“打开文件”,然后选择你的 PL/SQL 文件。打开文件后,你可以通过右键菜单选择“格式…

vue3 知识点的补充 之 第一节

01 vue2与vue3的区别 vue2 采用object.defuneProperty()实现 对数组不友好 重写了数组的方法,同时无法监听数组length长度的改变。对于对象只能劫持设置好的数据 新增需要使用vue.set vue3 采用proxy进行代理,不需要重写数组的方法 同时可以监听数组长度…

gdb相关指令

背景知识 通过上图,可以看到,gcc 和 g 默认形成的可执行程序是release的!!!故无法直接被调试。因此带 -g 选项表示使用 Debug 模式进行编译,而且我们可以看到,Debug 模式下编译形成的可执…

OSCP靶场--ClamAV

OSCP靶场–ClamAV 考点 1.nmap扫描 ##┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.153.42 -p- -Pn --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-13 10:01 EDT Nmap scan report for 192.168.153.42 Host is up (0.24s latency). N…

Ubuntu去除烦人的顶部【活动】按钮

文章目录 一、需求说明二、打开 extensions 网站三、安装 GNOME Shell 插件四、安装本地连接器五、安装 Hide Activities Button 插件六、最终效果七、卸载本地连接器命令参考 本文所使用的 Ubuntu 系统版本是 Ubuntu 22.04 ! 一、需求说明 使用 Ubuntu 的过程中,屏…

VNC Viewer 连接远程主机及常见错误处理(The connection closed unexpectedly)

搭建可接收vnc连接的环境 1、下载镜像 https://github.com/fcwu/docker-ubuntu-vnc-desktop 该镜像是含有ubuntu 通过docker运行的桌面环境,并接受vnc 的连接 docker pull dorowu/ubuntu-desktop-lxde-vnc 2、运行容器 1)只暴露容器的80端口&#…

二叉树练习day.9

669.修剪二叉搜索树 链接:. - 力扣(LeetCode) 题目描述: 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变…

Singleton单例设计模式详解

目录 模式定义应用场景实现方式1.懒汉模式:2.饿汉模式:3.静态内部类反射如何防止反射攻击破坏? 枚举类型序列化 部分源码中的应用定位Spring & JDKTomcat反序列化指定数据源 模式定义 保证一个类只有一个实例,并且提供一个全…

pytorch车牌识别

目录 使用pytorch库中CNN模型进行图像识别收集数据集定义CNN模型卷积层池化层全连接层 CNN模型代码使用模型 使用pytorch库中CNN模型进行图像识别 收集数据集 可以去找开源的数据集或者自己手做一个 最终整合成 类别分类的图片文件 定义CNN模型 卷积层 功能:提…

Chatgpt掘金之旅—有爱AI商业实战篇|播客剧本写作|(十三)

演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 一、AI技术创业播客剧本写作服务有哪些机会? 人工智能(AI)技术作为当今科技创新的前沿领域,为创业者提供了广阔的机会和挑战。…

b站江科大stm32笔记(持续更新)

b站江科大stm32笔记(持续更新) 片上资源/外设引脚定义表启动配置推挽开漏oc/od 门漏极/集电极 电阻的上拉下拉输入捕获输入捕获通道主从触发模式输入捕获基本结构PWMI基本结构PWMPSC ARR CRR输入捕获模式测频率TIM_PrescalerConfig()初始化输入捕获测频法…

mysql四种引擎区别

MySQL 提供了多种不同的数据库引擎,其中最常见的有 MyISAM、InnoDB、MEMORY 和 BLACKHOLE。这四个引擎分别有以下特点: 1. MyISAM MyISAM 是 MySQL 的默认引擎。它对于只有较少的修改、大量读取的应用场景具有良好的性能。它不支持事务处理,也…

Steam平台游戏发行流程

Steam平台游戏发行流程 大家好我是艾西,一个做服务器租用的网络架构师也是游戏热爱者,经常在steam平台玩各种游戏享受快乐生活。去年幻兽帕鲁以及雾锁王国在年底横空出世,幻兽帕鲁更是在短短一星期取得了非常好的成绩,那么作为游戏…

你的系统是如何跟MySQL打交道的

1、Java 工程师眼中的数据库是什么东西? 从今天开始,我们将要开始一个MySQL的专栏,一起来研究MySQL数据库的底层原理和各种实践案例,以及互联网公司的技术方案。 现在我们先来看看,在一个Java工程师眼中的数据库是什么东西? 平时…

【Godot4.2】CanvasItem绘图函数全解析 - 5.绘制字符和字符串

概述 到这一节为止,我们已经学习了如何在CanvasItem中绘制简单几何图形、图片以及样式盒。但是对于很重要的文字一直没有涉及。 本节就来讲一下字符和字符串绘制函数,以及替换它们的两个类。 系列目录 0.概述1.绘制简单图形2.设定绘图变换3.绘制纹理4…

解决vue3更新chunk包后,点击页面报错

出现错误 解决思路 试了好多方法,跳了很多坑,router版本对不上,解决方案不实用。最后我直接捕获异常,刷新页面,解决最快最有效。 // vue-rotuer版本 "vue-router": "^4.0.3"解决方案 在router/…

路由器配置实验--R1---R5

R1的路由表中默认存在:192.168.1.0192.168.3.0 需要添加:192.168.2.0 4.0 5.0 R2的路由表中默认存在:192.168.1.0192.168.2.0需要添加:192.168.3.0 4.0 5.0 R3的路由表中默认存在:192.168.3.0192.168.4.0需要添加: 1.0 2.0 5.0 R4的路由表中默认存在:192.168.2.0 192.168.4.0…

面试算法-164-K 个一组翻转链表

题目 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节点内…