I2C通信协议原理和MPU6050

一、串口通讯

      只能在两个设备之间进行
      若要三台设备两两通信,则每个设备得需要两组窗口,为3组相互独立的窗口通讯
      为解决这个问题:设计了总线通讯,有多种,I2C为其中一种

 二、I2C通信

(1)特点

1、同步、半双工

2、带数据应答

3、支持总线挂载多设备(一主多从、多主多从)

4、可以是软件IC和硬件IC

(2)时钟线和数据线 

1、主机:任何情况下,主机完全掌握SCL线,在空闲状态下,主机可以主动发起对SDA控制,只有在从机发送数据和从机应答时,主机才会转交SDA的控制权给从机

2、SCL时钟线在任何时刻都只能被动的读取,从机不允许控制SCL线,
3、SDA数据线,从机不允许主动发起对SDA的控制,只有在主机发送读取从机的命令后,从机应答的时候,从机才能短暂的获取SDA的控制权

4、主机拥有SCL的绝对控制权,所以主机的SCL可以配置成推挽输出,所有从机的SCL都配置成浮空输入或者上拉输入

5、为了实现输出输入半双工,避免总线没协调好导致电源短路,I2C规定禁止所有设备输出强上拉的高电平,采用外置若上拉电阻加开漏输出的电路

6、SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

(3)SCL和SDA的状态

当SCL和SDA都为高电平,为空闲状态时(起始和终止都是由主机产生的,故空闲时,从机始终放开)

当SCL为高电平,SDA为下降沿的的状态时,为开始发送数据,起始发送数据完成

当SCL为高电平,SDA为上升沿的的状态时,为数据发送完成

发送数据的过程为下图

 

当时钟线为高电平时,数据线上的数据必须保持稳定,比如时钟线为高时,数据线上的数据始终为高,完成逻辑1的传输,保持低电平则为0。(主机在接受之前,需要释放SDA,释放SDA相当于切换成输入模式,所有设备和主机都处于输入模式,当主机需要发送时,就可以主动去拉低SDA,而主机在接收的时候,必须主动释放SDA)

(4)例子:单片机向从设备写信息

 假设上述是主机给24C02发送数据:
 由上图可知:
24C02的设备地址位1010 000,主机在24C02的 0000 0000的存储位置写入0000 1111的数据

(1)读写数据位:读数据置1,写数据置0

(2)第一个应答信号:信号时由从机发送给主机,如果从机收到之前的信息,回复0,没有收到或者(主机)读取接收完成回复1

(3)第二个应答信号:单片机需要存储器返回一个应答信号

(4)第三个应答信号:发送完数据后,需要再给主机发送应答信号0,告诉主机写入成功

(5)最后写入停止位:SCL为高电平,SDA为上升沿

(5)读数据帧

 

        前半部分:指定地址写(但没来得及写),后半部分,指定地址读

        首先写入设备地址,然后写数据,

        接下来写寄存器的地址,在收到从机的应答信号之后,主机再发送一个起始号,       

        再发送一遍设备地址,然后才能发送读数据,接下来,存储器会把寄存器中的数据发送给单片机。

        最后一部分的数据可以多来几个,就可以写多个数据,地址指针在读后会自增,就可以连续读出一片区域的寄存器,效率也会变高。

        主机给应答:从机就会继续发,主机给非应答,从机不会再法发,交出SDA的控制权,从机控制SDA发送一个字节的权力,开始于读写标志位1,结束于主机给应答位为1

(6)开漏输出和推挽输出

 

任何设备在任何时刻都可以输入,但在输出部分,采用的是开漏输出
推挽输出:上面一个开关管接到正极,下面一个开关管接到负极,上面导通输出高电平,下面导通输出低电平,因为这是通过开关管直接接到正极和负极的,所以这个是强上拉和强下拉的模式
开漏输出:去掉强上拉的开关管,输出低电平时下面导通是强下拉,输出高电平时,下面断开但是没有上管了,引脚浮空,故所有设备只能输出低电平而不能输出高电平

 

