I2C总线协议

目录

一、前言

二、概念

 三、I2C总线

1、主从结构

2、两线

3、半双工

4、上拉电阻

5、高阻态

四、时序图

 1、起止信号

2、数据传输

 3、应答信号

 五、数据传送

1、传送格式

2、读写数据

六、时钟同步与仲裁

1、时钟同步

2、仲裁

七、时钟拉伸

八、总线速率


一、前言

        对于与微控制器(MCU)或数字系统进行通信的设备,我们需要建立一些设计标准:

  • 一个完整的系统通常由至少一个微控制器和其他外围器件例如存储器和I/O扩展器组成;
  • 系统中不同器件的连接成本必须最小;
  • 执行控制功能的系统不要求高速的数据传输;
  • 总的效益由选择的器件和互连总线结构的种类决定;

        产生一个满足这些标准的系统需要一个串行的总线结构,尽管串行总线没有并行总线的数据吞吐能力,但它们只要很少的配线和IC连接管脚。然而,总线不仅仅是互连的线,还包含系统通讯的所有格式和过程。

        串行总线的器件间通讯必须有某种形式的协议避免所有混乱、数据丢失和妨碍信息的可能性。快速器件必须可以和慢速器件通讯。系统必须不能基于所连接的器件,否则不可能进行修改或改进。应当设计一个过程决定哪些器件何时可以控制总线。而且,如果有不同时钟速度的器件连接到总线,必须定义总线的时钟源。所有这些标准都在I2C总线的规范中,接下来叫我们一起学习I2C总线吧!

二、概念

        I2C协议拥有两根线:串行数据线(SDA)和串行时钟线(SCL)。每个器件都有一个唯一的地址识别(无论是微控制器、LCD驱动器、存储器或键盘接口),而且都可以作为一个发送器或者接收器(由器件的功能决定)。很明显,LCD驱动器只是一个接收器,而存储器既可以接收又可以发送数据。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或者从机。主机是初始化总线的数据传输并产生允许传输的时钟信号的器件。此时,任何被寻址的器件都被认为是从机。

表1 I2C总线术语的定义 

 三、I2C总线

1、主从结构

        I2C(Inter-Integrated Circuit,双向串行总线)通信协议采用主从结构,其中包括一个主设备(Master)和一个或多个从设备(Slave)。这种结构允许主设备控制通信并向从设备发送指令,从设备则响应主设备的指令并发送数据。

主从结构的工作方式如下:

  1. 主设备(Master)

    • 主设备负责控制总线的访问和通信过程。
    • 主设备产生时钟信号(SCL,Serial Clock Line)来同步数据传输。
    • 主设备发起通信,向从设备发送地址和指令,并接收从设备的响应。
    • 主设备负责决定总线上哪个从设备可以进行通信。
  2. 从设备(Slave)

    • 从设备响应主设备的指令并发送数据。
    • 从设备接收来自主设备的地址,判断是否被选中,如果被选中则响应通信,否则保持高阻态。

 图1 主从结构

         I2C总线每个设备都有一个唯一的7bit物理地址(在芯片datasheet中查看),因为I2C地址全0为广播地址,所以I2C总线理论上最多能带2^7 - 1 = 127个从设备。

        这种主从结构的通信模型使得I2C总线非常适合连接多个设备,并且可以通过地址选择机制轻松地对特定设备进行通信。在实际应用中,主设备通常是一个微控制器或其他控制器,而从设备可以是各种外部设备,如传感器、存储器、执行器等。

2、两线

        I2C一共有两个总线:一条是双向的串行数据线SDA,一条是串行时钟线SCL。

  • SDA数据线:用来传输数据
  • SCL时钟线:控制数据发送的时序

        所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。        

3、半双工

        I2C总线是一种半双工的通信协议,这意味着数据在通信双方之间只能单向传输,不支持同时的双向数据传输。在I2C通信中,主设备(Master)和从设备(Slave)之间的数据传输是单向的,通过交替的方式实现双向通信。

4、上拉电阻

        上拉电阻通常连接在I2C总线的数据线(SDA)和时钟线(SCL)上,作用是将这些线路的电平拉高到高电平(逻辑1),以便确保在通信空闲时线路保持稳定,同时在设备拉低线路时能够快速恢复到高电平。具体来说,上拉电阻的作用有以下几点:

  • 保持稳定的空闲电平:在通信空闲时,上拉电阻将数据线和时钟线拉高到高电平,防止电平浮动和噪声干扰导致误判。

  • 快速恢复到高电平:当设备拉低数据线或时钟线时,上拉电阻会帮助线路快速恢复到高电平,确保信号的准确传输和时钟同步。

  • 限制电流流动:上拉电阻也可以限制总线上的电流流动,起到一定的电流保护作用。

