赞助论坛
  • 5438阅读
  • 0回复

学习单片机之---I2C总线及AT24C系列串行E2PROM [复制链接]

楼层直达
jswr  
发帖
339
精华
1
金币
264
威望
8
贡献
7
好评
15
注册
2008-06-30
楼主    jswr 发表于: 2008-08-20 17:22:26 
I2C总线及AT24C系列串行E2PROM

摘要:在单片机系统中广泛使用E2PROM作为数据存储器。本文简要介绍了I2C总线及AT24C系列串行E2PROM,给出了8031单片机与串行E2PROM通讯的硬软件实现方法和实用的读/写子程序。
  关键词:单片机;I2C总线; E2PROM  


1 I2C总线简介

  I2C总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。在
I2C总线上传送的一个数据字节由八位组成。总线对每次传送的字节数没有限制,但每个字节后必须跟一位应答位。数据传送首先传送最高位(MSB),数据传送按图1所示格式进行。首先由主机发出启动信号“S”(SDA在SCL高电平期间由高电平跳变为低电平),然后由主机发送一个字节的数据。启动信号后的第一个字节数据具有特殊含义:高七位是从机的地址,第八位是传送方向位,0表示主机发送数据(写),1表示主机接收数据(读)。被寻址到的从机设备按传送方向位设置为对应工作方式。标准I2C总线的设备都有一个七位地址,所有连接在I2C总线上的设备都接收启动信号后的第一个字节,并将接收到的地址与自己的地址进行比较,如果地址相符则为主机要寻访的从机,应在第九位答时钟脉冲时向SDA线送出低电平作为应答。除了第一字节是通用呼叫地址或十位从机地址之外(详细内容见[1]),第二字节开始即数据字节。数据传送完毕,由主机发出停止信号“P”(SDA在SCL高电平期间由低电平跳变为高电平)。





图1 I2C总线上数据的传送



2 AT24C系列串行E2PROM

  AT24C系列串行E2PROM具有I2C总线接口功能,功耗小,宽电源电压(根据不同型号2.5V~6.0V),工作电流约为3mA,静态电流随电源电压不同为30μA~110μA,存储容量见表1。




  (1) AT24C系列 E2PROM接口及地址选择

  由于I2C总线可挂接多个串行接口器件,在I2C总线中每个器件应有唯一的器件地址,按I2C总线规则,器件地址为7位数据(即一个I2C总线系统中理论上可挂接128个不同地址的器件),它和1位数据方向位构成一个器件寻址字节,最低位D0为方向位(读/写)。器件寻址字节中的最高4位(D7~D4)为器件型号地址,不同的I2C总线接口器件的型号地址是厂家给定的,如AT24C系列E2PROM的型号地址皆为1010,器件地址中的低3位为引脚地址A2A1A0,对应器件寻址字节中的D3、D2、D1位,在硬件设计时由连接的引脚电平给定。

  对于E2PROM的片内地址,容量小于256字节的芯片(AT24C01/02),8位片内寻址(A0~A7)即可满足要求。然而对于容量大于256字节的芯片,则8位片内寻址范围不够,如AT24C16,相应的寻址位数应为11位(211=2048)。若以256字节为1页,则多于8位的寻址视为页面寻址。在AT24C系列中对页面寻址位采取占用器件引脚地址(A2、A1、A0)的办法,如AT24C16将A2、A1、A0作为页地址。凡在系统中引脚地址用作页地址后,该引脚在电路中不得使用,作悬空处理。AT24C系列串行E2PROM的器件地址寻址字节如表1所示,表中P0P1P2表示页面寻址位。

  (2) AT24C系列 E2PROM读写操作

  对AT24C系列 E2PROM的读写操作完全遵守I2C总线的主收从发和主发从收的规则。

  连续写操作 连续写操作是对E2PROM连续装载n个字节数据的写入操作,n随型号不同而不同,一次可装载字节数见表1。SDA线上连续写操作数据状态如图2。




器件地址(写) 片内地址    ≤ n个字节数据


图2  SDA线连续写操作数据状态



  AT24C系列片内地址在接收到每一个数据字节地址后自动加1,故装载一页以内规定数据字节时,只须输入首地址,若装载字节多于规定的最多字节数,数据地址将“上卷”,前面的数据被覆盖。

  连续读操作 连续读操作时为了指定首地址,需要两个伪字节写来给定器件地址和片内地址,重复一次启动信号和器件地址(读),就可读出该地址的数据。由于伪字节写中并未执行写操作,地址没有加1。以后每读取一个字节,地址自动加1。
在读操作中接收器接收到最后一个数据字节后不返回肯定应答(保持SDA高电平)随后发停止信号。连续读操作SDA上数据状态如图3。




器件寻址(写) 片内地址   器件寻址(读)读出数据


图3 SDA线连续读操作数据状态



3 8031单片机与AT24C系列 E2PROM通讯的硬软件实现

  (1)硬件电路

  图4是用8031P1口模拟I2C总线与E2PROM连接电路图(以AT24C16为例),由于AT24C16是漏极开路,图中R1、R2为上拉电阻(5.1k)。A0~A2地址引脚、TEST测试脚均悬空。





图4 8031P1口与E2PROM连接电路图



  (2)软件实现

  由前述分析和图4的硬件电路,我们编制了E2PROM的读写子程序。两者的主要区别在于读子程序需发器件地址(写)和片内地址作为伪字节,之后再发一次开始信号和器件地址(读命令)。

  读写子程序如下:

;写串行E2PROM子程序EEPW

; (R3)=器件地址

; (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,C

  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

  RET

DELAY: NOP

  NOP

  RET


;读串行E2PROM子程序EEPR

;(R1)=欲读数据存放地址指针

;(R3)=器件地址

;(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 ;送停止信号

  RET

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

LOOP2: SETB  P1.1

  ACALL DELAY

  MOV C,P1.0

  RLC A

  CLR P1.1

  ACALL DELAY

  DJNZ R0,LOOP2

  CJNE R7,#01H,LOW

  SETB P1.0  ;若是最后一个字节置A=1

  AJMP SETOK

LOW: CLR P1.0  ;否则置A=0

SETOK: ACALL DELAY

  SETB  P1.1

  ACALL DELAY

  CLR  P1.1

  ACALL DELAY

  SETB P1.0  ;应答毕,SDA置1

  RET

  程序中多处调用了DELAY子程序(仅两条NOP指令),这是为了满足I2C总线上数据传送速率的要求,只有当SDA数据线上的数据稳定下来之后才能进行读写(即SCL线发出正脉冲)。另外,在读最后一数据字节时,置应答信号为“1”,表示读操作即将完成。


小结

  在测量仪器中使用E2PROM保存数据,这是仪器具有校准、标定功能的基本条件。8031单片机与串行E2PROM的结合满足了这一要求,这种方法电路简单、编程方便。E2PROM读写数据安全可靠保证了在测量过程中数据稳定。我们在研制数种测量仪器中均使用此法,效果很好。