<?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之间、IC与IC之间进行双向传送,最高传送速率为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表示开始信号START,A表示应答信号ACK,P表示停止信号STOP )
SDA线连续读操作数据状态为:
AT24C02与80C51的连接及模拟软件程序
AT24CXX系列芯片是采用I2C总线标准的常用串行E2PROM存储芯片,AT24C02是其中之一,它具有2KBITS(256BYTE)的存储容量,工作于从器件方式,页写的最大8个字节,而且此系列片内地址在接收到每一个数据字节后自动加1,故装载一页以内数据字节时,只需输入首地址,如果写到此页的最后一个字节,主器件继续发送数据,数据将从该页的首地址写入而造成数据丢失。
图1 51单片机与AT24C02的连接电路图
解决办法是:在第8个数据后将地址强制加一,或是将下一页的 首地址付给寄存器。
数据传送格式是以主设备发送启动信号开始,跟着发送第一字节,此字节的高7位为从设备地址,最低位为指明数据传送方向的R/W(读写)位,该位为0表示主设备向从设备发送数据,为1表示从设备向主设备发送数据。如果地址的高4位不是全0或全1,则接着就可发送所需的数据字节。
总线每次传送的字节数没有限制,但是各字节之间必须插入一个应答位,数据字节从最高位开始发送,全部数据发送完后,就发送停止信号完成一次数据传送。应答位是在发送每个字节之后主设备发出的第9个时钟脉冲的高电平期间,由接收设备拉低SDA,以这一低电平作为数据字节已被接受的应答,发送设备也于此期间释放(拉高)SDA线。
51单片机与AT24C02的连接电路原理图如图1所示,A2~A0为地址引脚(按照000~111的顺序与VCC和GND相连,因只用了一片,所以将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 ; SCL置1,保持数据
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 ; 直接将SCL置1,准备接收
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; 应答完毕,SDA置1
RET
END
注意在接收的时候,应该在SCL高电平时,即保持时间段时读数据。
结束语:
随着I2C总线在通信,控制等方面的普遍应用,本文以实例的方式给出了I2C总线在单片机上的实现方法,具有一定的实用性与可移植性。
用户1395973 2009-6-1 10:17
用户1395973 2009-6-1 09:59
变色的字是什么意思?
huanglihua0917_191789474 2009-5-6 14:37
用户21428 2008-4-14 11:24
在《I2c总线原理及其在单片机接口中的应用实例》一文中您所附的图(如电路连接图)显示不了,您能在百忙之中给我发一下吗?在此先行谢过! 0400220219@163.com
用户21428 2008-4-14 11:19
用户492611 2007-7-9 17:28
能把IIC的資料發給我嗎,或者你給我講一下其基本原理。zhbcym@163.com