5、高阻态

        高阻态指的是一个设备处于高阻抗状态,即在电路中表现为电阻非常大、电流几乎为零的状态。在I2C通信中,高阻态通常用于未被选中的从设备(Slave)或者设备处于空闲状态时,将其数据线(SDA)和时钟线(SCL)引脚置于高阻态,以允许其他设备进行通信。高阻态的作用包括:

  • 防止干扰:设备处于高阻态时,不会对总线上的信号产生影响,防止对通信设备造成干扰。

  • 允许并行通信:通过高阻态,多个设备可以共享同一条总线并且在需要时选择性地参与通信,实现并行通信。

  • 节省功耗:设备处于高阻态时,电流消耗非常小,节省总线和设备的功耗。

四、时序图

        I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

 1、起止信号

        开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。

        结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

         起始和停止条件一般由主机产生。总线在起始条件后被认为处于忙的状态。在停止条件的某段时间后,总线被认为再次处于空闲状态。如果产生重复起始条件而不产生停止条件,总线会一直被认为处于忙的状态。此时的起始条件和重复起始条件在功能上是一样的。

2、数据传输

        I2C信号在数据传输过程中,当SCL=1高电平时,数据线SDA必须保持稳定状态,不允许有电平跳变,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

        SCL=1时 数据线SDA的任何电平变换会看做是总线的起始信号或者停止信号。也就是在I2C传输数据的过程中,SCL时钟线会频繁的转换电平,以保证数据的传输

 3、应答信号

        主机往I2C总线上传输器件地址,所有的从机接收到这个地址后与自己的地址相比较若相同则发出一个应答ACK信号,主机收到这个信号后通讯连接建立成功,若未收到应答信号则表示寻址失败。

        此外,主/从机在之后的数据通信中,数据接收方收到传输的一个字节数据后,需要给出响应,此时处在第九个时钟,发送端释放SDA线控制权,将SDA电平拉高,由接收方控制。

  • 若希望继续,则给出应答(ACK)信号,即SDA为低电平
  • 若不希望继续,则给出非应答(NACK)信号,即SDA为高电平 

 五、数据传送

1、传送格式

        SDA线上的数据在SCL时钟“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。输出到SDA线上的每个字节必须是8位,数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。

        当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位ACK, 此时才认为一个字节真正的被传输完成 ,如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。

2、读写数据

        主机在发送开始信号之后,

多数从设备的地址为7位或者10位,一般都用7位。
        八位设备地址=7位从机地址+读/写地址

再给地址添加一个方向位位用来表示接下来数据传输的方向,

  • 0表示主设备向从设备(write)写数据
  • 1表示主设备向从设备(read)读数据

IIC的每一帧数据由9bit组成,如果是发送数据,则包含 8bit数据+1bit ACK,如果是设备地址数据,则8bit包含7bit设备地址 1bit方向。

六、时钟同步与仲裁

        在单主设备中,不需要时钟同步和仲裁。而在多设备时,多个主设备可以同时在空闲的总线上开始发送数据,这时就需要仲裁决定哪一个来控制总线并完成它的数据传输,有时候也需要时钟同步来协同设备间的工作。而这正是通过时钟同步和仲裁来完成的。

1、时钟同步

       时钟同步用于确保主设备和从设备之间的数据传输按照正确的时序进行。时钟同步解决了I2C总线设备间的速度同步。

时钟同步的过程:

  • 一旦主设备1的时钟拉低,就会把SCL总线拉低。当SCL总线从高拉低时,主设备将计数主设备时钟的低电位周期。
  • 主设备2检测到SCL线为低,也会立刻将CLK2拉低,不会等到CLK2的正常周期才拉低。
  • 如果此时另外一个主设备的时钟仍然是低电平的,此时SCL总线也同样的保持为低。在此期间,低周期比较短的主设备1将进入高电平状态等待。如图,主设备1提前进入高电平等待,主设备2继续保持低电平。
  • 当所有主设备的时钟都为高电平时,将会把SCL线拉高。也就是说时钟低电平周期较长的主设备2决定了SCL线为低的周期长度。
  • 所有的主设备时钟都拉高时,将对他们的高电平时钟计数,第一个结束时钟高电平周期的主设备将会把SCL线拉低。主设备2将SCL拉低后,主设备1检测到SCL线为低时,CLK1也立刻拉低。

总结:SCL线上的低电平时间是由时钟低电平最长的器件决定,SCL的高电平则是由高电平时间最短的期间决定。

2、仲裁

        在主线空闲的情况下,主设备发起传输。两个主机在启动条件的最小保持时间内生成一个启动条件,从而在总线上生成一个有效的传输启动条件,而仲裁程序就是决定哪一个主设备可以完成它的传输。