为了避免高电平造成的引脚浮空,需要在总线外面SCL和SDA各置一个上拉电阻,弱上拉
开漏加弱上拉模式:同时兼具的输入和输出的功能
要输出时,就去拉杆子或者放手操作杆子变化就行了
要输入时,就直接放手然后观察杆子高低就行了
因为开路模式下,输出高电平就相当于断开硬件,所以在输入之前可以直接输出高电平,不需要再切换成输入模式
第三就是这个模式会有个“线与”的现象,只要有任意一个或多个设备,输出了低电平,,总线就处于低电平
只有所有的设备都输出高电平,总线才处于高电平

(7) 两个实验

1、介绍协议规则,用软件模拟的形式实现协议(AT24C02存储器模块)

通过数据线,实现单排年纪读写外挂模块寄存器的功能

在指定的位置写寄存器,对外挂模块进行配置

在指定的位置度寄存器,获取外挂模块的数据,读出的数据会显示显示屏上
本节课程主要有两个代码
1、软件I2C读写MPU6050
2、硬件I2C读写MPU6050
代码实现的效果是一样的
软件I2C读写MPU6050的程序现象
通过软件I2C协议对MPU6050(在本实验中ID号为0x68)芯片内部的寄存器进行读写
写入到配置寄存器,可以对外挂的模块及进行配置
读出数据寄存器,可以获取外挂的数据
最终显示在屏幕上
最上面:id号
左边:加速度传感器的输出数据(x轴y轴和z轴的加速度)
右边:陀螺仪传感器的输出数据(x轴y轴和z轴的角速度)
改变MPU6050传感器的姿态,6个数据就会对应变化

(8)异步时序和同步时序

a、异步时序

1、好处:省一根时钟线,节省资源

2、坏处:对时钟要求严格,发送方和接收方时钟不能由过大的偏差

传输过程中,单片机进中断,发送方时序暂停,接受方仍会按照约定的速率读取,传输出错

故异步时序的缺点:非常依赖硬件外设的支持,必须有USART电路才能方便的使用,否则很难用软件模拟。 

b、同步时序(时钟要求不严格,对电路依赖度低)

1、设计时钟线,则对传输的时间要求变低

2、在单方面暂停传输时,时钟线也暂停,传输双方都能定格在暂停的时刻,可过段时间再来继续,

3、极大的降低单片机对硬件电路的依赖,没有硬件电路的支持,也可以很方便的用软件手动翻转电平来实现通信

三、MPU6050

(1)MPU6050简介

• MPU6050 是一个 6 轴姿态传感器,可以测量芯片自身 X 、 Y 、 Z 轴的加速度、角速度参数,通过数据融合,可进一步得到姿态角,常应用于平衡车、飞行器等需要检测自身姿态的场景
• 3 轴加速度计( Accelerometer ):测量 X 、 Y 、 Z 轴的加速度
• 3 轴陀螺仪传感器( Gyroscope ):测量 X 、 Y 、 Z 轴的角速度

 (2)MPU6050参数

• 16 位 ADC 采集传感器的模拟信号,量化范围: -32768~32767
• 加速度计满量程选择: ±2 、 ±4 、 ±8 、 ±16 ( g )
• 陀螺仪满量程选择: ±250 、 ±500 、 ±1000 、 ±2000 ( °/sec )
• 可配置的数字低通滤波器
• 可配置的时钟源
• 可配置的采样分频
•I2C从机地址:1101000(AD0=0)
                                    1101001(AD0=1)

例如从机地址为0x68,(0x68<<1)|1(或者(0x68<<1)|0)当作从机地址,因为传输的时候是8个字节,前七个是地址,最后一位是数据读写位

若物体运动剧烈,选择大量程,防止加速度或角速度超出了量程
若物体运动平缓,选择小量程,则测量的分辨率比较大
满量程越大测量范围就越广
满量程越小测量分辨率就越高
 满量程和加速度是线性关系
可配置数字低通滤波器:配置寄存器对输出数据进行低通滤波,消除数据抖动,使数据输出平缓
时钟源通过分频器的分频,可以为AD转换,给内部其他电路提供时钟
控制分频系数就可以控制AD转换的快慢

