I2C通信协议

I2C通信协议

项目要求是,通过通信线,是实现单片机读写外挂模块寄存器的功能,至少实现,在指定位置写寄存器和在指定位置读寄存器,实现了读写寄存器,就实现对模块的控制。
在这里插入图片描述
MPU6050,OLED,AT24C02(存储器模块),DS3231(实时时钟模块)

一主多从指单片机作为主机主导I2C总线的运行,挂载在I2C总线上的所有设备都是从机,只有主机允许才可以控制I2C总线;多主多从是指多个主机,任何一个模块都可以作为主机,当冲突时对其进行仲裁,谁胜利谁成为主机。

作为一个通信协议,I2C必须在硬件和软件上作出规定。硬件上的规定包括电路的连接方式、端口的输入输出模式等;软件上的规定包括时序的定义、字节的传输方式、高位先行还是低位先行等。这些硬件和软件的规定结合起来构成了一个完整的通信协议。

硬件电路

在这里插入图片描述

在这里插入图片描述
主机永远拥有SCL时钟线的控制权,在空闲时可以主动操控SDA线,也可以将SDA线的控制权交给从机;从机权力较小,永远只能被动的读取SCL线,不允许控制,从机不允许主动发起对SDA的控制,只有在主机发送从机读取的命令后或者从机应答的时候从机才能短暂的取得SDA的控制权。这就是一主多从模型中协议的规定。

如果总线时序没有协调好,就极有可能发生两个引脚同时处于输出的状态。如果此时一个引脚输出高电平,一个引脚输出低电平,就会造成电源短路的情况,这是要极力避免的。

为了避免这种情况,I2C的设计规定所有设备不输出强上拉的高电平,而是采用外置弱上拉电阻加开漏输出的电路结构。这两点规定对应于前面提到的“设备的SCL和SDA均要配置成开漏输出模式”以及“SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右”。对应上面这个图。

引脚内部结构图

在这里插入图片描述
图左侧展示的是SCL的结构,其中SClk代表SCL;右侧则是SDA的结构,其中DATA代表SDA。

引脚的信号输入都可以通过一个数据缓冲器或施密特触发器进行,因为输入对电路无影响,所以任何设备在任何时刻都可以输入。然而,在输出部分,采用的是开漏输出的配置。

输出低电平,这个开关管导通,引脚直接接地,是强下拉,输出高电平,这个开关管断开,引脚什么都不接,处于浮空状态,这样的话,所有的设备都只能输出低电平而不能输出高电平,为了避免高电平造成的引脚浮空,这时就需要在总线外面,SCL和SDA各外置一个上拉电阻,这是通过一个电阻拉到高电平的,所以这是一个弱上拉。

  • 第一,完全杜绝了电源短路现象,保证电路的安全。
    第二,避免了引脚模式的频繁切换。开漏加弱上拉的模式,同时兼具了输入和输出的功能。因为开漏模式下,输出高电平就相当于断开引脚,所以在输入之前,可以直接输出高电平,不需要再切换成输入模式了。
    第三,就是这个模式会有一个“线与”的现象。就是只要有任意一个或多个设备输出了低电平总线就处于低电平,只有所有设备都输出高电平,总线才处于高电平。
    I2C可以利用这个电路特性执行多主机模式下的时钟同步和总线仲裁,所以这里SCL虽然在一主多从模式下可以用推挽输出,但是它仍然采用了开漏加上拉输出的模式,因为在多主机模式下会利用到这个特征。

I2C时序基本单元

在这里插入图片描述
起始条件是指SCL高电平期间,SDA从高电平切换到低电平。在I2C总线处于空闲状态时,SCL和SDA都处于高电平状态,由外挂的上拉电阻保持。当主机需要数据收发时,会首先产生一个起始条件。这个起始条件是,SCL保持高电平,然后把SDA拉低,产生一个下降沿。当从机捕获到这个SCL高电平,SDA下降沿信号时,就会进行自身的复位,等待主机的召唤。之后,主机需要将SCL拉低。这样做一方面是占用这个总线,另一方面也是为了方便这些基本单元的拼接。这样,除了起始和终止条件,每个时序单元的SCL都是以低电平开始,低电平结束。

**终止条件是,SCL高电平期间,**SDA从低电平切换到高电平。SCL先放开并回弹到高电平,SDA再放开并回弹高电平,产生一个上升沿。这个上升沿触发终止条件,同时终止条件之后,SCL和SDA都是高电平,回归到最初的平静状态。这个起始条件和终止条件就类似串口时序里的起始位和停止位。一个完整的数据帧总是以起始条件开始、终止条件结束。另外,起始和终止都是由主机产生的。因此,从机必须始终保持双手放开,不允许主动跳出来去碰总线。如果允许从机这样做,那么就会变成多主机模型,不在本节的讨论范围之内。这就是起始条件和终止条件的含义。

