
iic总线
-
2023年3月6日发(作者:真脏脉)I2C总线深入浅出
IIC总线,是INTER-IC串行总线的缩写。INTER-IC原文大意是用于相
互作用的集成电路,这种集成电路主要由双向串行时钟线SCL和双向
串行数据线SDA两条线路组成,由荷兰菲利浦公司于80年代研制开发
成功。
IIC总线在传送数据时其速率可达100kbps,最高速率时可达
400kbps,总线上允许连接的设备数主要决定于总线上的电容量,一般
设定为400pF以下。I2C总线主要在微处理器的控制之下,因此通常称
微处理器是I2C总线的主机。习惯上总称受控设备及功能电路为I2C总
线的从机。这种主机与从机之间的连接通常是在总线的输出端,而输出
端的电路结构为IIC总线的从机。这种主机与从机之间的连接通常是在
总线的输出端,而输出端的电路结构又总是开漏输出或集电极开路输
出。通常数据传送要由主机发出启动信号和时钟信号,向所控从机发
出一个地址、一个读写位和一个应答位,其中地址位为7位数据,在实
际控制中,一般一次只能传送一个8位数据,并以一个停止位结束。
在实际应用中,往往被传送的数据位数会超过8位,也就是说总会
有多字节传送,这时必须在传送数据地址结束后再传送一个副地址。因
此,被传送的字节没有限制,但每一个字节后面必须有一位应答位。应
答位通常被设定在低电平,当应答位处于高电平时,指示被传送的数据
已结束。
I2C总线在空闲状态时,也就是不在进行任何操作控制时,数据线
SDA和时钟线SCL总是处于高电平输出状态。当操作控制系统时,I2C
总线的主机将发出启动信号,使数据线SDA由高电平变为低电平,同
时时钟线SCL也发出时钟信号。
I2C总线在传送数据时,总是将最高位数码放在前面作为其特有的
传送顺序。在数据传送过程中,如果从机在完成某一操作之前不能接收
下一个字节数据,即数据中断,这时时钟线SCL将被位至低电平,从
而迫使发送器主机进入等待状态,当接收器从机准备好接收下一个字节
时再释放时钟线SCL,继续传送数据。
在I2C总线的控制系统中,有时从机也可以是多台微处理器,在多
台微机同时工作时,它们对总线的控制也由相似于时钟的同步方式进行
仲裁,也就是说时钟的同步与仲裁过程是同时进行的,不存在因是主机
而有优先权次序。不同速度的从机可以接在同一I2C总线上完成相互间
数据的传送。高速方式芯片和普通芯片可以混合于同一I2C总线上。
I2C总线的特点与特性
I2C总线与传统的PWM调宽脉冲相比较,其最大的特点是串行数
据线和时钟线都是双向传输线。I2C总线在实际电路的应用中,两根线
各自通过一个上拉电阻连接到电源电压的正极端,当总线空闲时,数据
线SDA和时钟线SCL必须保持高电平,同时各接口电路的输出又必须
是开路漏极或开路集电极,因此I2C总线的最大特性是在地址信息传输
过程中,即可以是主控器也可以是被控器,或既可以是发射器又可以是
接收器,从而为挂在总线上的各集成电路或功能模块完成各自的功能提
供了极大方便。
如果I2C总线用作主控器电路即微处理电路,则在总线上将提供时
钟传送及初始化的数据传输,而控制数据信息传送的对象、方向及传送
的终止也由主控器来决定。在I2C总线上被主控器所寻址的集成电路或
功能模块,称之为被控器。在I2C总线上,被控器每接收一个“数码”后
都要在数据线上给主控器发送一个识别应答信号,以示完成一个控制功
能。因此,I2C总线具有十分灵活的运用性。并且还具有多重主控的能
力,如多个作为主控器去控制占用总线的电路,都可以根据在I2C总线
上进行数据传送的工作状态,被分为主控发送器、主控接收器、被控发
射器、被控接收器。在多重主控能力中,由于总线的仲裁过程,I2C总
线的时钟信号将是各试力占用总线的各主控器的时钟信号的同步组合。
所谓仲裁是在多个主控器试图同时控制总线时一个裁决过程,它只允许
其中的一个主控器继续占用总线,并保证在整个过程中总线上的数据不
会被丢失或出错误;所谓同步是将两个或多个器件的时钟信号进行处
理。
I2C总线上的时钟信号是由主控器产生,每个主控器在占用总线传
送数据期间都有自已的时钟,因此,在应用中,由一个主控器产生的I2C
总线时钟信号只可能被一个低速的被控器或另一个主控器改变。然而,
一个低速的被控器可将串行时钟线保持低电平,以延长总线时钟信号的
低电平周期,使高速的主控器和低速的被控器达到同步,因此,当总线
上正在进行仲裁时,另一个主控器也能改变总线的时钟周期。
I2C总线的控制技术
由于在I2C总线中的多主控器的控制权总是相互竞争,并且在相互
竞争中进行寻址和数据发送,因此总线上没有中央微处理器,也没有任
何优先级。在I2C总线上进行数据传输时,所有的主控器都会在串行时
钟线上产生自己的时钟信号,而且只有当时钟线上的信号处于高电平
时,数据线上的数据才是有效的。因此,当各主控器向总线上输出各不
相同的时钟频率时,只有通过仲裁过程,才可使总线上有一个统一的时
钟信号。只有总线上的时钟线上的一种“线与”连接和双向传输特性来实
现的。因此,I2C总线的控制基础主要是仲裁过程和时钟同步。
在总线的仲裁过程中,一旦有一主控器输出一个低电平时钟信号,
则串行时钟线将由此变为低电平,直到该主控器时钟信号的高电平状态
到来,数据信号才开始传送。在总线上这个时钟线的电平转换,将影响
所有主控器的时钟信号低电平周期的计时。事实上,当一个主控器的时
钟信号由低电平向高电平转换时,它可能并不会改变串行时钟线的低电
平状态,因为此时可能有另一个主控器仍然处于时钟低电平周期。也就
是说,在I2C总线控制中,时钟线将由时钟低电平周期最长的主要控器
保持为低电平状态,而其他时钟低电平周期较短的主控器则将相继进入
时钟高电平等待状态。只有当总线上的所有主控器都结束了时钟低电平
周期的计时后,时钟线才被完全释放,即时钟线的状态达到一致高电平
状态。
当所有主控器时钟信号都进入高电平状态后,便开始了各自的时钟
信号高电平周期计时。当有一个主控器的时钟高电平状态计时结束时,
这个主控器将再次使I2C总线上的时钟线SCL处于低电平状态。从而,
在总线的仲裁过程中,使时钟线通过各主控的时钟输出产生一个统一的
时钟同步信号成为现实。
简言之,在多重主控器的I2C总线上,时钟线信号的低电平周期由
时钟信号低电平周期最长的主控器决定,而时钟线信号的高电平周期则
由时钟信号高电平周期最短的主控器决定。
在I2C总线中,具有主控能力的器件的数据传输和寻址也是在仲裁
中进行的。当有多个主控器企图同时占用总线传输数据时,根据I2C总
线的规约它们之间会有一个促裁过程,以决定谁将占用总线。促裁是在
时钟线SCL为高电平时,根据数据线SDA的状态进行的。因此,仲裁
过程和时钟电平、数据线状态是相辅相成的。也正是这种相辅相成的机
制,使在总线仲裁过程中,当有其他主控器在数据线上传送低电平时,
发送高电平的主控器将会发现此时数据线上的电平与其输出电平不一
致,从而被裁决失去总线的主控权,并立即关闭其数据输出。仲裁过程
可以持续诈多位,以对多个主控器正在企图寻址同一电路的事件进行判
决。如果一个主控器在发送某一字节期间被裁决失去主控权,则它的时
钟信号可继续输出,直到整个字节发送结束为止。如果主控器在其寻址
阶段被仲裁决定失去主控权,则该主控器必须立刻进入被控接收器状
态,以判决被仲裁决定获得主控权的主控器是否正在对它进行寻址。产
生数据的主控器一旦发现内部数据电平与数据总线的实际电平之间有
差异,则它的输出将被立即关闭,随即在总线上输出一个高电平(释放
总线),这就不会影响获得主控权的主控器所进行的数据传输,总线上
的寻址和数据传输等住处也不会丢失。因此,I2C总线的仲裁过程使I2C
总线上的数据传输得以顺利进行,为多种控制功能的实施奠定了良好的
基础。
I2C总线的传输
I2C总线的传输是一个比较复杂的数码传输,它主要是以8bit的字
节进行数据传输,而传输时又总有一个时钟脉冲相对应,因此,I2C总
线的数据传送实质上是个脉冲串的传输,其传输格式如图1-14所示。
图中1为字节传送完成接收器内产生中断信号,2为当处理中断服务时
时钟线保持低电平。
在I2C总线上,每一个数据中,逻辑“0”和逻辑“1”的信号电平取决
于相应的正端电压。I2C总线在进行传送时,在时钟信号为高电平期间,
数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,
数据线上的高电平或低电平状态才允许变化。这就保持了数据传输的有
效性。
在时钟线保持高电平期间,由于数据线由高电平向低电平的变化是
一种稳定的状态,所以就将其状态规定为起始条件;而当时钟线保持高
电平期间,数据线是由低电平向高电平变化,则规定为停止条件。只有
I2C总线中主控器产生起始条件和停止条件两个信号时,总线才会被认
为处于“忙”态或“闲”态,从而准确控制了比特位的传送。
在I2C总线上,比特位传送字节的后面都必须跟随一位确认位,或
称跟随一位应答位。并且数据是以最高有效位首先发出。但是,当正在
进行数据传输的接收器收到完整的一个数据字节后,有可能还要完成一
些其他的工和,如处理一个内部中断服务等。在这种情况下就有可能无
法立刻接收另一字节的数据,因而,此时接收器可以通过总线上的时钟
保持为低电平,从而使发送器进入等待状态,直到接收器准备好接收新
的数据,而接收器通过释放时钟线使数据传输继续进行,正是I2C总线
能允许其他总线的数据格式进行传输,才有一个特殊寻址开始的信息传
输,以及通过对总线产生一个停止信号进行停止。
当一个字节的数据能够被总线上的一个已被寻址的接收器接收后,
总线上的一般要产生一个确认信号,并在这一位时钟信号的整个高电平
期间,使数据保持稳定的低电平状态,从而完成应答确认信号的输出。
确认信号通常是指起始信号和停止信号,如果这个信息是一个起始字
节,或是总线寻址,则总线上不允许有应答信号产生。如果因某种特殊
情况,被控器不对应的被控寻址进行确认回答,则必须将数据线置于高
电平,然后主控器可以通过产一个停止信号来结束总线的数据传输。如
果被控接收器对被控寻址做出了确认应答,但在数据传输的一段时间以
后,又无法继续接收更多的数据,则主控器也将停止数据的继续传送。
因此,被控接收器可以通过对无法接收的第一个数据字节不产生确认应
答信号来通知主控器,即在相应的应答信号时钟位上将数据线置于高电
平,主控器则在总线上产生停止信号,从而结束数据的传送。
注:1-7为地址位;8为读/写位;9为应答位
在I2C总线上,它的数据传输总有一些规约要求,例如,起始信号
的后面总有一个被控器的地址。被控器的地址一般规定为7bit的数据,
数码中的第8比特是数据的传输方向位,即读/写位。一个完整的I2C
总线传输格式如图1-15所示。
在读/写位中,如果是“0”,则表示主控器发送数据,也就是执行“写”
的功能;如果是“1”,则表示主控器接收数据,也就是执行“读”的功能。
而数据的每次传输总是随主控器产生的停止信号而结束。而I2C总线
中,有时主控器希望总占用总线,并不断进行数据传输,因此,在设定
规约时,可以在不首先产生信号的情况下,再次发出起始信号对另一被
控器进行寻址。为解决这一问题,可以采用多种读/写组合形式来进行
总线的一次数据传输。在多种读/写组合形式中,主要有三种措施,其
中:
1.主控发送器向被接收器发送数据,数据传输方向在整个传输过程中不
变。
2.主控器在第一个字节后立即从被控制器读数据,在首位确认应答信号
产生后,主控发送器变成主控接收器,而被接收器变成被控发送器,同
时首位应答信号仍由被控器产生,使停止信号总是由主控器产生。
3.数据传输过程中的复合格式需要改变传送方向时,起始信号和被控器
地址都会被重复产生一次,但两次的读/写方向正好反相。
总之在I2C总线上,通过接口电路收到起始信号后,必须复位它们
的总线逻辑,以使被控制器地址的传输得以预处理,从而完成对各不相
同功能电路的控制