热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

学习笔记三、I2C总线传输协议

简介:I2C(Inter-integratedCircuit)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的

简介:

I2C(Inter-integrated Circuit)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口。它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据,在CPU与被控IC之间,IC与IC之间进行双向传送,高速IIC一般可达400Kbps以上。

I2C可以支持多个Slave设备,允许有多个master,并且每个master都可以与所有的slave通信(master之间不可通过I2C通信,并且每个master只能轮流使用I2C总线)。master是指启动数据传输的设备并在总线上生成时钟信号以驱动该传输,而被寻址的设备都作为slave。

     

                                                                            IIC总线时序图

大部分I2C设备支持100khz和400KHz模式。使用I2C传输数据会有一些额外消耗:每发送8bits数据,就需要额外1bit的数据(ACK或NACK)。I2C支持双向数据交换,由于仅有一根数据线,故通信是半双工的。

I2C协议

I2C协议把传输的消息分为两种类型的帧:

一个地址帧----用于master指明消息发往哪个slave;

一个或多个数据帧-----由master发往slave的数据(或由slave发往master),每一帧是8bit的数据。

注:协议要求每次发到SDA上的字节长度必须为8位,并且每个字节后须跟一个ACK位,

数据在SCL处于低电平时放到SDA上。并在SCL变为高电平后进行采样。读写数据和SCL上升沿之间的时间间隔由总线上的设备自己定义的,不同芯片可能有差异。

I2C数据传输的时序图如下:

 

开始条件(start condition)

为了标识传输正式启动,master设备会将SCL置为高电平(当总线空闲时,SDA和SCL都处于高电平状态),然后将SDA拉低,这样,所有slave设备就会知道传输即将开始。如果两个master设备同时都希望获得总线的所有权,那么谁先将SDA拉低,谁就赢得了总线的控制权。在整个通信期间,可以存在start来开启每一次新的通信序列(communication aequence),而无需先放弃总线的控制权,后面会讲到这种机制。

地址帧(adress frame)

地址帧总是在一次通信的最开始出现,一个7-bit的地址是从最高位(MSB)开始发送的,这个地址后面会紧跟1-bit的操作符,1表示读操作,0表示写操作。

接下来的一个bit是ACK/NACK,这个帧中前面8bits发送完成后,接收端的设备获得SDA控制权,此时接收设备应该在第9个时钟脉冲之前回复一 个ACK(将SDA拉低)以表示接收正常。如果接收设备没有将SDA拉低,则说明接收设备可能没有收到数据(如寻址的设备不存在或设备忙)或无法解析收到的消息,如果这样。则由master来决定如何处理(stop或repeated start condition)。

数据帧(data frames)

在地址帧发送之后,就可以开始传输数据了,master 继续产生时钟脉冲,而数据则由master(写操作)或slave(读操作)放到SDA上,每个数据帧8bit,数据帧的数据量可以是任意的,直到产生停止条件。每一帧数据传输(即每8bit)之后,接收方就需要回复一个ACK或NACK(写数据由slave发送ACK,读数据时由master发送ACK。当master知道自己读完最后一个byte数据时,可发送NACK然后接stop condition)。

停止条件(stop condition) 

当所有数据都发送完成时,master将产生一个停止条件,停止条件定义为:在SDA置于低电平时,将SCL拉高并保持高电平,然后将SDA拉高。

主要:在正常传输数据过程中,将SCL处于高电平时,SDA上的值不应该变化,防止产生一个停止条件。

重复开始条件(repeated start condition) 

有时master需要在一次通信中进行多次消息交换(例如与不同的slave传输消息,或切换读写操作),并且期间不希望被其他master干扰,这时可以使用“重复开始条件”-----在一次通信中,master可以产生多次start condition,来完成多次消息交换,最后再产生一个stop condition结束整个通信过程。由于期间没有stop condition,因此master 一直占用总线,其他master无法切入。 

为了产生一个重复的开始条件,SDA在SCL低电平时拉高,然后SCL拉高,接着master就可以产生一个开始条件继续新的消息传输(按照正常的7-bit/10bit地址传输时序)。重复开始条件的传输时序如图所示:

时钟拉伸(clock stretching) 