发送一个字节
在这里插入图片描述
主机拉低SCL,把数据放在SDA上,主机松开SCL,从机读取SDA的数据。
在SCL的同步下,依次进行主机发送和从机接收,循环8次,就发送了8位数据,也就是一个字节,另外注意,这里是高位先行,所以第一位是一个字节的最高位B7,然后依次是次高位B6…最后是B0。(串口时序是低位先行,I2C是高位先行)
另外,由于这里有时钟线进行同步,所以如果主机一个字节发送一半,突然进中断,不操作SDA,SCL,那时序就会在中断不断拉长,SDA,SCL电平都暂停变化,传输也暂停,等中断结束后,主机继续回来操作,传输仍然不会出问题,这就是同步时序的好处。

接收一个字节
在这里插入图片描述
发送应答和接收应答

在这里插入图片描述

I2C的完整时序

主要有指定地址写,当前地址读和指定地址读这3种。
I2C总线上每个从机都确定一个唯一的设备地址,主机在起始条件之后会先发送一个字节确认相应的设备地址,相应的设备响应之后的读写操作,MPU6050地址为1101000

在这里插入图片描述
首先,SCL高电平期间,拉低SDA,产生起始条件(start,s),在起始条件后,紧跟着时序,必须是发送一个字节的时序,字节的内容,必须是从机地址+读写位,正好从机地址是7位,读写位是1位,加起来是1个字节,8位,发送从机地址,就是确定从机的对象。发送读写位,就是确认接下来要写入还是读出。在这里低电平期间,SDA变换数据,高电平期间,从机读取SDA。绿色的线,标明从机得到的数据。然后就是1101000,0表示之后的时序主机要进行写操作,1表示之后的时序主机要进行读出操作,这里是0说明之后要进行写操作。
那这里,目前主机是发送一个字节,字节的内容转换为16进制,高位先行,就是0xD0,然后根据协议规定,紧跟着单元是,就是接收从机的应答位,在这个时刻,主机要释放SDA,释放SDA后,引脚电平回弹到高电平,但是根据协议规定,从机要在这个位拉低SDA,所以从机的波形是这样的,该应答的时候,从机立刻拽住SDA,然后应答结束后,从机在放开SDA,现在综合两者的波形,结合线与的特性,在主机释放SDA后,由于SDA被从机拽住了,SDA没有回弹高电平,这个过程代表从机产生了应答。

在这里插入图片描述
在这里插入图片描述

首先,SCL高电平期间,拉低SDA,产生起始条件(start,s),起始条件开始后,主机必须首先调用发送一个字节,来进行从机的寻址和指定读写标志位。图示的波形,表示本次寻址的目标是1101 000的设备,同时最后一位,读写标志为1,表示主机接下来想要读取数据,紧跟着,发送一个字节后,接收一下从机的应答位。从机应答0,代表从机收到一个字节。
在从机应答后,从这里开始,数据的传输方向就要反过来了,因为主机发出了读的命令,所以之后,主机就不能继续发送了,要把SDA控制权交给从机,主机调用接收一个字节的操作,进行接收操作。

指定地址读=指定地址写+当前地址读
在这里插入图片描述
该时序下从中间红线分割,前半部分为指定地址写在写之前的时序,后半部分为当前地址读的时序,因为在前半部分中指定了地址,所以可以读出指定地址的数据。

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

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

相关文章

【ARM】Fusa Compiler 6.16 LTS的安全认证报告获取

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 了解ARM的Arm Compiler for Embedded FuSa 6.16 LTS的安全认证证书和报告的获取 2、 问题场景 对于使用了ARM DS Gold/Platinum、MDK pro或者Arm Compiler for Embedded FuSa 6.16 LTS产品的客户。在对于最终的产品…

生产问题排查:springboot项目启动时注册nacos失败或运行时从nacos闪退

文章目录 一、引出问题二、解决方案1、使用actuator健康检查2、项目启动时判断nacos是否正常连接3、k8s设置探针 一、引出问题 生产项目是用k8s部署的,最近经常遇到启动时注册不到nacos(查找nacos的host地址找不到),或者运行的好…

有文字转语音真人发声吗?这5个配音工具堪比真人配音

青春是一首永不老去的歌,它镌刻在生命的唱片上,永不退色。 每当我们听到那些熟悉的旋律,心中总会涌起一股暖流,仿佛回到了那个充满活力和梦想的年代。借助现代科技的力量,我们可以通过文字转语音软件,让这…

.NET集成DeveloperSharp实现图片的裁剪、缩放、与加水印

🏆作者:科技、互联网行业优质创作者 🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 🏆欢迎关注我(Net数字智慧化基地),里面…

Apache Doris 基础 -- 数据表设计(表索引)

1、索引概述 索引用于帮助快速过滤或搜索数据。目前,Doris支持两种类型的索引:内置智能索引和用户创建的二级索引。 内置智能索引 排序键和前缀索引:Apache Doris基于排序键以有序的方式存储数据。它为每1024行数据创建一个前缀索引。索引中的键是当前1024行组的…

github搭建个人博客

