at45db041中文资料
AT45DB041是ATMEL公司的新型FLASH芯片。该芯片具有容量大、读写速度快、外围电路少等诸多优点,更为重要的是该芯片可最低工作在2.5V,工作电流仅为4mA,因此在移动通信、便携等场合得到了广泛的应用。
芯片工作原理与硬件连接
AT45DB041中的数据按页存放,主存***2048页,每页 264字节,所以总容量为528K字节(约4M比特)。存放在主存中的数据掉电不丢失。除了主存以外,AT45DB041还有两个容量为264字节的数据缓存。缓存可以用作主存与外部进行数据交换时的缓冲区域,也可以暂存一些临时数据。缓存读写方便迅速,但掉电数据会丢失。AT45DB041数据读写采用串行方式,读写速度快,从页到缓存的传输时间为80 s左右,并且兼容CMOS和TTL输入和输出。
AT45DB041通过片选管脚/CS使能,通过串行输出(SO)和串行输入(SI)进行数据读和写。由串行时钟(SCK)对读写进行控制。
设备运行受微处理器的指令控制。一条有效的指令起始于/CS管脚的下降沿,并跟随相应的8位操作码和指定的缓存或主存地址码。当/CS管脚为低时,轮换时钟管脚(SCK)控制操作码和指定的缓存或主存地址码通过SI口的载入。所有的指令、地址和数据都从高字节开始传送。
数据读取
读缓存:通过不同的操作码可选择读取两个缓存中的其中一个(操作码54H用作读缓存1,而操作码56H用作读缓存2)。为了实现读缓存的操作,在8位操作码后必须跟有15位任意码,9位地址码和8位任意码。其中9位地址码(BFA8-BFA0)被用作指定要读取的首字节。在轮换时钟SCK的控制下,从SI载入操作码、地址码、任意码。当载入结束后,在SCK轮换时钟的控制下,缓存中的数据就可以从SO读出。当读到缓存的末尾时,设备将继续从缓存的开端重读。在这整个过程中/CS必须保持低电平。读缓存结束后,/CS上一个从低到高的电平跳变将终止读操作。
主存页到缓存的传送:一页数据可以从主存传至缓存1或2。8位操作码(53H用于缓存1,55H用于缓存2)后跟有4位保留位,11位用于指定目的页的地址位(PA10-PA0),和9位任意码,在轮换时钟SCK的控制下从SI载入。在这一过程中/CS管脚必须保持低电位。当载入结束后,在/CS上检测到一个由低到高的电平跳变后,主存页中的数据开始传送至缓存。在数据传送的过程中,状态寄存器将指示状态忙。
数据写入
写缓存:在SCK的控制下,8位的操作码(84H用于缓存1,87H用于缓存2)后面跟着15位任意码和9位地址码(BFA8-BFA0)由SI载入,其中9位地址码指定了缓存中被写的首字节,数据紧随着地址码输入。/CS上一个由低到高的跳变,将结束写缓存操作。
带有内置擦除的缓存至主存页的传送:8位的操作码(83H用于缓存 1,86H用于缓存2)后跟有4位保留位,11位指定要写入的主存页的地址码(PA10-PA0),和9位任意码,在轮换时钟SCK的控制下从SI载入。当/CS上检测到一个由低到高的跳变时,器件将首先擦除被选中的主存页,然后将储存在缓存中的数据写入该页。擦除和写入的过程都是自动进行的,这一进程不超过20ms。在这个时间里,状态寄存器将指示状态忙。状态寄存器值读取:读状态寄存器的值可以用来确定设备的忙闲状态。忙闲状态通过寄存器的第7位指示。如果第7位为1,则设备位于空闲状态并可接收下一条指令。如果为0,则设备忙。在载入8位操作码57H后,从SO上可以读出1字节的状态寄存器的值。
写保护(/WP) B041具有的写保护功能仅对主存的前256页有效。当/WP管脚为低电平时,FLASH禁止对主存的前256页进行写操作(只读),但主存的其它页并不受影响,仍然可以进行读写。AT45DB041的选择性写保护功能为用户的使用提供了很大的便利,用户可以将非常重要的数据,如系统参数、密码和身份信息等存入主存的前256页,并将/WP置低,使这些数据处于写保护状态,以保证这些数据不会被误擦除。而与此同时,用户仍能对其它地址进行读写。如果用户将 /WP管脚悬空或接地,FLASH将不具备写保护功能,所有的主存页都可进行读写。
复位(/RESET) B041采用低电平复位,即当/RESET管脚出现低电平(<0.6V)时,芯片停止工作,待/RESET管脚的电平被拉高(>2.0V) 后,恢复正常工作。为了避免接通电源时,由于电压不稳可能会对芯片正常工作造成影响,所以在使用时,最好在系统开机后延时10ms,再对FLASH进行操作。
与微处理器的接口
B041外围电路非常简单,可以很方便地与微控制器连接。SO、SI、SCK、/CS,/WP分别与微处理器的通用I/O相连即可。
软件设计
下面主要对AT45DB041的数据读写作简要介绍。
AT45DB041进行数据读写主要包括操作码、保留位、地址码、任意码、用户数据的载入和用户数据和状态字的读出两部分。
数据载入子程序
要载入的数据(操作码、保留位、地址码、任意码和用户数据)寄存从R0开始的地址单元里
;数据个数放在R6中 DADAIN:PUSH ACC
CLR CS ;使能R0
TRSMIT:MOV A,@R0
MOV R7,#08H 1字节=8比特
LOOPT: RLC A ;将要发送的数据由高位到低位依次移出
CLR SCK
MOV SI, 将1比特的数据送入SI
NOP
SETB SCK ;在SCK的上升沿AT45DBO41从SI上取数
DJNZ R7,LOOPT ;一字节的数据发送完毕
INC R0
DJNZ R6,TRSMIT
SETB CS ;所有数据发送完毕
POP ACC
RET
数据读取子程序:
;将取出的数据(用户数据和状态字)寄存从R1开始的地址单元里
;数据个数放在R6中
DATAOUT:PUSH ACC
CLR, A
CLR C
CLR CS ;使能
RECEIVE:CLR SCK
MOV R7,#08H
LOOPR: SETB SCK 在SCK的上升沿AT45DB041将数据放在S0上
MOV C,SO ;将1比特的数据取出
NOP
SETB SCK
RLC A
DJNZ R7,LOOPR ;一字节的数据接收完毕
MOV @R1,A
INC R1
DJNZ R6,RECEIVE
SETB CSp ;所有数据接收完毕
POP ACC
RET