锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

I2C协议总结

时间:2023-02-05 17:30:00 576kohm电阻9a传速表传感器

一、I2C协议概述

I2C 是Inter-Integrated Circuit缩写,发音为"eye-squared cee" or "eye-two-cee" , 它是线接口。

I2C 只用两条双向线,一条 Serial Data Line (SDA) ,另一条Serial Clock (SCL)。

SCL:沿着上升的方向输入数据EEPROM设备中;下降沿驱动EEPROM设备输出数据

SDA:双向数据线,为OD门,以及任何其他数量OD与OC门成"线与"关系。

  1. 输出级

    每一个I2C总线设备内部SDA、SCL引脚电路结构相同,引脚的输出驱动与输入缓冲连接在一起。输出为漏极开路的场效应管,输入缓冲为高输入阻抗的同相器,具有两个特点:

    1)由于SDA、SCL漏极开路结构(OD),因此,它们必须连接上拉电阻,电阻的大小通常是 1k8, 4k7 and 10k ,但1k8 性能最好;总线空闲时,两条线都是高电平。连接到总线上任何设备输出的低电平都会降低总线的信号,即每个设备的信号SDA及SCL都是线"与"关系。

    2)引脚在输出信号的同时还将引脚上的电平进行检测,检测是否与刚才输出一致,为"时钟同步"和"总线仲裁"提供硬件基础。

  2. 主设备和从设备

    系统中的所有外围设备都有7位"从设备的特殊地址码",高备类型高4位,由厂家制定,设备引脚定义地址低3位,由用户定义。主控器件通过地址码建立多机通信机制I2C总线省去了外围设备的片选线,所以无论总线上挂了多少个设备,其系统仍然是简单的二线结构。终端挂载在总线上,分为主端和从端。主端必须有CPU逻辑模块可以在同一总线的同一时刻有一个主端,可以有多个从端,从端的数量受地址空间和总线最大电容的影响 400pF的限制。

    • 主端主要用来驱动SCL line;

    • 对主设备的响应;

两者都可以传输数据,但不能从设备中传输,传输由主设备控制。

4.速率:

普通模式:100kHz;

快速模式:400kHz;

高速模式:3.4MHz;


二、协议分析

对于嵌入式开发的朋友,I2C协议真的很熟悉。设备太多,都是通过使用的。I2C相应的设置。

I2C协议中最重要的一点是I2C地址。这个地址有两种形式:7位和10位。7位可以表示127个地址,但在实际使用中基本上没有那么多设置,所以很多设备的地址都是7位,所以本文的下一个描述都是基于此。

I2C另一个非常重要的概念是主-从。对于设备来说,它什么都不做,更不用说自动发送数据了;主设备起着控制作用,一切都从它开始。

除了GND以外,I2C有两根线,分别是SDA和SCL,所有设备都连接到这两条线。那么,这些设备如何知道数据是发送给它们的呢?这取决于上面提到的地址。设备I2C地址是固定的,比如0x50,0x60等等。因为只有127个地址,地址冲突很常见,所以一般设备会有地址选择PIN,比如拉高时是0x50,接地为0x60。如果拉高或接地都与其他芯片发生冲突,该怎么办?答案是:只能换芯片。

我们来看I2C协议中的数据传输时序图:


SCL是时钟,SDA承载数据。当SDA从1变为0SCL或者1点,表示数据传输开始。接下来的七个是设备的地址。然后是读写标志,1时读,0时写。如果I2C总线上有与要求地址相对应的设备,从设备中发送一个ACK信号通知主设备,可发送数据。接到ACK信号后,主设备发送8位数据。传输完成后,SCL保持为1,SDA从0到1,表示传输结束。

从这个时序图中可以看出,SCL这是非常重要的,并确定哪个时钟边缘是什么。例如,前7个必须是地址,第8个必须是读写标志,数据传输必须是8个,必须连接ACK信号等等。

前面的时序图没有标明数据传输的方向,现在我们来看看写作操作的数据流:


网格由主设备发送,白色网格由设备发送。从图中可以看出,对于写作操作,从设备只发送ACK只是确认。

而读操作的数据流向,就有所不同,如图:



此时,除了发送设备外,从设备ACK此外,还有数据紧随其后。

为了理解,我们使用示波器查看波形图。

X和示波器Y分别接到SDA和SCL,得到波形并分析如图:

从图中可知

  1. 由主机发起,在SCL高电平时,SDA开始信号由高到低切变;

  2. 然后是7个地址和一个读写标志,7个地址是0111100,即0x3c,是我们代码中设置的地址ID;最后一个是0表示写作操作;

  3. 然后在下一个时钟,主机以高电平状态释放SDA,此时从机响应,将SDA拉低了;

  4. 然后是两个8位数据00101110和响应,即0x2E,正是“.”号的ASCII符合预期输出的代码;

  5. 还有其他数据和最据和最终停止位。

从图中可以看出,纵向一格是200mV,则SDA和SCL电平约为350mV;因为信号笔上设置了信号x所以实际电平应该是3.5V(理论上应该是3.3V)。横向一格是25us,大约4格用于10个时钟周期,即4格x25us=100us,平均每个时钟周期为10us,传输频率为1/10us=100,000/s,即100k bps。

既有读又有写的波形图:

I2C它由两条线操作,一条是控制时序SCL,另一个主控数据SDA

对于主要分为读写的操作,读写的两个操作有些相似

而时序的操作主要分为:START,DATA,ACK,STOP,NOACK

用于写作的时序为:STRAR,DATA,ACK,STOP

时序如图所示:

读时序中使用的时序有:START,DATA,ACK,STOP,NOACK

时序如图所示:

以下时序描述:

IDLE:空闲时,尽量做SDA和SCL拉到高电平

START:保持SCL高电平,然后SDA由H->L

DATA:数据是当SCL高电平时收集的数据是有效的数据.

ACK:发送数据后,从设备将SDA拉到L

NOACK:发送数据后,从设备不会SDA拉低

STOP:保持SCL高电平,然后SDA由L->H

好了,我们来谈谈时序流程和时序图:

写时序的过程是:START –>

写设备地址 –> ACK –>

从设备的寄存器地址 –> ACK –>

写入的数据 –> ACK –>

STOP

写时图:

读时序的流程是:START –>

                      从设备的写地址 –> ACK –>

                      从设备的寄存器地址 –> ACK –>

                      从设备的读地址 –> ACK ->

                      读出的数据 –> NOACK –>

                      STOP

读时序图:

其中要注意的是I2C的2根线上都必须接上拉电阻,阻值一般是4.7K

在获得ACK的时候,一般将SDA输出一个高阻,然后再读入ACK,好让从设备拉低SDA。

2、I2C与SMBus的区别

关于I2C与SMBus,许多人很少去谈论与了解两者的细节差异,包括很多国外的简报,文章也经常将两者混写、交杂描述、交替运用。

确实,在一般运用下,I2C Bus与SMBus没有太大的差别,从实际接线上看也几乎无差异,甚至两者直接相连多半也能相安无误地正确互通并运作。不过若真要仔细探究,其实还是有诸多不同,如果电子设计工程师不能明辨两者的真实差异,那么在日后的开发设计的验证纠错阶段必然会产生困扰,为此本文将从各层面来说明I2CBus与SMBus的细微区别,期望能为各位带来些许帮助。

运用背景、版本演进之别

首先从规格的制订背景开始,I2C是在设计电视应用时所研发的界面,首版于1992 年发表;而SMBus(System Management Bus)则是Intel与Duracell(金顶电池)共同制订笔记本电脑所用的智能型电池(Smart Battery)时所研发的接口,首版于1995 年发表,不过SMBus文件中也提及,SMBus确实是参考自I2C,并以I2C为基础所衍生成。

I2C起源于电视设计,但之后朝通用路线发展,各种电子设计都有机会用到I2C;而SMBus则在之后为PC所制订的先进组态与电源管理接口(AdvancedConfiguration & Power Interface;ACPI)规范中成为基础的管理讯息传递接口、控制传递接口。

虽然I2C与SMBus先后制订时间不同,但都在2000年左右进入成熟化改版,I2C的过程改版以加速为主要诉求,而SMBus以更切合Smart Battery及ACPI的需求为多。

I2C三次主要改版:

1992 年 v1.0

1998 年 v2.0

2000 年 v2.1

SMBus三次主要改版:

1995 年 v1.0

1998 年 v1.1

2000 年 v2.0

电气特性差异:逻辑电平定义、限流、相关限制

I2C的Hi/Lo逻辑电平有两种认定法:相对认定与绝对认定,相对认定是依据Vdd的电压来决定,Hi为0.7Vdd,Lo为0.3Vdd,绝对认定则与TTL 准位认定相同,直接指定Hi/Li电压,Hi为3.0V,Lo为1.5V。相对的SMBus只有绝对认定,且电平与I2C有异,Hi为2.1V,Lo为0.8V,与I2C不全然吻合但也算部分交集。