准备工作 windows安装nodejs windows安装git windows安装hexo 拥有gitee个人账户 配置信息 通过gitee创建博客仓库 登录gitee平台,进入主界面,右侧加号,新建仓库,注意:仓库名称和gitee用户名称一致 生成/添加 SSH 公…

初级网络工程师之入门到入狱(一)

本文是我在学习过程中记录学习的点点滴滴,目的是为了学完之后巩固一下顺便也和大家分享一下,日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、交换机二、路由器三、DHCP(动态主机配置协议)四、路由器配置 DHCP自…

【golang】go语言读取Excel表格中的数据

导入库基本用法封装 在Go语言中,可以使用第三方库来读取Excel文件。 常用的库是github.com/tealeg/xlsx,提供了处理Excel文件的功能。 导入库 首先,安装"github.com/tealeg/xlsx"库。可以通过以下命令在终端中安装: g…

Transformer系列:Greedy Search贪婪搜索解码流程原理解析

解码器预测流程简述 Encoder-Decoder这类框架需要在解码器中分别拿到前文已经翻译的输入,以及编码器的输出这两个输入,一起预测出下一个翻译的单词。在训练阶段,一个句子通过右移一位的方式转化为从第二个词到最后一个词的逐位预测任务&…

Springboot vue elementui 前后端分离 事故灾害案例管理系统

源码链接 系统演示:https://pan.baidu.com/s/1hZQ25cpI-B4keFsZdlzimg?pwdgw48

【Golang】go语言写入数据并保存Excel表格

导入包创建文件添加表格添加行添加单元格保存文件封装 导入包 首先,安装github.com/tealeg/xlsx库。可以通过以下命令在终端中安装: go get github.com/tealeg/xlsx创建文件 指定好文件的名字 fileName : "D:\\a.xlsx"再判断文件是否存在&…

Java集合概述

分类 分为两大类:Collection接口类和Map接口类 这两个接口都继承自一个共同的接口:Iterable接口,意为可迭代的 Iterable接口当中有一个Iterator迭代器接口对象,作为接口的变量(public static final修饰)…

Win10字体模糊?记好这5个方法,解决问题很简单!

“我的电脑是win10的,不知道是什么原因,电脑字体总是很模糊,大家有什么方法可以解决这个问题吗?” 在数字时代的浪潮中,Win10以其出色的性能和丰富的功能赢得了广大用户的青睐。然而,就像任何一款操作系统一…

广东电网突破2亿千瓦,华火新能源电燃灶引领绿色烹饪“灶”未来

近日,广东电网统调装机容量历史性突破2亿千瓦,标志着广东省在电力发展上迈出了坚实的步伐。这一重大成就不仅彰显了广东在能源领域的强劲实力,也为华火新能源电燃灶等绿色技术的普及应用提供了有力的支撑。 广东电网统调装机容量的突破&#…

用ffmpeg对视频添加语音、背景音乐和字幕的方法

先看代码: ffmpeg.exe ^ -i "D:/test/video.mp4" ^ -i "D:/test/voice.mp3" ^ -i "D:/test/music.mp3" ^ -i "D:/test/voice.srt" ^ -filter_complex "[1:a]volume1.0,asetptsPTS-STARTPTS[a_voice];[2:a]volume0.5,…

【 0 基础 Docker 极速入门】镜像、容器、常用命令总结

Docker Images(镜像)生命周期 Docker 是一个用于创建、部署和运行应用容器的平台。为了更好地理解 Docker 的生命周期,以下是相关概念的介绍,并说明它们如何相互关联: Docker: Docker 是一个开源平台&#…

重生奇迹mu五大王国

勇者大陆王国 奇迹大陆的战士,他们因为非常重视剑,而且穿着黑色的衣服,所以叫他们魔剑士。古代勇者大陆王国的魔剑士们都是用铠甲伪装自己的。但是这些个联合国统一成一个帝国之后,勇者大陆王国渐渐成为一个小城市。千年之后的现…

数据持久化第七课-URL重写与Ajax

数据持久化第七课-URL重写与Ajax 一.预习笔记 1.URL重写(对网页地址进行保护) 首先编写module,实现对网络地址的处理 其次就是module的配置 最后验证url重写技术 2.Ajax数据交互 编写后端响应数据 处理跨域的配置问题 运行项目得到后端响应数据的地址 编写前端ajax进行数据请…

程序人生 - 前端拿到后端数据,不能直接用还要再处理,合理吗?

前言 从后端拿到的 list 是散的,需要前端遍历 list 根据 item 的某些属性把同类型的 item 合并到一个 list 中,这样合理吗?我觉得这个不是应该在后端完成的吗? 这种撕扯,让我想起很久之前的一个笑话。我有个朋友之前…

EXCEL上传得时候特殊情况

比如excel里面不全是我们需要的,还有一些需要处理EXCEL中的日期,去掉‘-’等 DATA:begin_row TYPE i VALUE 2,begin_col TYPE i VALUE 1,end_row TYPE i VALUE 9999,end_col TYPE i VALUE 90,filename TYPE rlgrap-filename,gt_excel TYPE zalsme…