摘要:AT93C46/56/66是Atmel公司生产的低功耗、低电压、电可擦除、可编程只读存储器,采用CMOS工艺技术制造并带有3线串行接口,其容量分别为1kB/4kB,可重复写100万次,数据可保存100年以上。文中介绍了该存储器的引脚功能和指令时序,给出了AT93C46/56/66和单片机的接口应用电路和软件程序。 关键词:EEPROM 存储器 接口应用 程序 AT93C46/56/66 16位单片机以其适于高速控制场合及功能多等优点已在工业控制领域中占领了一定的市场。由于EEPROM能在不脱离系统的情况下修改其存储单元中的内容,故在16位单片机中的应用愈来愈广泛。本文结合16位机的特点,详细介绍AT93系列EEPROM及其使用方法。 AT93C46/56/66是ATMEL公司推出的低功耗、低电压电可擦除的可编程只读存储器。它采用CMOS技术和Fairchild Semiconductor 公司的Mi-croWire工业标准3线串行接口,具有1kB/2kB/4kB的容量,并可通过ORG管脚配置成128×8/256×8/512×8或64×16/128×16/256×16等结构。该系列存储器可靠性高,能够重复写100万次,数据可以保存100年不丢失;采用8脚PDIP/SOIC封装和14脚SOI封装(SOI封装为JEDEC和EIAJ标准),与并行的EEPROM相比,AT93C46/56/66可大大节省印制板空间,且接线简单,因而在多功能的精密测试仪中具有广阔的前途。 AT93C46/56/66存储器芯片的引脚排列如图1所示。各引脚的功能如下: CS:片选信号。高电平有效,低电平时进入等待模式。在连续的指令之间,CS信号必须持续至少250ns的低电平,才能保证芯片正常工作。 CLK:串行时钟信号。在CLK的上升沿,操作码、地址和数据位进入器件或从器件输出。在发送序列时,CLK最好不停止,以防止读/写数据的错误。 DI:串行数据输入。可在CLK的同步下输入开始位、操作码、地址位和数据位。 DO:串行数据输出。在CLK同步下读周期时,用于输出数据;而在地址擦/写周期或芯片擦/写周期时,该端用于提供忙/闲信息。 VSS:接地。 VCC:接+5V电源。 ORG:存贮器构造配置端。该端接VCC或悬空时,输出为16位;接GND时,输出为8位。 NC:空脚,不连接。
表中,93C46 n=6;93C56n=7; 93C66n=8 2 指令及时序 AT93C46/56/66的指令如表1所列,各指令的具体含义如下: (1)擦/写允许指令(EWEN) 由于在上电复位后?AT93C46/56/66首先将处于擦/写不允许状态。故该指令必须在所有编程模式前执行,一旦该指令执行后,只要外部没有断电就可以对芯片进行编程。 (2)地址擦指令(ERASE) 该指令用于强迫指定地址中所有数据位都为“1”。一旦信息在DI端上被译码,就需使CS信号保持至少250ns的低电平,然后将CS置为高电平,这时,DO端就会指示“忙”标志。DO为“0”,表示编程正在进行;DO为“1”,表示该指定地址的寄存器单元已擦完,可以执行下一条指令。 (3)地址写指令(WRITE) 写指令时,先写地址,然后将16位的?或8位?数据写入到指定地址中。当DI端输出最后一个数据位后,在CLK时钟的下一个上升沿以前,CS必须为低,且需至少保持250ns,然后将CS置为高电平。需要说明的是:写周期时,每写一个字节需耗时4ms。 (4)地址读指令(READ) 读指令用于从指定的单元中把数据从高位到低位输出至DO端,但逻辑“0”位先于数据位输出。读指令在CLK的上升沿触发,且需经过一段时间方可稳定。为防止出错,建议在读指令结束后,再输出2~3个CLK脉冲。 (5)芯片擦指令(ERAL) 该指令可将整个存贮器阵列置为1,其它功能与地址擦指令相同。 (6)芯片写指令?WRAL? 该指令可将命令中指定的数据写入整个存贮器阵列,其它功能与地址写指令相同。该指令周期所花费时间的最大值为30ms。 (7)擦/写禁止指令(EWDS) 使用该指令可对写入的数据进行保护,操作步骤与擦/写允许指令相同。 3.1 AT93C56与80C196KB的连接 串行EEPROM芯片AT93C56同80C196单片机接口的硬件电路连接方法如图2所示。图中,由于MCS-96系列16位单片机的P1口为准双向口,因此,为了防止数据错位,在向其P1口写数据时,必须先将P1口置“1”。 3.2 软件编程 该读/写程序采用PL/M语言编写,由于PL/M语言介于高级语言与汇编语言之间,故其对数据、地址位的处理比较繁琐。其中ADDR为指定的地址单元,DATA为写入的数据,在写数据、地址时均从高位开始。本程序已在仿真器上调试通过。且已被应用于电量测试仪中(如接触电阻测试仪)。 DECLARE SETCS LITERALLY ‘CALL BITSET?. IO-PORT2,0?′; DECLARE CLRCS LITERALLY ‘CALL BITCLR?. IOPORT2,0?′; DECLARE SETCLK LITERALLY ‘CALL BITSET?. IOPORT2,5?′; DECLARE CLRCLK LITERALLY ‘CALL BITCLR?. IOPORT2,5?′; DECLARE SETDI LITERALLY ‘CALL BITSET?. IO-PORT1,5?′; DECLARE CLRDI LITERALLY ‘CALL BITCLR?. IOPORT1,5?′; EWEN:PROCEDURE PUBLIC; DECLARE I BYTE; CLRCS; CLRDI; CLRCLK; SETCS; SETDI; SETCLK; DO I=1 TO 2; CLRCLK; CLRDI; SETCLK; END; DO I=1 TO 2; CLRCLK; SETDI; SETCLK; END; DO I = 0 TO 6; CLRCLK; SETDI; SETCLK; END; CLRCLK; CLRCS; SETCS; SETCLK; CLRCLK; END EWEN; READ:PROCEDURE(ADDR) PUBLIC; DECLARE (ADDR,I,COUNT) BYTE; CLRCS; CLRDI; CLRCLK; SETCS; DO I= 1 TO 2; CLRCLK; SETDI; SETCLK; END; DO I =1 TO 2; CLRCLK; CLRDI; SETCLK; DO COUNT=1 TO 7; BITOUT(COUNT)=SHR(BITOUT(COUNT),1); END; CLRCS; CLRDI; CLRCLK; CALL TIME(100); SETCS; CLRC; END READ; WRITE: PROCEDURE(ADDR,DATA) PUBLIC; DECLARE (ADDR,DATA) BYTE; CLRCS; CLRDI; CLRCLK; SETCS; SETDI; SETCLK; CLRDI; CLRCLK; SETCLK; SETDI; CLRCLK; SETCLK; END; DO I =-1 TO 8; X=ROL(ADDR,1); ADDR=X; CLRCLK; IF ((X AND 01H)=01H)THEN SETDI; ELSE CLRDI; SETCLK; END; DO I =1 TO 7; CLRCLK; SETCLK; END; DO I =1 TO 8? CALL BITSET(.IOPORT1,7); COUNT=COUNT-1; CLRCLK; SETCLK; BITOUT(COUNT)=IOPORT1; END; CLRCLK; SETCLK; J=0; AA: DO I= 1 TO 8; J=J+1; X=ROL(ADDR,1; ADDR=X; CLRCLK; IF((X AND 01H)=01H) THEN SETDI ELSE CLRDI; SETCLK; END; IF J<>16 THEN DO; ADDR =DATA; GOTO AA; END; CLRCS;SETCS; CALL TIME(100);? END; |