51单片机控制24C02串行E2PROM的读写
高电平,进入下一个传送周期。
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)等特点。
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,
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
RER
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 ;送停止信号
RE
SUBR: MOV R0,#08H ;接受单字节子程序
LOOP2: SETB P1.1
- 关于RTX51 TINY的分析与探讨(05-30)
- 浅析8051模块化编程技巧(05-28)
- 基于DSP和单片机通信的液晶显示设计方案(07-20)
- 锁相环控制及初始化简析(08-27)
- 基于MSP430自动胀管控制器的研究(09-07)
- 嵌入式C实现延时程序的不同变量的区别(03-01)