I2C总线是一种用于IC器材之间衔接的二线制总线。它经过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上的器材之间传送信息,并依据地址辨认每个器材:不管是单片机、存储器、LCD驱动器仍是键盘接口。
2.双向传输的接口特性 传统的单片机串行接口的发送和接纳一般都各用一条线,如MCS51系列的TXD和RXD,而I2C总线则依据器材的功用经过软件程序使其可作业于发送或接纳方法。当某个器材向总线上发送信息时,它便是发送器(也叫主器材),而当其从总线上接纳信息时,又成为接纳器(也叫从器材)。主器材用于发动总线上传送数据并产生时钟以敞开传送的器材,此刻任何被寻址的器材均被以为是从器材。I2C总线的操控完全由挂接在总线上的主器材送出的地址和数据决议。在总线上,既没有中心计,也没有优先机。
总线上主和从(即发送和接纳)的联系不是原封不动的,而是取决于此刻数据传送的方向。SDA和SCL均为双向I/O线,经过上拉电阻接正电源。当总线闲暇时,两根线都是高电平。衔接总线的器材的输出级有必要是集电极或漏极开路,以具有线“与”功用。I2C总线的数据传送速率在规范作业方法下为100kbit/s,在快速方法下,最高传送速率可达400kbit/s。
3.I2C总线上的时钟信号 在I2C总线上传送信息时的时钟同步信号是由挂接在SCL时钟线上的一切器材的逻辑“与”完结的。SCL线上由高电平到低电平的跳变将影响到这些器材,一旦某个器材的时钟信号下跳为低电平,将使SCL线一向坚持低电平,使SCL线上的一切器材开端低电平期。此刻,低电平周期短的器材的时钟由低至高的跳变并不能影响SCL线的状况,所以这些器材将进入高电平等候的状况。
当一切器材的时钟信号都上跳为高电平时,低电平期完毕,SCL线被开释回来高电平,即一切的器材都一起开端它们的高电平期。这今后,第一个完毕高电平期的器材又将SCL线拉成低电平。这样就在SCL线上产生一个同步时钟。可见,时钟低电平时刻由时钟低电平期最长的器材承认,而时钟高电平时刻由时钟高电平期最短的器材承认。
4.数据的传送 在数据传送进程中,有必要承认数据传送的开端和完毕。在I2C总线技术规范中,开端和完毕信号(也称发动和中止信号)的界说如图2所示。当时钟线SCL为高电平时,数据线SDA由高电平跳变为低电平界说为“开端”信号;当SCL线为高电平时,SDA线产生低电平到高电平的跳变为“完毕”信号。开端和完毕信号都是由主器材产生。在开端信号今后,总线即被以为处于忙状况;在完毕信号今后的一段时刻内,总线被以为是闲暇的。
I2C总线的数据传送格局是:在I2C总线开端信号后,送出的第一个字节数据是用来挑选从器材地址的,其间前7位为地址码,第8位为方向位(R/W)。方向位为“0”表明发送,即主器材把信息写到所挑选的从器材;方向位为“1”表明主器材将从从器材读信息。开端信号后,体系中的各个器材将自己的地址和主器材送到总线上的地址进行比较,假如与主器材发送到总线上的地址共同,则该器材即为被主器材寻址的器材,其接纳信息仍是发送信息则由第8位(R/W)承认。
在I2C总线上每次传送的数据字节数不限,但每一个字节有必要为8位,并且每个传送的字节后边有必要跟一个认可位(第9位),也叫应对位(ACK)。数据的传送进程如图3所示。每次都是先传最高位,一般从器材在接纳到每个字节后都会作出呼应,即开释SCL线回来高电平,预备接纳下一个数据字节,主器材可持续传送。假如从器材正在处理一个实时事情而不能接纳数据时,(例如正在处理一个内部中止,在这个中止处理完之前就不能接纳I2C总线上的数据字节)能够使时钟SCL线坚持低电平,从器材有必要使SDA坚持高电平,此刻主器材产生1个完毕信号,使传送反常完毕,迫使主器材处于等候状况。当从器材处理完毕时将开释SCL线,主器材持续传送。
当主器材发送完一个字节的数据后,接着宣布对应于SCL线上的一个时钟(ACK)认可位,在此刻钟内主器材开释SDA线,一个字节传送完毕,而从器材的呼应信号将SDA线拉成低电平,使SDA在该时钟的高电平期间为安稳的低电平。从器材的呼应信号完毕后,SDA线回来高电平,进入下一个传送周期。
I2C总线还具有播送呼叫地址用于寻址总线上一切器材的功用。若一个器材不需求播送呼叫寻址中所供给的任何数据,则能够疏忽该地址不作呼应。假如该器材需求播送呼叫寻址中供给的数据,则应对地址作出呼应,其表现为一个接纳器。
5.总线竞赛的裁定 总线上或许挂接有多个器材,有时会产生两个或多个主器材一起想占用总线的状况。例如,多单片机体系中,或许在某一时刻有两个单片机要一起向总线发送数据,这种状况叫做总线竞赛。I2C总线具有多主控才干,能够对产生在SDA线上的总线竞赛进行裁定,其裁定原则是这样的:当多个主器材一起想占用总线时,假如某个主器材发送高电平,而另一个主器材发送低电平,则发送电平与此刻SDA总线电平不符的那个器材将主动封闭其输出级。总线竞赛的裁定是在两个层次上进行的。首先是地址位的比较,假如主器材寻址同一个从器材,则进入数据位的比较,然后保证了竞赛裁定的可靠性。由所以使用I2C总线上的信息进行裁定,因而不会形成信息的丢掉。
6. I2C总线接口器材 现在在视频处理、移动通讯等范畴选用I2C总线接口器材现已比较遍及。别的,通用的I2C总线接口器材,如带I2C总线的单片机、RAM、ROM、A/D、D/A、LCD驱动器等器材,也越来越多地应用于计算机及主动操控体系中。
AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8位存储空间,具有作业电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特色。
电子制造实验室网站供给的AT89C51实验开发板上带有一片AT24C02芯片能够供给实验。下面是它的电路图。
图中AT24C02的1、2、3脚是三条地址线,用于承认芯片的硬件地址。在AT89C51实验开发板上它们都接地,第8脚和第4脚分别为正、负电源。第5脚SDA为串行数据输入/输出,数据经过这条双向I2C总线串行传送,在AT89C51实验开发板上和单片机的P3.5衔接。第6脚SCL为串行时钟输入线,在AT89C51实验开发板上和单片机的P3.6衔接。SDA和SCL都需求和正电源间各接一个5.1K的电阻上拉。第7脚需求接地。
24C02中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器主动加1,以完结对下一个存储单元的读写。一切字节均以单一操作方法读取。为下降总的写入时刻,一次操作可写入多达8个字节的数据。
;这是将0600H地址中以下的8个数据写到24C02的01H为首址单元中去的汇编程序
ORG 0000H
SCL BIT P3.4;界说24C02的串行时钟线
SDA BIT P3.5;界说24C02的串行数据线
LJMP START
START:LCALL STAR;调用
MOV R2,#08H;一个数据有8位
MOV DPTR,#0600H;界说源数据的方位
LOOP:MOV A,#00H
MOVC A,@A+DPTR
LCALL SDATA
LCALL ACK
JC LOOP
INC DPTR
DJNZ R2,LOOP
LCALL STOP;调用中止子程序
STAR:SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
SDATA:MOV R0,#08H
LOOP0:RLC A
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
DJNZ R0,LOOP0
RET
ACK:SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
MOV C,SDA
CLR SCL
RET
STOP:CLR SDA
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
RET
ORG 0600H
DB 0A0H,10H,01H,02H,03H,04H,05H,06H
END
读写子程序如下:
;写串行E2PROM子程序EEPW
; R3=10100000(指令1010+器材3位地址+读/写。 器材地址一个芯片,是000)
; (R4)=片内字节地址
; (R1)=欲写数据寄存地址指针
; (R7)=接连写字节数n
EEPW: MOV P1,#0FFH
CLR P1.0 ;发开端信号
MOV A,R3 ;送器材地址
ACALL SUBS
MOV A,R4 ;送片内字节地址
ACALL SUBS
AGAIN: MOV A,@R1
ACALL SUBS ;调发送单字节子程序INC R1
DJNZ R7,AGAIN;接连写n个字节
CLR P1.0 ;SDA置0, 预备送中止信号
ACALL DELAY ;延时以满意传输速率要求
SETB P1.1 ;发中止信号
ACALL DELAY
SETB P1.0
RET
SUBS: MOV R0,#08H ;发送单字节子程序
LOOP: CLR P1.1
RLC A
MOV P1.0,C
NOP
SETB P1.1
ACALL DELAY
DJNZ R0,LOOP ;循环8次送8个bit
CLR P1.1
ACALL DELAY
SETB P1.1
REP: MOV C,P1.0
JC REP ;判应对到否,未到则等候
CLR P1.1
RET
DELAY: NOP
NOP
RET
;读串行E2PROM子程序EEPR
;(R1)=欲读数据寄存地址指针
;; R3=10100001(指令1010+器材3位地址+读/写。 器材地址一个芯片,是000)
;(R4)=片内字节地址
;(R7)=接连读字节数
EEPR: MOV P1,#0FFH
CLR P1.0 ;发开端信号
MOV A,R3 ;送器材地址
ACALL SUBS ;调发送单字节子程序
MOV A,R4 ;送片内字节地址
ACALL SUBS
MOV P1,#0FFH
CLR P1.0 ;再发开端信号
MOV A,R3
SETB ACC.0 ;发读指令
ACALL SUBS
MORE: ACALL SUBR
MOV @R1,A
INC R1
DJNZ R7,MORE
CLR P1.0
ACALL DELAY
SETB P1.1
ACALL DELAY
SETB P1.0 ;送中止信号
RET
SUBR: MOV R0,#08H ;承受单字节子程序
LOOP2: SETB P1.1
ACALL DELAY
MOV C,P1.0
RLC A
CLR P1.1
ACALL DELAY
DJNZ R0,LOOP2
CJNE R7,#01H,LOW
SETB P1.0 ;若是最终一个字节置A=1
AJMP SETOK
LOW: CLR P1.0 ;不然置A=0
SETOK: ACALL DELAY
SETB P1.1
ACALL DELAY
CLR P1.1
ACALL DELAY
SETB P1.0 ;应对毕,SDA置1
RET
程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满意I2C总线上数据传送速率的要求,只有当SDA数据线上的数据安稳下来之后才干进行读写(即SCL线宣布正脉冲)。别的,在读最终一数据字节时,置应对信号为“1”,表明读操作行将完结。