新闻  |   论坛  |   博客  |   在线研讨会
I2C总线原理与应用(好)
ddllxxrr | 2008-06-03 17:12:19    阅读:2058   发布文章

I2C总线原理与应用
2008年05月10日 星期六 22:15
I2C总线原理与应用
----转载

一.简介

I2C(Inter -Integrated Circuit)总线是一种由Philips公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设 备开发。由于其简单性,如今方泛用于微控制器与各种功能模块的连接,可以说是学单片机的人,入门之后,必定要涉及到的。

I2C 总线实际上已经成为一个国际标准在超过100 种不同的IC 上实现,而且得到超过50 家公司的许可,正因为其简单和应用广泛,因此其功能也越来不满足人们的要求,其速度也从原来的100Kbit/S,增加了快速模式,其速度达 400Kbit/S,再后来也增加了高速模式,其速度更达3.4Mbit/S。

二.功能和特点

I2C 总线是一种用于IC器件之间连接的双向二线制总线,所谓总线它上面可以挂多少器件,并且通个两根线连接,占用空间非常的小,总线的长度可高达25英尺,并 且能够以10Kbps的最大传输速率支持4个组件。它的另一优点是多主控,只要能够进行接收和发送的设备都可以成为主控制器,当然多个主控不能同一时间 工作。

I2C总线有两根信号线,一根为SDA(数据线),一根为SCL(时钟线)。任何时候时钟信号都是由主控器件产生。

I2C总线在传送数据的过程中,主要有三种控制信号:起始信号,结不信号,应答信号

起始信号:当SCL为高电平时,SDA由高电平转为低电平时,开始传送数据

结束信号:当SCL为高电平时,SDA由低电平转为高电平时,结束数据传送

应答信号:接收数据的器件在接收到8bit数据后,向发送数据的器件发出低电平信号,表示已收到数据。这个信号可以是主控器件发出,也可以是从动器件发出。总之由接收数据的器件发出。

这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。

三.基本操作

下面我们以ATMEL公司的AT24C02来介绍I2C的基本操作

AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8bit存储空间,具有工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。他在系统中始终为从动器件。

对AT24C02的操作主要有:字节读,字节写,页面读,页面写

首先发送起始信号,起始信号后必须是控制字,

 

控制字格式如下,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,也就是三个地址位,最后一位为读写控制位,当为1(Input)时为读操作,为0(Output)时为写操作。

 

控制字后就是相应的操作,读或写,一定不要结束,因为这个操作还没有完成,如果结束就等于放弃操作。

先 来看写操作,写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同,AT24C02为8字节,每写一个字节后,地址自动加 1。关于页面写的地址、应答和数据传送的时序参见图3,字节写可以看成是只有一个字节的页面写,也就是写一个数据后停止。注意:写一次需要一定时间,一般 为10ms,要等侍这个操作完成。时序如下图:

说明:对于AT24C02,在控制字后还必须写入地址,这个地址是以后读写的起始地址。

读 操作有三种基本操作:当前地址读、随机读和顺序读。三种操作方法类似,只是读的数据个数不同,可连续读8个字节,图4给出的是顺序读的时序图,图中共读了 四个数据,需要注意的是当前的地址,如果不是想要的,可以用写操作,重新写入地址。非常重要的是,每读一个数据后,必须置低SDA,作为应答,否则,只能 读一个数据,后面的数据,因为收到不应答信号,AT24C02就会认为出错,停止操作。特别提醒的是,当SCL为低电平时,数据是可变的,因些只有SCL 为高电平时,才能读数。(相关时序,请看例程序的,读功能函数)

四.例程序(51汇编,测试单片机为AT89C51,12M晶振)

电路连接如图5,其中A0,A1,A2为地址线,本例中全部接地,因此全部为0。由于SCL和SDA为漏极开路输出,所以在使用时,需加上拉电阻。

 

程 序功是将数据66H写入AT24C02地址单元00,数据88H写01单元,再将00单元读出放入单片机的40H单元,01单元读出放入41H单元,再将 其分别写入AT24C02的02和03地址单元,最后将00,02读出比较,01与03比较,如果相等,LED发光。以下是程序。可将本程序复制,编译 后,烧录后测试。 (程序看似复杂,其实很多功能是重复的)