仲裁的步骤:

  • 当两个master对同一个地址的slave进行传输时,多个master会都能进入数据周期,仲裁会单比特对单比特进行比较。
  • 在SCL为高的每一个比特位期间,每个主设备检查SDA线的电平是否与它所发送的相匹配。这个过程很可能需要比对很多位。
  • 如果传输的数据是完全相同的,则这个主设备可以完成地发送整个事务。
  • 当主设备发送的比特位与SDA线不匹配时,例如图中DATA1在SCL线的第三个周期,此时DATA1拉高,而DATA2为低,DATA1和DATA2在线与后SDA为低,匹配不成功。当主设备1检测到一个与自身不相符的低电平,这时会关闭主设备1的SDA传输驱动,另一个主设备2会继续完成传输。

         

     总结: I2C总线的控制权完全取决于竞争主设备发送的地址和数据,因此没有中央主设备,总线上也没有任何优先级顺序。谁先在SDA线上发送低电平,谁就掌握对总线的控制权

七、时钟拉伸

        在某些情况下,从设备可能需要更多的时间来处理数据,确认接收或者执行其他操作。如果不允许时钟拉伸,可能会导致通信错误或数据丢失。因此,时钟拉伸就是为了满足从设备在特定情况下对额外时间的需求。 

        当从设备需要额外的时间来处理数据或者确认接收时,它可以请求拉低时钟线。当主设备检测到在一个时钟信号周期内,时钟线被拉低,它会意识到有从设备请求拉低时钟线,即时钟拉伸发生。一旦主设备意识到时钟拉伸发生,它会暂停时钟信号的传输。这意味着主设备不再生成新的时钟信号,即时钟信号保持不变(拉低状态),直到时钟拉伸结束。

        在主设备暂停时钟信号的期间,从设备有足够的时间来处理数据或者确认接收。这种额外的时间通常是为了处理一些需要较长时间的操作,如读取或写入大量数据、进行复杂的计算等。当从设备完成处理数据或者确认接收后,它会释放时钟线。这意味着时钟线上的时钟信号会恢复正常(高电平状态)。一旦主设备检测到时钟线上的时钟信号恢复正常,即时钟线由低电平变为高电平,它会恢复时钟信号的传输,继续数据传输的流程。

八、总线速率

        I2C总线是一种同步、半双工、采用电平信号收发的串行总线,其速率支持:

  • 标准模式:速率高达100kbits/s
  • 快速模式:速率高达400kbits/s
  • 快速模式+:速率高达1Mbits/s
  • 高速模式:速率高达3.4Mbits/s
  • 超快速模式:速率高达5Mbits/s(单向传输时支持)

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

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

相关文章

Flutter 依据JSON数据自动生成实体类

json自动化生成工具 点击这里可以跳转 页面是这样的 然后在左边输入你的json数据,它会自动生成对应的实体类 生成的实体类是如下: import package:json_annotation/json_annotation.dart; part merch_region.g.dart;JsonSerializable()class MerchReg…

国网645协议报文解析软件

本文分享一款支持国网DL645-2007规约的报文解析软件, 链接: https://pan.baidu.com/s/1ngbBG-yL8ucRWLDflqzEnQ 提取码: y1de 主界面如下图所示: 本解析软件同时内嵌规约文档,支持一键打开文档,功能如下: 同时支持模…

堆的数组实现

前言 本次博客来讲解一下堆的数组实现,好吧还是会结合图例,让大家理解 堆的定义 什么是堆? 堆是一颗完全二叉树。它的性质是父节点一定大于或者一定小于子节点 每一个结点都要满足这个性质就是堆 堆的特性是堆顶的数据一定是最大或最小…

ROS仿真多点导航

仿真环境启动: 1、启动并进入到相应环境: roscarroscar-virtual-machine:~/artcar_simulation$ 启动gazebo环境: roslaunch artcar_gazebo artcar_gazebo.launch 启动move_base: roslaunch artcar_nav artcar_move_base.launc…

3D数字化技术如何改变汽车行业?

近年来,新能源汽车行业加速发展,新车型密集发布,汽车保有量和车龄的增加,也同时点燃了汽车后市场的增长引擎。对于车企而言,如何全方面优化汽车从研发、生产、售后到营销的各个环节,以便适应快速变化的市场…

使用make_blobs生成数据并使用KNN机器学习算法进行分类和预测以及可视化

生成数据 使用make_blobs生成数据并使用matplotlib进行可视化 完整代码: from sklearn.datasets import make_blobs # KNN 分类器 from sklearn.neighbors import KNeighborsClassifier # 画图工具 import matplotlib.pyplot as plt # 数据集拆分工具 from sklea…

