X25043/45 EEPROM及其与51系列微处理器的接口方法
2009-02-25
作者:周迎春 杨学泉
摘 要: X25043/45 E2PROM芯片的特点及主要功能,描述了其引脚定义、工作原理、操作指令、存储阵列读时序和写时序。介绍它与51系列微处理器的几种接口方法,并给出应用电路和相应程序。
关键词: 可编程 写使能 51系列微处理器 接口方法
随着测量技术的发展和微处理器的广泛应用,系统的电路越来越复杂,系统的可靠性问题也越来越突出,因此看门狗、工作电压监控和存储器差不多在每一系统中都被采用。Xicor 公司提供的X25043/45 E2PROM芯片,把看门狗定时器、工作电压监控和E2PROM三种功能组合在一个封装内,并采用三线总线工作的串行外设接口(SPI)和软件协议,降低了系统成本,提高了系统的工作可靠性,非常适合于需现场修改数据的场合,可广泛应用于仪器仪表、工业自动控制等领域。但在应用中,对存储阵列的读写、看门狗定时器的设置则需通过芯片要求的指令来完成。
1 X25043/45的主要特点和引脚定义
X25043/45的主要特点如下:
⑴可编程的看门狗定时器,通过指令可选择看门狗定时时间;⑵工作电压监测,并产生复位信号;⑶读写时钟速率可达1MHz;⑷518×8位串行E2PROM;⑸数据块锁定功能和片内偶然性的写保护功能,保护存储数据;⑹CMOS器件,低功耗;⑺擦写次数最少10万次,最少100年的数据保存期。
X25043/45的引脚排列如图1所示,引脚功能说明见表1。
2 工作原理及操作指令
X25043/45内含一个8位指令寄存器,传送指令、数据和地址时按8位串行数据格式进行,且均以最高有效位在先的方式传送。其指令见表2。SI线上输入的数据在SCK上升沿被锁存,芯片内的数据在SCK下降沿输出至SO线上。时钟SCK允许操作过程中停止并在其后恢复。
在读存储阵列时,将拉至低电平,发送SCK时钟脉冲,通过SI线发送含最高位地址A8的READ指令,然后发送8位地址,选定的存储单元中的数据被送到SO线上。每个数据被送出后,芯片内的地址计数器自动加1,指向下一存储单元;若继续提供SCK脉冲,可读出下一存储单元数据。当地址计数器达到$1FFH时,自动翻转至$000H单元,直至为高电平,终止读操作。SO线不输出数据时,呈高阻状态。其时序如图2所示。读状态寄存器时,片选后发送RDSR指令,状态寄存器的内容在发送RDSR指令的第8个SCK脉冲的下降沿被送出到SO线上。
在写操作之前,必须置位“写使能”。在字节、页或状态寄存器写周期完成后和上电情况下,“写使能”自动复位,为低电平,“写使能”可被复位。“写使能”复位时,不能对芯片进行写操作。因此必须置为高电平,将片选置低电平,向芯片发出WREN指令,接着再将片选置位,以置位“写使能”。若不将置位而继续进行写操作,则写操作无效。最少一个SCK周期后,重新将置低电平以进行写操作。写存储阵列时,发送含最高位地址位A8的WRITE指令后,送8位地址,再送数据写入芯片。在一直为低电平的情况下,可以连续送写同一页地址的4个字节数据。超过4个字节数据,芯片将自动从本页的第一个地址重新写入,因此必须在第24、32、40、48个SCK周期后,置位;写状态字时,发送WRSR后送更新的状态寄存器内容。
X25043/45可提供电源监控和编程看门狗定时器,给系统提供复位信号。通过编程选择定时值,如果在设置的时间内没有访问X25043/45,即为低电平,则X25043/45将产生复位信号输出。芯片通过其供电电源Vcc来实现电源监控。当Vcc低于规定值时,产生复位信号输出,对于5V工作芯片,其值为4.25~4.5V。当Vcc低于4.25~4.5V时,上电后自动产生复位信号,信号宽度最小可达100ms。
发送WREN、WRDI和RDSR指令时,不必发送地址或数据。RDSR、WRSR指令分别用于读、写X25043/45内的状态寄存器。状态寄存器的格式如下:
WD1、WD0是看门狗定时位,为非易失性位,其组合表征的时间见表3。
BL1、BL0是存储器块保护位,为非易失性位,其组合表征的保护存储器阵列范围见表4。选定保护的块,用户只能读而不能写。
WEL是“写使能”锁存器状态位,只读位。为1,“写使能”置位;为0,“写使能”复位。
WIP是表征芯片写操作忙位,只读位。为1,写操作正在进行;为0,无写操作。
3 X25043/45与51系列微处理器接口
由于51系列微处理器无SPI接口,因此必须通过移位方式来实现通讯。X25045与51系列微处理器接口时,一般不能通过CPU的P2口进行片选,只有在P2口为位控方式工作时才允许。51系列CPU的P2口工作于地址总线方式时,其输出是脉冲形式,地址送出后,呈高电平。因此在对X25045操作时,不能保证片选持续有效,也就不能对其进行任何操作。为此片选只能是位控方式连接,一般与CPU的P1或P3口相连接。
图3是一款典型接口电路。R1是复位输出的上拉电阻,上拉电阻是必需的。微处理器U1为89C52,U2为X25045,提供高电平复位信号。从图3中可以看出,X25045必须用4根线与CPU接口。
在系统接口复杂时,典型接口方式将浪费宝贵的CPU口资源;进行口扩展时,既增加成本,又减低了可靠性,不能体现X25045的优点。在系统设计时,设计人员往往都力求最精简最可靠的最小系统方案,而较复杂的系统几乎用满所有CPU口线。
图4和图5两款电路相对图3有一定改进,经济实用,均能可靠地运行。图4所示电路是一种总线接口方式。但对X25045操作时,P2口不能选择其它任何器件。若总线其它器件均以低电平选择有效时,必须先将P2口置高电平,即:MOV P2,#0FH。这款电路在对X25043/45操作时,系统的中断操作中不能有数据输入输出操作。若有数据输入输出操作,必须先关中断,否则将出现逻辑混乱,甚至烧毁CPU和X25043/45。在访问X25043/45的优先级低于中断操作的最高级时,也就是说,在访问X25045时系统还必须响应中断。如有URT串口工作时,则不能使用该款电路。
对于图5电路,虽然只减少了一根口线,但巧妙地利用X25043/45的读操作是在SCK的上升沿、写操作是在SCK的下降沿、而SO线在无输出时呈高阻状态这一特性,将SO线和SI线短接,把四线接口改为三线接口。笔者多次将图5的接口方法应用于仪器开发中,将X25043/45用于口令、校准参数等的存储,均取得满意的效果,系统结构简单,并且一直稳定工作。由于它带有电源监控、上电复位和看门狗电路,所以在实际应用中,可大大减少系统的设计,提高工作可靠性。
以上三款电路的编程方法基本相同。对于图5所示的电路,在对X25045操作前,先要禁止所有中断,将P2口全部置高电平,才能读写X25045。三款电路读写X25045时,程序唯一的差别是在定义赋值CS、SI、SCK、SO上。对于图5,将SI、SO的定义赋值相同。据图5接口方式编有如下范例程序,该程序提供了所有X25045的命令。
源程序:
CS BIT P1.0 ;P1.0作片选
SI BIT P1.2 ;P1.2作串行输入
SO BIT P1.2 ;P1.2作串行输出
SCK BIT P1.3 ;P1.3作串行时钟
WREN_INST EQU 06H ;写锁存指令
WRDI_INST EQU 04H ;读锁存指令
WRSR_INST EQU 01H ;写状态寄存器指令
RDSR_INST EQU 05H ;读状态寄存器指令
WRITE_INST EQU 02H ;写存储阵列指令
READ_INST EQU 03H ;读存储阵列指令
BYTE_ADDR EQU 55H ;字节操作方式存储器地址
BYTE_DATA EQU 0EAH ;写操作数据
PAGE_ADDR EQU 1F0H ;页操作方式存储器地址
PAGE_DATA1 EQU 99H ;写入页的第一个数据字节
PAGE_DATA2 EQU 0AAH ;写入页的第二个数据字节
PAGE_DATA3 EQU 0CCH ;写入页的第三个数据字节
STATUS_REG EQU 10H ;状态寄存器
MAX_POLL EQU 99H ;写忙(WIP)查询最大循环数
STACK_TOP EQU 060H ;堆栈指针
初始化子程序:
INSTALL: MOV SP,#STACK_TOP
CLR EA
CLR A
SETB CS
CLR SI
SETB SO
CLR SCK
RET
复位看门狗子程序:
RES_DOG: CLR CS
SETB CS
RET
写操作忙标志查询子程序:
WIP_POLL: MOV R1,#MAX_POLL
WIP_POLL1: LCALL RS_C
JNB ACC.0,WIP_POLL2
DJNZ R1,WIP_POLL1
WIP_POLL2: RET
复位“写使能”子程序:
WD_C: CLR SCK
CLR CS
MOV A,#WRDI_INST
LCALL OUTBYT
CLR SCK
SETB CS
RET
置位“写使能”子程序:
WE_C: CLR SCK
CLR CS
MOV A,#WREN_INST
LCALL OUTBYT
CLR SCK
SETB CS
RET
写状态寄存器子程序:
WS_C: CLR SCK
CLR CS
MOV A,#WRSR_INST
LCALL OUTBYT
MOV A,#STATUS_REG
LCALL OUTBYT
CLR SCK
SETB CS
LCALL WIP_POLL
RET
读状态寄存器子程序:
RS_C: CLR SCK
CLR CS
MOV A,#RDSR_INST
LCALL OUTBYT
LCALL INBYT
CLR SCK
SETB CS
RET
单字节数据写入子程序:
BYTE_W: MOV DPTR,#BYTE_ADDR
CLR SCK
CLR CS
MOV A,#WRITE_INST
MOV B,DPH
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT
MOV A,DPL
LCALL OUTBYT
MOV A,#BYTE_DATA
LCALL OUTBYT
CLR SCK
SETB CS
LCALL WIP_POLL
RET
单字节数据读出子程序:
BYTE_R: MOV DPTR,#BYTE_ADDR
CLR SCK
CLR CS
MOV A,#READ_INST
MOV B,DPH
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT
MOV A,DPL
LCALL OUTBYT
LCALL INBYT
MOV R6,A
CLR SCK
SETB CS
RET
连续3字节数据写入子程序:
PAGE_W: MOV DPTR,#PAGE_ADDR
CLR SCK
CLR CS
MOV A,#WRITE_INST
MOV B,DPH
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT
MOV A,DPL
LCALL OUTBYT
MOV A,#PAGE_DATA1
LCALL OUTBYT
MOV A,#PAGE_DATA2
LCALL OUTBYT
MOV A,#PAGE_DATA3
LCALL OUTBYT
CLR SCK
SETB CS
LCALL WIP_POLL
RET
连续2字节读取子程序:
SEQU_R: MOV DPTR,#PAGE_ADDR
CLR SCK
CLR CS
MOV A,#READ_INST
MOV B,DPH
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT
MOV A,DPL
LCALL OUTBYT
LCALL INBYT
MOV R2,A
LCALL INBYT
MOV R3,A
LCALL INBYT
MOV R4,A
CLR SCK
SETB CS
RET
字节读出子程序:
OUTBYT: MOV R0,#08
OUTBYT1:CLR SCK
RLC A
MOV SI,C
SETB SCK
DJNZ R0,OUTBYT1
CLR SI
RET
字节写入子程序:
INBYT: MOV R0,#08
INBYT1: SETB SCK
CLR SCK
MOV C,SO
RLC A
DJNZ R0,INBYT1
RET
参考文献
1 Xicor非易失性器件使用手册.武汉力源,1999