时钟同步 总线仲裁
一、
I2C总线定义
I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。
I2C总线特点
I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
I2C总线工作原理
总线的构成及信号类型
I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。
目前有很多半导体集成电路上都集成了I2C接口。带有I2C接口的单片机有:CYGNAL的 C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列等。很多外围器件如存储器、监控芯片等也提供I2C接口
I2C 总线是一种用于IC器件之间连接的双向二线制总线,所谓总线它上面可以挂多个器件,并且通过两根线连接,占用空间非常的小,总线的长度可长达25英尺,并且能够以10Kbps的最大传输速率支持4个组件。它的另一优点是多主控,只要能够进行接收和发送的设备都可以成为主控制器,当然多个主控不能同一时间 工作。
I2C总线有两根信号线,一根为SDA(数据线),一根为SCL(时钟线)。任何时候时钟信号都是由主控器件产生。
I2C总线操作
I2C规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。
控制字节
在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作。
写操作
写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同。
读操作
读操作有三种基本操作:当前地址读、随机读和顺序读。图4给出的是顺序读的时序图。应当注意的是:最后一个读操作的第9个时钟周期不是“不关心”。为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平、然后发出停止条件。
I2C总线应用
目前有很多半导体集成电路上都集成了I2C接口。带有I2C接口的单片机有:CYGNAL的 C8051F0XX系列,三星的S3C24XX系列,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列等。很多外围器件如存储器、监控芯片等也提供I2C接口。
举常I2C器件/I2C Device
1、存储器类: ATMEL公司的AT24CXX系列EEPROM;
2、I2C总线8位并行IO口扩展芯片PCF8574/JLC1562;
3、I2C接口实时时钟芯片DS1307/PCF8563/SD2000D/M41T80/ME901/ISL1208/;
4、I2C数据采集ADC芯片MCP3221(12bitADC)/ADS1100(16bitADC)/ADS1112(16bitADC)/MAX1238(12bitADC)/MAX1239(12bitADC);
5、I2C接口数模转换DAC芯片DAC5574(8bitDAC)/DAC6573(10bitDAC)/DAC8571(16bitDAC)/;
6、I2C接口温度传感器TMP101/TMP275/DS1621/MAX6625
USB转I2C专用芯片:USB2I2C
USB2I2C是一个USB总线转I2C总线I2C/IIC/TWI/SMBUS的接口芯片,通过USB2I2C芯片可以非常方便地实现PC机USB总线和下位机端I2C接口(即IIC或TWI总线:SCL 线、SDA 线)之间的通信。
USB2I2C芯片上位机PC端提供简单易用的USBIOX.DLL动态库调用,可以方便地被VB,VC,Delphi,Labview,BCB等上位机开发工具调用。相关例程在USBIO公司网站可以找到。
USB2I2C功能特点:
●全速USB设备接口,兼容USB V2.0。
●外围元件简单,只需1个12M晶体和2个电容。
●低成本,可以通过I2C总线直接实现上位机与下位机之间的连接,无需辅助MCU。
●上位机软件能够实现灵活实现I2C/IIC/TWI总线协议的各种操作。
●作为I2C总线Host/Master 主机端。
●I2C接口提供SCL和SDA信号线,支持SCL时钟4种不同传输速度:100KHz/400KHz/750KHz。
●采用SSOP-20小型封装。
二、
SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变(在SCL为高电平时SDA的变化以被定义为开始和结束信号),如图:
三、I2C总线的控制基础:
由于在I2C总线中的多主控器的控制权总是相互竞争,并且在相互竞争中进行寻址和数据发送,因此总线上没有中央微处理器,也没有任何优先级。在I2C总线上进行数据传输时,所有的主控器都会在串行时钟线上产生自己的时钟信号,而且只有当时钟线上的信号处于高电平时,数据线上的数据才是有效的。因此,当各主控器向总线上输出各不相同的时钟频率时,只有通过仲裁过程,才可使总线上有一个统一的时钟信号。只有总线上的时期线上的一种“线与”连接和双向传输特性来实现的。因此,I2C总线的控制基础主要是仲裁过程和时钟同步。
在总线的仲裁过程中,一旦有一主控器输出一个低电平时钟信号,则串行时钟线将由此变为低电平,直到该主控器时钟信号的高电平状态到来,数据信号才开始传送。在总线上这个时钟线的电平转换,将影响所有主控器的时钟信号低电平周期的计时。事实上,当一个主控器的时钟信号由低电平向高电平转换时,它可能并不会改变串行时钟线的低电平状态,因为此时可能有另一个主控器仍然处于时钟低电平周期。也就是说,在I2C总线控制中,时钟线将由时钟低电平周期最长的主要控器保持为低电平状态,而其他时钟低电平周期较短的主控器则将相继进入时钟高电平等待状态。只有当总线上的所有主控器都结束了时钟低电平周期的计时后,时钟线才被完全释放,即时钟线的状态达到一致高电平状态。
当所有主控器时钟信号都进入高电平状态后,便开始了各自的时钟信号高电平周期计时。当有一个主控器的时钟高电平状态计时结束时,这个主控器将再次使I2C总线上的时钟线SCL处于低电平状态。从而,在总线的仲裁过程中,使时钟线通过各主控的时钟输出产生一个统一的时钟同步信号成为现实。
简言之,在多重主控器的I2C总线上,时钟线信号的低电平周期由时钟信号低电平周期最长的主控器决定,而时钟线信号的高电平周期则由时钟信号高电平周期最短的主控器决定。
在I2C总线中,具有主控能力的器件的数据传输和寻址也是在仲裁中进行的。当有多个主控器企图同时占用总线传输数据时,根据I2C总线的规约它们之间会有一个促裁过程,以决定谁将占用总线。促裁是在时钟线SCL为高电平时,根据数据线SDA的状态进行的。因此,仲裁过程和时钟电平、数据线状态是相辅相成的。也正是这种相辅相成的机制,使在总线仲裁过程中,当有其他主控器在数据线上传送低电平时,发送高电平的主控器将会发现此时数据线上的电平与其输出电平不一致,从而被裁决失去总线的主控权,并立即关闭其数据输出。
仲裁过程可以持续诈多位,以对多个主控器正在企图寻址同一电路的事件进行判决。如果一个主控器在发送某一字节期间被裁决失去主控权,则它的时钟信号可继续输出,直到整个字节发送结束为止。如果主控器在其寻址阶段被仲裁决定失去主控权,则该主控器必须立刻进入被控接收器状态,以判决被仲裁决定获得主控权的主控器是否正在对它进行寻址。产生数据的主控器一旦发现内部数据电平与数据总线的实际电平之间有差异,则它的输出将被立即关闭,随即在总线上输出一个高电平,这就不会影响获得主控权的主控器所进行的数据传输,总线上的寻址和数据传输等住处也不会丢失。因此,I2C总线的仲裁过程使I2C总线上的数据传输得以顺利进行,为多种控制功能的实施奠定了良好的基础。
四、
在多主的通信系统中。总线上有多个节点,它们都有自己的寻址地址,可以作为从节点被别的节点访问,同时它们都可以作为主节点向其他的节点发送控制字节和传送数据。但是如果有两个或两个以上的节点都向总线上发送启动信号并开始传送数据,这样就形成了冲突。要解决这种冲突,就要进行仲裁的判决,这就是I 2C总线上的仲裁。
I2C总线上的仲裁分两部分:SCL线的同步和SDA线的仲裁。
1 SCL线的同步(时钟同步)
SCL同步是由于总线具有线“与”的逻辑功能,即只要有一个节点发送低电平时,总线上就表现为低电平。当所有的节点都发送高电平时,总线才能表现为高电平。正是由于线“与”逻辑功能的原理,当多个节点同时发送时钟信号时,在总线上表现的是统一的时钟信号。这就是SCL的同步原理
|
时钟的同步
2 SDA仲裁
SDA线的仲裁也是建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致。是,继续发送;否则,退出竞争。SDA线的仲裁可以保证I2C总线系统在多个主节点同时企图控制总线时通信正常进行并且数据不丢失。总线系统通过仲裁只允许一个主节点可以继续占据总线
3 仲裁过程
两个主节点的仲裁过程
上图是以两个节点为例的仲裁过程。DATA1和DATA2分别是主节点向总线所发送的数据信号,SDA为总线上所呈现的数据信号,SCL是总线上所呈现的时钟信号。当主节点1、2同时发送起始信号时,两个主节点都发送了高电平信号。这时总线上呈现的信号为高电平,两个主节点都检测到总线上的信号与自己发送的信号相同,继续发送数据。第2个时钟周期,2个主节点都发送低电平信号,在总线上呈现的信号为低电平,仍继续发送数据。在第3个时钟周期,主节点1发送高电平信号,而主节点2发送低电平信号。根据总线的线“与”的逻辑功能,总线上的信号为低电平,这时主节点1检测到总线上的数据和自己所发送的数据不一样,就断开数据的输出级,转为从机接收状态。这样主节点2就赢得了总线,而且数据没有丢失,即总线的数据与主节点2所发送的数据一样,而主节点1在转为从节点后继续接收数据,同样也没有丢掉SDA线上的数据。因此在仲裁过程中数据没有丢失。
总结:SDA仲裁和SCL时钟同步处理过程没有先后关系,而是同时进行的。
五、
每一个IIC总线器件内部的SDA、SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起。其中输出为漏极开路的场效应管、输入缓冲为一只高输入阻抗的同相器[1]。这种电路具有两个特点:
①由于SDA、SCL为漏极开路结构,借助于外部的上拉电阻实现了信号的“线与”逻辑;
②引脚在输出信号的同时还将引脚上的电平进行检测,检测是否与刚才输出一致。为 “时钟同步”和“总线仲裁”提供硬件基础。
I2C总线接口内部结构
IIC设备对总线的操作仅有“把线路接地”——输出逻辑0。基于IIC总线的设计,线路上不可能出现电平冲突现象。如果一设备发送逻辑0,其他发送逻辑1,那么线路看到的只有逻辑0。也就是说,如果出现电平冲突,发送逻辑0的始终是“赢家”。总线的物理接法允许主设备往总线写数据的同事读取数据。这样两主设备争总线的时候“赢家”并不知道竞争的发生,只有“输家”发现了冲突——当写一个逻辑1,却读到了0——而退出竞争。
时钟同步
如果被控器希望主控器降低传送速度可以通过将SCL主动拉低延长其低电平时间的方法来通知主控器,当主控器在准备下一次传送发现SCL的电平被拉低时就进行等待,直至被控器完成操作并释放SCL线的控制控制权。这样以来,主控器实际上受到被控器的时钟同步控制。可见SCL线上的低电平是由时钟低电平最长的器件决定;高电平的时间由高电平时间最短的器件决定。这就是时钟同步,它解决了I2C总线的速度同步。
总线仲裁
假设主控器1要发送的数据DATA1为“101 ……”;主控器2要发送的数据DATA2为“1001 ……”总线被启动后两个主控器在每发送一个数据位时都要对自己的输出电平进行检测,只要检测的电平与自己发出的电平一致,他们就会继续占用总线。在这种情况下总线还是得不到仲裁。当主控器1发送第3位数据“1”时(主控器2发送“0” ),由于“线与”的结果SDA上的电平为“0”,这样当主控器1检测自己的输出电平时,就会测到一个与自身不相符的“0”电平。这时主控器1只好放弃对总线的控制权;因此主控器2就成为总线的唯一主宰者。
不难看出:
· ① 对于整个仲裁过程主控器1和主控器2都不会丢失数据;
· ② 各个主控器没有对总线实施控制的优先级别;
· ③总线控制随即而定,他们遵循“低电平优先”的原则,即谁先发送低电平谁就会掌握对总线的控制权。
根据上面的描述,“时钟同步”与“总线仲裁”可以总结如下规律:
· ①主控器通过检测SCL上的电平来调节与从器件的速度同步问题——时钟同步;
· ②主控器通过检测SDA上自身发送的电平来判断是否发生总线“冲突”——总线仲裁。因此,I2C总线的“时钟同步”与“总线仲裁”是靠器件自身接口的特殊结构得以实现的。
[1]同相器:当输入高电平时输出也是高电平,输入低电平时输出也是低电平。主要要于需要缓冲的场合,就是只要输入很小的电流,可输出较大的电流,增加带载能力。