原创 I2c总线原理及其在单片机接口中的应用实例

2006-11-29 00:19 5026 1 7 分类: MCU/ 嵌入式

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


I<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2c总线原理及其在单片机接口中的应用实例


 


The Principle of  I2C-Bus and its Realization in MCU Interface


 


摘要:本文介绍了I2C总线的结构及通信原理,并以串行芯片E2PROM存储芯片AT24C02为例,给出了在单片机上,利用基本I/O口实现I2C总线的方法。


关键词:I2C  AT24C02


 


I2C总线介绍


I2C总线是英文INTER IC BUS IC TO IC BUS的简称,十多年前由PHILIPS公司推出,是近年来微电子通信控制领域广泛采用的一种新型总线标准,它是同步通信的一种特殊形式,具有接口线少,控制方便简化,器件封装形式小,通信速率较高等优点。在主从通信中,可以有多个I2C总线器件同时接到I2C总线上,所有I2C兼容的器件都具有标准的接口,通过地址来识别通信对象,使它们可以经由I2C总线互相直接通信。


I2C总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、ICIC之间进行双向传送,最高传送速率为400kb/s各种被控电路均并联在这条总线上,每个电路都有唯一的地址。在信息的传输过程当中,I2C总线上并联的每一个模块电路既是被控器(或是主控器),又是发送器(或是接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和数据码两部分:地址码用来选址,及接通需要控制的电路;数据码是通信的内容,这样各控制电路虽然挂在同一条总线上,却彼此独立。


I2C总线的数据传输


在传输数据开始前,主控器件应发送起始位,通知从器件做好接收准备;在传输数据结束时,主控器件应发送停止位,通知从器件停止接收,


起始位时序:当SCL位为高位时,SDA线由高到低的转换。


停止位时序:当SCL位为高位时,SDA线由低到高的转换。


 


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


SDA上的数据在时钟高电平期间必须保持稳定,在SCL低电平期间才可以改变,输出到SDA 线上的每个字节必须是8位,每次传输的字节不受限制,每个字节必须有一个确认位(又称应答位ACK),与确认位对应的时钟脉冲由主控器产生,发送器在应答期间必须拉低SDA线。


SDA线连续写操作数据状态为:(S表示开始信号STARTA表示应答信号ACKP表示停止信号STOP )



SDA线连续读操作数据状态为:



 


AT24C0280C51的连接及模拟软件程序


AT24CXX系列芯片是采用I2C总线标准的常用串行E2PROM存储芯片,AT24C02是其中之一,它具有2KBITS256BYTE)的存储容量,工作于从器件方式,页写的最大8个字节,而且此系列片内地址在接收到每一个数据字节后自动加1,故装载一页以内数据字节时,只需输入首地址,如果写到此页的最后一个字节,主器件继续发送数据,数据将从该页的首地址写入而造成数据丢失。


                                     1    51单片机与AT24C02的连接电路图


解决办法是:在第8个数据后将地址强制加一,或是将下一页的 首地址付给寄存器。


数据传送格式是以主设备发送启动信号开始,跟着发送第一字节,此字节的高7位为从设备地址,最低位为指明数据传送方向的R/W(读写)位,该位为0表示主设备向从设备发送数据,为1表示从设备向主设备发送数据。如果地址的高4位不是全0或全1,则接着就可发送所需的数据字节。


        总线每次传送的字节数没有限制,但是各字节之间必须插入一个应答位,数据字节从最高位开始发送,全部数据发送完后,就发送停止信号完成一次数据传送。应答位是在发送每个字节之后主设备发出的第9个时钟脉冲的高电平期间,由接收设备拉低SDA以这一低电平作为数据字节已被接受的应答,发送设备也于此期间释放(拉高)SDA线。


 


                                                                


51单片机与AT24C02的连接电路原理图如图1所示,A2~A0为地址引脚(按照000~111的顺序与VCCGND相连,因只用了一片,所以将A2A1A0设置为000),WP为写保护引脚,因AT24C02不具备写保护的功能,将其接地,



 


 