(3)MPU6050硬件电路

 

 

 a、左上角LDO

  • 为低压差线性稳压器,输入端可以是3.3V到5V,经过后输出稳定3.3V的电压

 b、右下角J1 CON1模块

左下角XCL和XDA通常就是用于外接磁力计或者气压计(在无人机需要定高飞行需要增加气压计的时候使用)
当接上磁力计或气压计之后,MPU6050的主机接口可以直接访问这些扩展芯片的数据
把这些扩展芯片的数据读取到MPO6050里面,在MPO6050里面会有DMP单元,进行数据融合和姿态解算
若不需要MPO6050的解算功能,可以把磁力计或气压计直接挂载在SCL和SDA总线上
AD0引脚:是从机地址的最低位,接低电平时候,7为从机地址为110 1000,接高电平时,7位从机地址是110 1001,AD0接了一个电阻,故悬空是低电平状态,若想要接高电平,可以把AD0直接引导VCC上,强上拉至高电平
INT:中断输出引脚,可以配置芯片内部的一些事件来触发中断引脚的输出
比如数据准备好了、I2C主机错误等

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware虚拟机三种网络模式详解之NAT(地址转换模式)

VMware虚拟机三种网络模式详解 NAT&#xff08;地址转换模式&#xff09; 二、NAT&#xff08;地址转换模式&#xff09; 刚刚我们说到&#xff0c;如果你的网络ip资源紧缺&#xff0c;但是你又希望你的虚拟机能够联网&#xff0c;这时候NAT模式是最好的选择。NAT模式借助虚拟…

进攻即是最好的防御!19个练习黑客技术的在线网站

前言 进攻即是最好的防御&#xff0c;这句话同样适用于信息安全的世界。这里罗列了19个合法的来练习黑客技术的网站&#xff0c;不管你是一名开发人员、安全工程师、代码审计师、渗透测试人员&#xff0c;通过不断的练习才能让你成为一个优秀安全研究人员。以下网站希望能给各…

Hadoop基础学习---5、MapReduce概述和WordCount实操(本地运行和集群运行)、Hadoop序列化

1、MapReduce概述 1.1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个Had…

【计算机系统基础bomb lab】CSAPP实验:Bomb Lab

【计算机系统基础bomb lab】CSAPP实验&#xff1a;Bomb Lab CSAPP 实验&#xff1a;Bomb Lab实验内容简述实验环境实验过程&#xff1a;phase 1phase 1 调试过程 实验过程&#xff1a;phase 2phase 2 调试过程 实验过程&#xff1a;phase 3phase 3 调试过程 实验过程&#xff1…

Java字符串知多少:String、StringBuffer、StringBuilder

一、String 1、简介 String 是 Java 中使用得最频繁的一个类了&#xff0c;不管是作为开发者的业务使用&#xff0c;还是一些系统级别的字符使用&#xff0c; String 都发挥着重要的作用。String 是不可变的、final的&#xff0c;不能被继承&#xff0c;且 Java 在运行时也保…

C++的cout详解

2023年5月20日&#xff0c;周六早上&#xff1a; 我发现我找不到非常详细的cout类的成员函数&#xff0c;只好自己写了。 不定期更新。 cout的继承关系 cout类继承自ostream类&#xff0c;ostream类继承自ios类&#xff0c;ios类继承自ios_base类 cout类拥有的所有成员函数 …

pg事务:事务的处理

事务的处理 事务块 从事务形态划分可分为隐式事务和显示事务。隐式事务是一个独立的SQL语句&#xff0c;执行完成后默认提交。显示事务需要显示声明一个事务&#xff0c;多个sql语句组合到一起称为一个事务块。 事务块通过begin&#xff0c;begin transaction&#xff0c;st…

QT学习记录(三)绘图

按照下面两个教程学习 QT学习教程&#xff08;全面&#xff09;_Strive--顾的博客-CSDN博客_qt学习 天山老妖S的博客_QT开发(3)_51CTO博客 1、绘图 VC项目右键增加QT GUI Class&#xff0c;在QT Designer中编辑DlgDraw.ui 在DlgDraw中重载函数 void DlgDraw::paintEvent(Q…

