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
• 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主机错误等
相关文章:
I2C通信协议原理和MPU6050
一、串口通讯 只能在两个设备之间进行 若要三台设备两两通信,则每个设备得需要两组窗口,为3组相互独立的窗口通讯 为解决这个问题:设计了总线通讯,有多种,I2C为其中一种 二、I2C通信 (1&#…...
3.5 RDD持久化机制
一、RDD持久化 1、不采用持久化操作 查看要操作的HDFS文件 以集群模式启动Spark Shell 按照图示进行操作,得RDD4和RDD5 查看RDD4内容,会从RDD1到RDD2到RDD3到RDD4跑一趟 显示RDD5内容,也会从RDD1到RDD2到RDD3到RDD5跑一趟 2、采用持久化…...
Nginx(四)
部署LNMP架构动态网站WordPress LNMPLinuxNginxMySQLPhp 环境 192.168.29.141centos8Nginx1.24.0192.168.29.142centos8MySQL8.0.33192.168.29.143centos8Php7.2.24 关闭firewalld systemctl stop firewalld systemctl disable firewalld 关闭selinux setenforce 0 sed -ir…...
【fps系统重构】-观察cpu、memroy、io -iostat
当您使用iostat命令监控磁盘I/O情况时,可以查看以下指标: rrqm/s:每秒发生的读请求被合并的次数。如果该指标很低,说明读请求较少或未被合并,可能会导致磁盘I/O负载过重。wrqm/s:每秒发生的写请求被合并的…...
iptables 添加,删除,查看,修改,及docker运行时修改端口
一,安装并启动防火墙 [rootlinux ~]# /etc/init.d/iptables start 当我们用iptables添加规则,保存后,这些规则以文件的形势存在磁盘上的,以centos为例,文件地址是/etc/sysconfig/iptables,我们可以通过命令的方式去…...
Liunx安装Android Studio
Liunx安装Android Studio 可参考官方文档: 安装 Android Studio 如需在 Linux 上安装 Android Studio,请按以下步骤操作: 1.将您下载的 .zip 文件解压缩到您应用的相应位置,例如 /usr/local/ 中(用于用户个人资料&am…...
8、Linux C/C++ 实现MySQL的图片插入以及图片的读取
本文结合了Linux C/C 实现MySQL的图片插入以及图片的读取,特别是数据库读写的具体流程 一、文件读取相关函数 fseek() 可以将文件指针移动到文件中的任意位置。其基本形式如下: int fseek(FILE *stream, long offset, int whence);其中,str…...
【搭建轻量级图床】本地搭建LightPicture开源图床管理系统 - 异地远程访问
文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进,功能也越来越多,而手机…...
微信小程序全局路由拦截
前言 略 微信小程序全局路由拦截方法1 目前微信小程序没有全局路由拦截。要想实现全局路由拦截,需要自己进行扩充。具体参考这里:微信小程序–路由拦截器。 实现思路: 替换Page的参数对象的onShow或onLoad方法。在替换的onShow或onLoad方…...
截图自动添加水印(macOS/windows)
文章目录 1. 截图自动加水印1.1. windows1.2. macOS 2. 对已有图像批量加水印2.1 windows2.2 macOS 1. 截图自动加水印 1.1. windows 直接看这篇文章,一键截图自动生成水印/自动签名主要就是使用一个叫 SPX 的软件 1.2. macOS 其实apple的操作系统,i…...
大学四年,我建议你这么学网络安全
在所有关注我的朋友中,大致分为两类,一类是社会人士,有的是安全老手,有的是其它工作但对安全感兴趣的朋友,另一类应该就是大学生了。 尤其随着国家的号召和知识的普及,越来越多的人开始对网络安全感兴趣&a…...
Spring Boot整合Redis缓存并使用注解
Spring Boot整合Redis缓存并使用注解 在Spring Boot应用程序中,您可以使用Spring Cache库与Redis缓存进行集成,以提高应用程序的性能和响应速度。Spring Cache库提供了一组注解,包括Cacheable、CachePut和CacheEvict,可以方便地将…...
通知可以根据切入点表达式来进行增强,也可以根据自己的注解值来进行增强
通知可以根据切入点表达式来进行增强,也可以根据自己的注解值(例如 Before、After、Around 等)来进行增强。 如果要根据切入点表达式来进行增强,需要在通知注解中使用 Pointcut 注解来引用切入点表达式。例如,在以下示…...
<Python实际应用>做一个简单的签到投屏系统
公司接了个活,承办一个由团委组织的五四青年节徒步活动,其中一个环节是现场报名,来的人把名字填进去后随机分组,并显示在现场的LED大屏幕上,我自告奋勇用Python来开发这个小程序。这里记录一下 【项目需求】 1、报名…...
时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测
时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于贝叶斯(bayes)优化卷积神经网络-门控循环单元(CNN-GR…...
Baumer工业相机堡盟工业相机使用BGAPISDK将工业相机设为Burst模式以及该模式的优势以及行业应用(C++)
Baumer工业相机堡盟工业相机使用BGAPISDK将工业相机设为Burst模式以及该模式的优势以及行业应用(C) Baumer工业相机Baumer工业相机的Burst模式的技术背景Baumer工业相机使用BGAPISDK将设置Burst模式1.引用合适的类文件2.使用BGAPI SDK初始化相机设置Burs…...
BERT输入以及权重矩阵形状解析
以下用形状来描述矩阵。对于向量,为了方便理解,也写成了类似(1,64)这种形状的表示形式,这个你理解为64维的向量即可。下面讲的矩阵相乘都是默认的叉乘。 词嵌入矩阵形状:以BERT_BASE为例,我们知道其有12层Encoder&…...
3 个令人惊艳的 ChatGPT 项目,开源了!
过去一周,AI 界又发生了天翻地覆的变化,其中,最广为人知的,应该是 OpenAI 正式上线 ChatGPT iOS 客户端,让所有人都可以更方便的在手机上与 ChatGPT 聊天。 此外,Stable Diffusion 母公司 Stability AI 也…...
一、12.C++内存管理
C++内存管理 28.C++的内存管理 和C基本一致 代码区(Code Segment):也称为文本区,存放程序的可执行代码。 全局区(Global/Static Segment):存放全局变量、静态变量和常量。程序在编译后,分配这些数据的空间。 栈区(Stack Segment):存放函数调用时的参数、返回地…...
ensp实践dhcp服务
ensp实践dhcp服务 1、dhcp接口分配模式2、dhcp接口地址池分配模式3、dhcp布拉布拉布拉 1、dhcp接口分配模式 1.1、路由器AR1配置dhcp动态获取 <Huawei>system-view [Huawei]interface g0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 10.1.1.1 24 [Huawei-GigabitEthe…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

假设上述是主机给24C02发送数据: