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总线上,通过接口电路收到起始信号后,必须复位它们的总线逻辑,以使被控制器地址的传输得以预处理,从而完成对各不相同功能电路的控制