不过,SMBus后来也增订一套更低电压的电平认定,Hi为1.4V,Lo为0.6V,这是为了让运用SMBus的装置能更省成本的作法。

了解电压后再来是电流,由于SMBus一开始就是运用在笔记本电脑内,所以省电的表现优于I2C,只需100uA就能维持工作,I2C却要到3mA同样的低用电特性也反应在漏电流(Leakage Current)的要求上,I2C最大的漏电流为10uA,SMBus为1uA,但是1uA似乎过度严苛,使运用SMBus的装置在验证测试时耗费过多的成本与心力,因此之后的SMBus 1.1版放宽了漏电流上限,最高可至5uA。

再者是相关限制,I2C有线路电容的限制,SMBus却没有,但也有相类似的配套规范,即是电平下拉时的电流限制,当SMBus的集电极开路Pin导通而使线路接地时,流经接地的电流不能高于350uA,另上电流(即相同的集电极开路Pin开路时)也一样有规范,最小不低于100uA,最高也是不破350uA的。

既然对电流有限制,那么也可容易地推断对上拉电阻的阻值之范围要求,I2C 在5V Vdd时当大于1.6kohm,在3V Vdd时当大于1kohm,类似的SMBus于5V Vdd时当大于14kohm,3V Vdd时当大于8.5kohm,不过这个定义并非牢不可破,就一般实务而言,在SMBus上也可用2.4k〜3.9kohm范畴的阻值。

附注:I2C的时钟线称SCK或SCL,数据线称SDA。SMBus的时钟线称SMBCLK,数据线称SMBDAT。

I2C与SMBus 在逻辑位准的电压定义不尽相同,基本上I2C的定义较为宽裕、弹性,而SMBus 则更专注在省电方面的要求。

时序差别与考验

物理层面的空间要求完后,再来就是物理层面的时间,即是时序(Timing)方面的差别。

先以运作频率来说,I2C此方面相当宽裕,最低频可至0Hz(直流状态,等于时间暂停),高可至100kHz(Standard Mode)、400kHz(Fast Mode)、乃至3.4MHz(High Speed Mode),相对的SMBus就很局限,最慢不慢于10kHz,最快不快于100kHz。很明显的,I2C与SMBus的交集运作频率即是10kHz〜100kHz间。

用于笔记本电脑的电池管理或PC组态管理、用电管理的SMBus,很容易体会不需要更高运作频率的理由,只要传递小数据量的监督信息、控制指令本就不用过于高速,而朝向广泛运用的I2C自然希望用更高的传输以应对各种可能的需求。然而大家可能会疑惑,为何SMBus有最低速的要求?何不放宽到与I2C相同的无最低速限制呢?

SMBus一定要维持10kHz以上的运作频率,主要也是为了管理监控,另一个用意是只要在保持一定传速运作的情况下加入参数,就可轻松获知总线目前是否处于闲置(Idle)中,省去逐一侦测传输过程中的停断(STOP)信号,或持续保有停断侦测并辅以额外参数侦测,如此对总线闲置后的再取用会更有效快速。

传速要求之后还有数据保持时间(Data Hold Time)的要求,SMBus 规定SMBCLK线路的电平下降后,SMBDAT上的数据必须持续保留300nS,但I2C 却没有对此有相同的强制要求。

类似的,SMBus对接口被重置(Reset)后的恢复时间(Timeout)也有要求,一般而言是35mS,I2C这方面亦无约束,可以任意延长时间。相同的SMBus也要求无论是在主控端(Master)或受控端(Slave),其频率处于Lo电平时的最长持续时间不得超越限制,以免因为长时间处在Lo准位,而致收发两端时序脱轨(失去同步,造成后续误动作)。

还有,I2C与SMBus在信号的上升时间、下降时间等也有不同的细节要求,此点必要时也必须进行确认,或在验证过程中稍加留意。

Smart Battery或ACPI的实现、监督、与操控,最底层都需要SMBus(圈处)作为后援,图为简易的多组式智能型电池系统,图中有Smart Battery A、B 两组电池。

「已妥」与「未妥」机制的强制性差别

不单是电气、时序有别,更深层次的协议机制也有不同。在I2C中,主控端发送端(主控端)要与接收端(受控端)通讯前,会在总线上广播受控端的地址信息,每个接收端都会接收到地址信息,但只有与该地址信息相切合的接收端会在地址信息发布完后发出「已妥」的回应(Acknowledge;ACK),让发送端知道对应的接收端确实已经备妥,可以进行通讯。