以下是完整的I2C读写程序,在写串行E2PROM子程序E2PW中,(R3=器件地址,(R4=片内字节地址,(R1=欲写数据存放地址指针,(R7=连续写字节数N;在读串行E2PROM子程序E2PR中,(R1=欲读数据地址指针,(R3=器件地址,(R4=片内字节地址,(R7=连续读字节数,


 


SDA  BIT P2.1                                                                                                  


SCL   BIT P2.0


ORG 0000H


AJMP INIT


ORG 0100H


INIT:  CLR RS0


           CLR RS1


           MOV R1,#30H


           MOV A,#50H


           MOV R7,#08H


           MOV R3,#0A0H


           MOV R4,#00H


 


LOOP: MOV @R1,A


            INC R1


            INC A


            DJNZ R7,LOOP           ;初始化存储器的值,将数据50H~57H发送到内部30H~37H单元


 


E2PW:MOV P2,#0FFH   ;      p2.0, p2.1 均为1


           CLR P2.1  ;                  发开始信号


           MOV A,R3;              送器件地址


           ACALL SUBS      


 


           MOV A,R4;              送片内字节地址


           ACALL SUBS             调发送单字节子程序


           MOV R1,#30H


 


           MOV R7,#08H   ;        AT24C02一次可装载的字节数为8


AGAIN:MOV A,@R1


             ACALL SUBS


             INC R1


             DJNZ R7,AGAIN;     发送8个字节到IIC模块


             CLR P2.1          ;        发送完8个数据后,先将SDA拉低,准备发停止位


             ACALL DELAY


             SETB P2.0      ;          SCL拉高


             ACALL DELAY


             SETB P2.1      ;          在由主设备将SDA拉高,送出停止位   


 


           MOV R7,#08H         再一次给R7赋值,准备读数据


E2PR: MOV R1,#40H


           MOV P2,#0FFH      p2.0, p2.1 均为1


           CLR P2.1                 发开始信号


           MOV A,R3              发器件地址


           ACALL SUBS         调发送单字节子程序


           MOV A,R4              送片内字节地址


           ACALL SUBS


           MOV P2,#0FFH;        p2.0, p2.1 均为1


           CLR P2.1                再发开始信号


           MOV A,R3


           SETB ACC.0          发读命令


      ACALL SUBS


 


MORE: ACALL SUBR   ;     进入读数据模式


      MOV @R1,A


      INC R1


      DJNZ R7,MORE;            8个字节到内部40H~47H


      CLR P2.1


      ACALL DELAY


      SETB P2.0


      ACALL DELAY


      SETB P2.1                   送停止信号


      ajmp $


SUBS: MOV R0,#08H;发送单字节子程序


LOOP1: CLR  P2.0  ;      只有在SCL为低电平时才能改变SDA的值


              RLC A


              MOV P2.1 ,C


              NOP


              SETB P2.0 ;       SCL1,保持数据


              ACALL DELAY;   需要保持一段时间


              DJNZ R0,LOOP1;循环8次送8个位


              CLR P2.0


              ACALL DELAY


              SETB P2.0     ;        进入第9个时钟脉冲


 REP:    JB P2.1,$;                 判断答到否,未到则等待。这里SDA由接受端拉低


             CLR P2.0


RET


DELAY:         MOV R5,#20H;为满足传输速率要求延时子程序


DELAY2:       MOV R6,#10H


DELAY3:       DJNZ R6,DELAY3


                DJNZ R5,DELAY2


                  RET


SUBR:   MOV R0,#08H    接收单字节子程序


LOOP2:SETB P2.0            直接将SCL1,准备接收


             ACALL DELAY


             MOV C, P2.1


             RLC A                   将收到的位循环到0位上


             CLR P2.0


             ACALL DELAY


             DJNZ R0,LOOP2


     CJNE R7 ,#01H, LOWA


     SETB P2.1           若是最后一个字节,置SDA=1


             AJMP SETOK


LOWA:   CLR P2.1            否则置SDA=0


SETOK: ACALL DELAY


               SETB P2.0


               ACALL DELAY


       CLR P2.0


       ACALL DELAY


       SETB P2.1                    应答完毕,SDA1


       RET


END


 


注意在接收的时候,应该在SCL高电平时,即保持时间段时读数据。


结束语


随着I2C总线在通信,控制等方面的普遍应用,本文以实例的方式给出了I2C总线在单片机上的实现方法,具有一定的实用性与可移植性。


 


     

PARTNER CONTENT

文章评论6条评论)

登录后参与讨论

用户1395973 2009-6-1 10:17

比较重要的地方吧

用户1395973 2009-6-1 09:59

变色的字是什么意思?

huanglihua0917_191789474 2009-5-6 14:37

谢谢 I2C总线的地址可不可以不接?让他悬空。如24c16,我只接A2,A1,A0悬空可以不??

用户21428 2008-4-14 11:24

   您好,很高兴来到您这!在您这看到我感兴趣的东西!
   在《I2c总线原理及其在单片机接口中的应用实例》一文中您所附的图(如电路连接图)显示不了,您能在百忙之中给我发一下吗?在此先行谢过! 0400220219@163.com

用户21428 2008-4-14 11:19

您好,很高兴来到您这!在您这看到我感兴趣的东西! 在《I2c总线原理及其在单片机接口中的应用实例》一文中您所附的图显示不了,您能在百忙之中给我发一下吗?在此先行谢过! 0400220219@163.com

用户492611 2007-7-9 17:28

能把IIC的資料發給我嗎,或者你給我講一下其基本原理。zhbcym@163.com

相关推荐阅读
用户1316357 2006-11-29 00:23
93AA46控制子程序
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 93AA46控制子程序      ...
用户1316357 2006-11-29 00:15
如何开发自己的操作系统的引导程序?
如何开发自己的操作系统的引导程序?   当你打开计算机时发生了什么?   1.电源打开;2.BIOS开始执行;3.引导程序开始执行。   引导程序的规定:你要有一个普通的二进制文件(COM 格式);大...
用户1316357 2006-11-29 00:00
数字电视技术
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = ...
EE直播间
更多
我要评论
6
1
关闭 站长推荐上一条 /3 下一条