微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机控制24C02串行E2PROM的读写

51单片机控制24C02串行E2PROM的读写

时间:03-21 来源:互联网 点击:

高电平,进入下一个传送周期。

  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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top