但是,I2C并没有强制规定接收端非要做出响应不可,也可以默不作声,即便默不作声,发送端还是会继续工作,开始进行数据传递及下达读/写指令,如此的机制在一般运用中还是可行,但若是在一些实时(Real Time)性的应用上,任何的动作与机制都有一定的时限要求,这种可有可无式的响应法就会产生问题,可能会导致受控端无法接收信息。

相同的情形,在SMBus上是不允许接收端在接收地址信息后却不发出回应,每次都要回应,为何要强制回应?其实与SMBus的应用息息相关,SMBus上所连接的受控装置有时是动态加入、动态移除的,例如换装一颗新电池,或笔记本电脑接上DOCK PORT等,如果接入的装置已经改变却没有回应,则主控端的程序所掌握的并非是整体系统的最新组态,就会造成误动作。

类似的情形也适用于ACPI,PC机内机外经常有一些装置可动态增入、移除,如机内风扇、外接打印机等,这些也一样该强制对主控端群发(广播)的地址信息作出完整响应。

地址动作方面有异,数据传输方面也有异。在I2C方面,Slave虽然对Master 所发出的地址作出响应,但在后续的数据传递中,可能因某些事务必须先行处理、因应而无法持续原有的传输,这时候Slave就要对Master发出「未妥」的回应(Not Acknowledge;NACK),向Master 表示Slave正为他务忙碌中。

而SMBus方面,与I2C相同的,会以NACK的回讯向Master表达Slave尚未收妥传递的信息,但是SMBus的Slave会在后续的每个Byte传输中都发出NACK回信,这样设计的原因是因为SMBus没有其他可向Master要求重发(Resend)的表示法。更直接说就是:NACK机制是SMBus标准中的强制必备,任何的讯息传递都很重要,不允许有漏失。

I2C在完成一段地址或数据信息的传输后,受接端可发出讯息收妥(ACK)、未妥(NACK的响应,SMBus也具相同的机制,但由于应用之故有更强制的回显请求。

传输协议的子集、超集

互动知会机制上有强制与否的差别,协议方面也是。SMBus的通讯协议与协议中所用的讯息格式,其实只是取自I2C 规范中,对于数据传输格式定义中的子集合(Subset)而已。所以,如果将I2C与SMBus交混连接,则I2C装置在存取SMBus装置时,只能使用SMBus范畴的协议与格式,若使用I2C的标准存取方式反而无法正确存取。

另外,I2C规范中有一种称为「General Call」的广呼方式,当发出「0000000」的地址信息后,所有I2C上的Slave装置统统要对此作出反应,此机制适合用在Master要对所有的Slave进行广播性讯息更新与沟通上,是一种总体、批次的运作方式。

SMBus一样有General Call机制,但在此之外SMBus还多了一种特用的ALERT(警讯)机制,不过这必须于频率线与数据线外再追加一条线(称为:SMBSUS)才能实现,ALERT虽名为警讯但其实是中断(Interrupt)的用意,Slave可以将SMBSUS线路的电位拉低(ALERT#,#表示低电平有效),这时就等于向Master发出一个中断警讯,要求Master尽速为某一Slave提供传输服务。

Master要响应这个服务要求,是透过I2C/SMBus的频率线与数据线来通讯,但要如何知道此次的通讯只是Master对Slave的一般性通讯?还是特别针对Slave的中断需求而有的服务响应?

这主要是透过Master发出的地址信息来区别,若为回应中断的服务,地址信息必然是「0001100」,当Slave接收到「0001100」的地址信息,就知道这是Master特为中断而提供的服务通讯。

因此,软件工程师须留心,规划时必须让所有的Slave都不能占用「0001100」这个地址,以供ALERT机制运用(当然!若现在与未来都不会用上ALERT机制则可尽管占用)。事实上各种进阶的规范标准(如Smart Battery、ACCESS.bus、VESA DDC 等)都在I2C的短寻址中订立了一些为自用而保留的地址,这在最初设计与定义时就该有所留意,以免因先行占用而导致日后须改写软件的麻烦。

补充提醒的是,SMBSUS一样是开集电极外加上拉电阻的线路,所以有一个Slave将电位拉下后,其余Slave侦测到电位被拉下,表示已有Slave正在与Master进行中断需索与响应服务,须等待抢到中断服务权的Slave确实被服务完毕,重新将SMBSUS释放回高电平后,才能持续以“看谁能先将线路电平拉低?”的方式来争取中断服务。

本文整理自:

《I2C协议快速解析》作者 k_linux_man

《I2C协议---I2C时序图解析》作者:csdn4646

《I2C与SMBus的区别》转载自郭长祐博客

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章