有时候,低速slave可能由于上一个请求还没有处理完成,尚无法继续接收master的后续请求,即master的数据传输速率超过了slave的处理能力,这种情况下,slave可以进行时钟拉伸来要求master暂停传输数据,通常时钟都是由master提供的,slave只是在SDA上放数据或读数据,而时钟拉伸则是slave在master释放SCL后,将SCL主动拉低并保持。此时要求master停止在SCL上产生脉冲以及在SDA上发送数据,知道slave释放SCL(SCL为高电平)。之后,master便可以继续正常的数据传输了,可见时钟拉伸实际上是利用了时钟同步的机制(见下文)。只是时钟由slave产生。

如果系统中存在这种低速slave并且slave实现了clock stretching ,则master 必须实现为能够处理这种情况,实际上大部分slave设备中不包含SCL驱动器的,因此无法拉伸时钟,

所以更完整的I2C数据传输时序图为:

10bit地址空间:

上面讲到I2C支持10bit的设备地址,此时的时序如下图所示:

在10bit地址的I2C系统中,需要两个帧来传输slave的地址。第一个帧的前5个bit固定为b1110,后接slave地址的高2位,第8位仍然是R/W位,接着是一个ACK位,由于系统中可能有多个10-bit slave设备地址的高2bit相同,因此这个ACK可能由多有slave设备设置。第二个帧接着第一个帧发送,包含slave地址的低8位(7:0),接着该地址的slave回复一个ACK(NACK)

注意,10bit地址的设备和7bit地址的设备在系统中是可以并存的,因为7-bit地址的高5位不可能是b11110.实际上对于7-bit的从设备地址,合法范围为b0001xxx-b1110xxx,‘x’表示任意值,因此该类型地址最多有112(其他为保留地址[1])。

两个地址帧传输完成后,就开始数据帧的传输了。这和7-bit地址中的数据帧传输过程相同。

时钟同步和仲裁 

如果两个master都想在同一条空闲总线上传 输,此时必须能够使用某种机制来选择将总线控制权交给哪个master,这是通过时钟同步和仲裁来完成的,而被迫让出控制权的master则需要等待总线空闲后再继续传输。在单一master的系统上无需实现时钟同步和仲裁。

时钟同步

时钟同步是通过I2C接口和SCL之间的线‘与’(wired-AND)来完成的,即如果有多个master同时产生时钟,那么只有所有master都发送高电平时,SCL上才表现为高电平,否则SCL都表现为低电平。

总线仲裁

总线仲裁和时钟同步类似,当所有master在SDA上都写1时,SDA的数据才是1,只要有一个master写0,那此时SDA上的数据就是0。一个master每发送一个bit数据,在SCL处于高电平时,就检查看SDA的电平是否和发送的数据一致,如果不一致,这个master便知道自己输掉仲裁,然后停止向SDA写数据,也就是说,如果master一直检查到总线上数据和自己发送的数据一致,则继续,这样在仲裁过程中就保证了赢得仲裁的master不会丢失数据。

输掉仲裁的master在检测到自己输了之后也不再产生时钟脉冲,并且要在总线空闲时才能重新传输。

仲裁的过程可能要经过多个bit的发送和检查。实际上两个master如果发送的时序和数据完全一样。则两个master都能正常完成整个的数据传输。


推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 加密世界下一个主流叙事领域:L2、跨链桥、GameFi等
    本文介绍了加密世界下一个主流叙事的七个潜力领域,包括L2、跨链桥、GameFi等。L2作为以太坊的二层解决方案,在过去一年取得了巨大成功,跨链桥和互操作性是多链Web3中最重要的因素。去中心化的数据存储领域也具有巨大潜力,未来云存储市场有望达到1500亿美元。DAO和社交代币将成为购买和控制现实世界资产的重要方式,而GameFi作为数字资产在高收入游戏中的应用有望推动数字资产走向主流。衍生品市场也在不断发展壮大。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 技嘉秀高端B450主板:不再支持第七代APU,性价比高且兼容锐龙一代和二代
    在台北电脑展上,技嘉展示了一款高端的B450主板,型号为“b450 aorus pro wi-fi”。该主板具有10+1相供电、散热片覆盖的供电区域和芯片组,以及两个m.2插槽和背部IO挡板。虽然不支持第七代APU bristol ridge,但它兼容锐龙一代和二代,且具有较高的性价比。该主板还配备了音频声卡、Wi-Fi无线网卡等功能,是一款性能出色且设计精良的主板。 ... [详细]
author-avatar
手机用户2502908547
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有