电子百科
I2C总线上只具有SOL(时钟)和SDA(数据)2根信号线。如果是单纯的串行传输,一旦因为某种原因造成引脚的偏差,则可能会造成不能区分总线上传输的是数据还是地址信息的后果。解决上述问题的简单办法就是附加独立于总线的Reset(复位)信号,由主机控制该信号。因为I2C至少利用2根线进行所有的操作,因此在数据传输时,通常当SCL为低电平时,设置下一个数据;当SDA变化后,SCI为高电平,这可以解释为一连串操作的开始/结束。
1. 起始条件
始条件表示一系列操作的开始。图1表示起始条件以及随后数据传输的开始操作。在I2C总线的空闲状态下,SDA及SCL通过上拉电阻都为高电平。在这样的状态下,如果SCL仍保持高电平,而SDA变为低电平,则成为开始指令。
图1 I2C总线的起始条件
由于该状态并不出现于地址及数据的发送与接收过程中,因此,即使在途中发生异常,只要检测出该状态,初始化内部的状态机,就可以使其恢复。
2. 结束条件
在一系列操作的最后是结束条件。结束条件如图2所示。当SOL为高电平时,一旦SDA由低电平变化为高电平,即成为结束条件,主机与器件之间的通信将停止,器件恢复为空闲状态。进行写操作时的结束状态是开始进行EEPROM内部单元写操作的指示标志。
图2 I2C总线的结束条件
结束前所传输的数据是ACK/NoACK的状态位,如果是ACK,则该状态位为低电平。但如果发生某种错误时,则表示为NoACK的高电平。读操作时的最后字节是主机向器件返回NoˉACK信息,所以SDA为高电平。这样就不能形成结束条件所需要的SDA的上升沿,因此在结束之前需要加入哑元“0”数据位作为解决办法。
在最终数据的ACK NoACK之后,主机通过下述的流程,形成结束条件,如下所述:
①SCL变为低电平;
②SDA变为低电平;
③SOL变为高电平(发送哑元数据);
④SDA变为高电平(结束条件)。
3. 数据传输
数据传输的流程如图3所示。除去开始与结束条件,在传输包含地址指定等数据时,能够使SDA发生变化的条件只能是在SOL为低电平时。因此,总线操作以如下的步骤进行:
①SCL变为低电平;
②为SDA设置数据(主机或者器件);
③SCL变为高电平。
进行数据读操作时,主机在SOL恢复为高电平之前读取数据。
图3 I2C总线的数据传输
在I2C总线的数据传输过程中,主控器和被孔器工作在两个相反的状态 并且在一次通信过程中一股不发生转换;
1. 主控器为发送器(主控发送器)时被控器为接收器(被控接收器);
2. 主控器为接收器(主控炫收器)时被控器为发送器(被控发送器)。
图所下为一次完整的通信过程时序,在I2C总线上进行的每一次通信过程,都存在在如下规律:
图 一个完整通信过程的I2C总线信号时序
1. 由主控器主动发起,并且以发送启动信号S和停止信号P分别来掌管总线和释放总线。
2. 通信过程都是以启动信号S开始、以停止信号P结束。
3. 传送的数据字节数没有限制。
4. 主控器在启动信号后紧接着发送一个地址字节,其实包含7位被控器地址码和1位读/写控制位R/W。
5. 读/写控制位R/W(或称作方向位)用于通知被控器数据传送的方向,0表示这次通信是由主控器向被控器写数据,1表示这次通信是主控器从被控器读数据。
6. 每传送1个地址字节或数据字节共需要9个时钟脉冲, 其中第1~8个时钟脉冲对应的是由发送器向接收器发送的信息,笫9个脉冲对应的是由接收器句发送器反馈的一个应答位ACK。
7. 所有挂接到I2C总线上的被控器件都接收启动信号后的地址字节,并且把接收到的7位地址码与自己的地址进行比较,如果相符即为主控器寻址的被控器,在第9个时钟脉冲期间反馈应答信号。
8. 每个数据字节在传送时都是高位(MSB)在前。
M24Cxx的读操作模式及其各种模式的操作流程如图1、图2所示。
1. 当前地址读
EEPROM内部具有保持当前地址的寄存器。读取当前地址的数据时,不需要指定地址。只要单纯给出读指令就可读出数据。读取完毕后,内部所保持的当前地址将自动进位。
图1 I2C存储器的读操作(1)
图2 I2C存储器的读操作(2)
数据读操作后的ACK/NoACK信号由主机返回,但必须返回NoACK信号。
2. 随机读
随机读是由主机指定任意的地址读取的。利用写指令设定地址,如果赋予读指令则可以读出当前地址。所以,与字节写操作时相同,在第1字节的数据后面给出地址。在这里,一旦发送出数据就成为写操作,在此设置开始条件,取消向写操作的迁移而发出读指令,将从事先设定的地址中读出数据。
此时,DEVSEL数据(前7位数据)必须设定与最初写指令所发送的相同的值。
3. 顺序读
在当前地址读操作之后,如果主机返田ACK信号,则为顺序读模式,器件将准备下一个地址的数据,主机取回该数据。一旦到达要读出的最终地址,主机将返回NoACK信号,通知器件这已是最后的数据。
4. 顺序随机读
当指定任意地址、希望由此连续读出数据时,可利用该模式。只要认为这是与对应于当前读的顺序读相同的模式即可。
顺序随机读模式与随机读同样进行读操作,接收到数据后如果是ACK应答,则器件将准各下一个地址的数据;如果是最终数据,则返回NoACK信号,结束数据的传输。
在I2C总线上传输操作是以8位+ACK/NoACK共计9位为单位进行的。发送是从位7(MSB)开始进行的,虽然一般的串口(PC机的COM端口等)是由位0(LSB)开始发送的,但I2C总线是相反的,这一点需要注意。接收8位数据或者指令的接收方在下一个时钟输出ACK/NoACK位,如果是低电平则表示ACK;如果是高电平则表示NoACK。
写操作包括字节写及页面写两种。字节写是只置换特定的1个地址;而页面写可置换汇总了16字节界限内的连续的地址范围(页)。各种写操作的流程图如图所示。
图 I2C存储器的字节写与页面写
1. 字节写
这是指定任意的地址(8位)写人数据的方式。
起始字节的DEVSEL按照前面描述的起始数据的格式,位7~4是“1010”的固定模式,位操作(“1”)还是写操作(“0”)。
如果存储器处于写保护状态(WC引脚为高电平等),则在接收地址之前一直返回ACK信号,对于之后传输的数据,则返回No-ACK信号。
数据发送完毕后,如果检测出来自主机的结束条件,则EEP-ROM内部开始进行写入操作。根据数据手册可查出完成写入操作所需要的时间。+5V的产品需要5ms,其他的产品大约需要10ms左右的时间。
EEPROM内部的替换周期在进行过程中,即使发送下一个指令也将返回NoACK信号。因此,利用该NoACK信号就可判断内部的操作是否完成。
2. 页面写
页面写操作本身与字节写是相同的。由于在存取后地址自动进位,因而可以按序发送1页(16字节)以内的数据。实际上向存储器单元的写人操作,与字节写相同,都是在检测出结束条件后进行的,所以需要等待,直到操作结束,然后再进行下一个操作。
I 2C总线起源与特点
I 2C(Inter-IntegratedCircuit)总线是一种由Philips公司开发的两线式串行总线,用于连接微控制器及其外围设备。12C总线产生于20世纪80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,管理系统的配置或掌握组件的功能状态,如电源和系统风扇;可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,以便有效进行管理。
12C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此VC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10kb/s的最大传输速率支持40个组件。12C总线的另一个优点是,他支持多主控(multimastering),其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
12C总线的构成及信号类型
PC总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kb/s。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有惟一的地址,在信息的传输过程中,12C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于他所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。
VC总线在传送数据过程中共有3种类型信号,他们分别是:开始信号、结束信号和应答信号。 开始信号 SCL为高电平时,SDA由高电平向低电子跳变,开始传送数据。
结束信号 SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号 接收数据的IC在接收到8b数据后,向发送数据的IC发出特定的低电子脉冲,表示已收到数据。CPU向受控单元发出二个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况做出是否继续传递信号的判断。若未收到应答信号,判断为受控单元出现故障。
目前有很多半导体集成电路上都集成了12C接口。带有12C接口的单片机有:Cygnal的C8051FOXX系列,Philips的SAA73XX与SAA78XX系列等。很多外围器件如存储器、监控芯片等也提供12C接口。
3 总线基本操作
I2C规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电子的期间,SDA状态的改变被用来表示起始和停止条件。如图1所示。
3.1 控制字节
在起始条件之后,必须是器件的控制字节,其中高4位为器件类型识别符(不同的芯片类型有不同的定义,E2PROM一般应为1010),接着3位为片选,最后一位为读写位,当为1时为读操作,为。时为写操作。如图2所示。
3.2 写操作
写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同。关于页面写的地址、应答和数据传送的时序如图3所示。
3.3 读操作
读操作有3种基本操作:当前地址读、随机读和顺序读。图4给出的是顺序读的时序图。应当注意的是最后一个读操作的第9个时钟周期不是"不关心"为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电子、然后发出停止条件。
4.I2C总线软件编写
一般I2C通用读写程序的编写主要包括以下几个模块:I2C总线的初始化子程序;延时子程序;起始、结束子
以上部分是I2C总线各个部分的软件编写。其中SDA,SCL口的定义留给用户,用户可以根据需要自行定义。
5 结 语
PC总线由于其简单的硬件结构,在智能控制、单芯片控制、LCD驱动器、远程I/O控制,特别是在日益流行的视听系统、多媒体系统、家庭影院得到了广泛应用,已经成为一种工业标准,相信随着数字化时代的到来,一定会有更美好的发展前景,一定会得到更好的应用.