C++之堆排

堆排的原理和结构&#xff1a; 堆排序是一种常见的排序算法&#xff0c;基于堆这种数据结构实现。堆是一种特殊的树形数据结构&#xff0c;它满足以下两个条件&#xff1a; 堆是一棵完全二叉树。 堆的任意节点的值&#xff0c;都必须大于等于&#xff08;或小于等于&#xff0…

基于ROS2的costmap中Obstacle Layer中对障碍物信息的增加与删除机制的方案调研。

文章目录 1.背景2.目标3. 障碍物信息添加方式发送数据的数据结构与接收数据的数据结构 4. 障碍物清理机制4.1 可调参数4.2 优化光追算法4.3 障碍物跟踪 1.背景 基于costmap地图&#xff0c;使用navigation导航时&#xff0c;会出现由于激光雷达/图像测距的局限性&#xff0c; …

由浅入深Netty粘包与半包解决方案

目录 1 粘包现象2 半包现象3 现象分析4 解决方案4.1 方法1&#xff1a;短链接4.2&#xff1a;方法2&#xff1a;固定长度4.3 方法3&#xff1a;固定分隔符4.4 方法4&#xff1a;预设长度 1 粘包现象 服务端代码 public class HelloWorldServer {static final Logger log Logg…

【libcurl 】win32 构建 Release版本 修改cmakelist 链接openssl1.1.*

以下库均已MD的构建以vs2019 V142构建MD构建 直接换用了一个openssl库,libcurl连接报错 $(ProjectDir)..\..\..\3rdparty\openssl\xdw_openssl1_1_1\lib\win32\libcrypto.lib

【Unity】 UI自适应案例

UI自适应案例 案例一:背包自动布局1. 创建背包面板2. 背包子项自动布局3. C#代码:动态添加子项到背包中案例二:文字自适应高度1. 创建文字面板2. 组件基本设置3. C#代码:动态更新文字并自适应高度案例一:背包自动布局 需求:动态添加背包组件,设定每行特定个数并自动匹配…

C++学习之路-变量和基本内置类型

变量和基本内置类型 一、基本内置类型1.1 算数类型1.2 带符号类型和无符号类型1.3 类型转换含有无符号类型的表达式 1.4 字面值常量整形和浮点型字面值字符和字符串字面值转义序列指定字面值的类型 二、变量2.1 变量的定义初始化列表初始化默认初始化 2.2 变量声明和定义的关系…

彻底理解粘性定位 - position: sticky(IT枫斗者)

彻底理解粘性定位 - position: sticky 介绍 粘性定位可以被认为是相对定位(position: relative)和固定定位(position: fixed)的混合。元素在跨越特定阈值前为相对定位&#xff0c;之后为固定定位。例如: .sticky-header { position: sticky; top: 10px; }在 视口滚动到元素…

python处理字符串、文本实例及注释

1、多个界定符切割字符串 代码 line = asdf fjdk; afed, fjek,asdf, foo import re re.split(r[;,\s]\s*, line) 结果 在上面的例子中,分隔符可以是逗号,分号或者是空格,并且后面紧跟着任意个的空格。只要这个模式被找到,那么匹配的分隔符两边的实体都会被当成是结果中…

【数据结构与算法】- 期末考试

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

可算是熬出头了,测试6年,费时8个月,入职阿里,涨薪14K

前言 你的努力&#xff0c;终将成就无可替代的自己。 本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事点点点的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;说实话这不是自己想要的状态。 一年半…

在 Android 手机上恢复出厂设置后恢复照片的 4 种简单方法(新方法)

“嗨&#xff0c;谁能帮我恢复我的照片&#xff0c;因为我不小心恢复了出厂设置&#xff0c;而且我没有做备份&#xff1f;几个月来我一直试图通过使用恢复软件来恢复我的照片&#xff0c;root 了一个深扫描&#xff0c;但没用……” 恢复出厂设置可以清除电子设备的所有信息并…

Linux安装Redis数据库,无需公网IP实现远程连接

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 转发自cpolar内网穿透的文章&#xff1a;公网远程连接…