SCL EQU P3.0        ;时钟
SDA EQU P3.1 ;数据
LED EQU P1.0 ;操作成功指示,低电平点亮
ORG 0X0000
LJMP MAIN
;启动功能函数,NOP用于满足AT24C02的速度要求
START: CLR SCL ;先将SCL置低才改变SDA,以免误操作
NOP
NOP
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
CLR SDA
NOP
NOP
RET
;结束功能函数
STOP: CLR SCL ;先将SCL置低才改变SDA,以免误操作
NOP
NOP
CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
RET

;应答函数
ACK: CLR SCL ;先将SCL置低才改变SDA,以免误操作
NOP
NOP
CLR SDA ;发低电平应答
NOP
NOP
SETB SCL
NOP
NOP
RET

;写一个字节
;R2为要写的数据,R3为每字节的位数,这儿为8位
;返回时C为应答信号,可以不理会这个值
WRITE: MOV R3,#8
MOV A,R2
WRLOOP: CLR SCL
RLC A
NOP
MOV SDA,C
NOP
NOP
SETB SCL
NOP
NOP
DJNZ R3,WRLOOP
CLR SCL ;以下处理AT24C02的应答信号
NOP
NOP
SETB SDA ;置高SDA,用作输入,如果AT24C02拉低,表示正确
NOP
NOP
SETB SCL
NOP
NOP
MOV C,SDA ;读取应答信号
RET

;读一个字节
;返回时R2为读得的数
READ: MOV R3,#8
RDLOOP: CLR SCL
NOP
NOP
SETB SDA ;拉高SDA,用作输入
NOP
NOP
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
DJNZ R3,RDLOOP
MOV R2,A
RET

;延时,用以保证写操作完成,写地址信号不用延时
DELAY: MOV 0X31,#20
AA: MOV 0X32,#200
DJNZ 0X32,$
DJNZ 0X31,AA
RET

MAIN: ACALL START ;启动
MOV R2,#0XA0 ;将控制字“1010 0000”传到R2,最后一位表示写
ACALL WRITE ;调用写函数
MOV R2,#0X00 ;设置要写的地址
ACALL WRITE
MOV R2,#0X66 ;写入第一个字节,66H,写入到00单元
ACALL WRITE
MOV R2,#0X88 ;写入第一个字节,88H,写入到01单元
ACALL WRITE
ACALL STOP ;停止操作
ACALL DELAY ;等待写完成

ACALL START ;启动
MOV R2,#0XA0 ;写控制字
ACALL WRITE
MOV R2,#00 ;设置要读地址
ACALL WRITE

ACALL START
MOV R2,#0XA1 ;将控制字“1010 0001”传到R2,最后一位表示读
ACALL WRITE ;写入控制字
ACALL READ ;调用读命令
ACALL ACK ;应答
MOV 0X40,R2 ;将读得的数据传到40H
ACALL READ ;读下一位,将读得的数据传到41H
ACALL ACK
MOV 0X41,R2
ACALL STOP ;停止读操作

ACALL START
MOV R2,#0XA0 ;写控制字,表示以下这写操作
ACALL WRITE
MOV R2,#0X02 ;设置地址
ACALL WRITE
MOV R2,0X40 ;将上面读得的数写入到02单元
ACALL WRITE
MOV R2,0X41 ;将上面读得的数写入到03单元
ACALL WRITE
ACALL STOP ;停止操作
ACALL DELAY ;等待写完成

ACALL START ;启动
MOV R2,#0XA0 ;写入控制字,表示以下为写操作
ACALL WRITE
MOV R2,#00 ;写入读的起始地址
ACALL WRITE

ACALL START ;启动
MOV R2,#0XA1 ;写入控制字,表示以下为读操作
ACALL WRITE
ACALL READ
ACALL ACK
MOV 0X40,R2 ;以下连续读出四个字节
ACALL READ
ACALL ACK
MOV 0X41,R2
ACALL READ
ACALL ACK
MOV 0X42,R2
ACALL READ
ACALL ACK
MOV 0X43,R2
ACALL STOP

MOV A,0X42 ;以下为比较读出结果与写入是否相等
CJNE A,#0X66,ENDALL
MOV A,0X43
CJNE A,#0X88,ENDALL
CLR LED
ENDALL: SJMP $
END

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客