Win7远程桌面连接不上:原因及专业解决方案

Win7远程桌面连接作为一种方便的工具,使得用户可以从一台计算机远程访问和操作另一台计算机。然而,有时用户可能会遇到Win7远程桌面连接不上的情况,这可能是由于多种原因导致的。 一、原因分析 1. 网络设置问题:确保计算机与远程…

可用在vue自动导入的插件unplugin-auto-import

在大多数vue3开发中,基本所有页面都会引用vue3 componsition api,如下代码 想这种vue3 架构中自带的api,如果在全局配置一下的话,就可以减少一部分代码量,只是在代码编译的时候,会添加相应的引用&#xff…

【Stable Diffusion】 训练方法篇

一、四种模型训练方法简介 Stable Diffusion 有四种训练模型的方法:Textual Inversion、Hypernetwork、LoRA 和 Dreambooth 。它们的训练方法存在一定差异,我们可以通过下面对比来评估使用哪种训练方式最适合你的项目。 如果你知道模型中已经可以产生你…

企业架构系统之-IT系统建设如何做好技术选型

背景 近日有幸与行业同仁交流工作心得,在讨论中,他们提到一个平时工作当中我们都会遇到和经历的一个问题:作为架构师,在日常工作中应如何进行技术选型?面对众多框架和组件中,我们又应如何选择,…

Postgresql源码(128)深入分析JIT中的函数内联llvm_inline

相关 《Postgresql源码(127)投影ExecProject的表达式执行分析》 《LLVM的ThinLTO编译优化技术在Postgresql中的应用》 《LLVM(5)ORC实例分析》 1 JIT优化效果 create table t1(i int primary key, j int, k int); insert into t1…

Google IO 2024有哪些看点呢?

有了 24 小时前 OpenAI 用 GPT-4o 带来的炸场之后,今年的 Google I/O 还未开始,似乎就被架在了一个相当尴尬的地位,即使每个人都知道 Google 将发布足够多的新 AI 内容,但有了 GPT-4o 的珠玉在前,即使是 Google 也不得…

秋招算法——AcWing101——拦截导弹

文章目录 题目描述思路分析实现源码分析总结 题目描述 思路分析 目前是有一个笨办法,就是创建链表记录每一个最长下降子序列所对应的节点的链接,然后逐个记录所有结点的访问情况,直接所有节点都被访问过。这个方法不是很好,因为需…

消防物资存储|基于SSM+vue的消防物资存储系统的设计与实现(源码+数据库+文档)

消防物资存储系统 目录 基于SSM+vue的消防物资存储系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1用户功能模块 2 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介…

动规解决01背包/完全背包精讲

还不会用动态规划解决01背包/完全背包?看这一篇文章就够了! 首先我们要明白什么是01背包和完全背包。 背包问题总体问法就是: 你有一个背包,最多能容纳的体积是V。 现在有n个物品,第i个物品的体积为vi​ ,价值为wi​…

干货教程【AI篇】| Topaz Video Enhance AI超好用的视频变清晰变流畅的AI工具,免费本地使用

关注文章底部公众号,回复关键词【tvea】即可获取Topaz Video Enhance AI。 一款非常好用的视频变清晰变流畅的AI工具,即提高视频的分辨率和FPS,亲测效果非常nice!! 免费!免费!免费&#xff01…

【案例】使用Vue实现标题项元素上下移动

效果图 效果说明 每一组数据只能在对应的二级类目中进行上下移动,当点击上移图标的时候【左边的】会将当前元素与上一个元素交换位置,当点击的元素为该组的第一个元素时,将提示已经是第一项了并且不能进行移动;当点击下移图标的时…

Linux|如何允许 awk 使用 Shell 变量

引言 当我们编写 shell 脚本时,我们通常会在脚本中包含其他较小的程序或命令,例如 awk 操作。就 Awk 而言,我们必须找到将一些值从 shell 传递到 Awk 操作的方法。 这可以通过在 Awk 命令中使用 shell 变量来完成,在本文中&#x…

C++系统编程篇——Linux初识(系统安装、权限管理,权限设置)

(1)linux系统的安装 双系统---不推荐虚拟机centos镜像(可以使用)云服务器/轻量级云服务器(强烈推荐) ①云服务器(用xshell连接) ssh root公网IP 然后输入password ①添加用户: addus…

揭秘!你的电商产品为何滞销?同行火爆销售的7大原因!

同样做电商,但自家产品销量不如竞对同行,可能的原因有多种,以下是店雷达总结7个可能的原因和对策: 一、市场竞争分析不足 未能准确识别并分析竞争对手的产品、定价、营销策略等关键信息,导致自身产品无法脱颖而出。 …