(1)芯片介绍
AT45DB161D是串行接口的闪存芯片,可工作在2.5V~2.7V,可广泛应用于数据语音、图像、程序代码数据存储中。AT45DB161D支持RapidS串行接口,适用于高速场合。RapidS串行接口是与SPI相兼容的,速度可达到66MHz。它包含有17,301,504个位,被组织为4096个页,每个页512或528个字节。除了主存储器,AT45DB161D还包括两个SRAM数据缓冲区,每个缓冲区512/528个字节。在主存储器正在编程时,缓冲区是允许接收数据的,并且支持数据流式写入。与并行FLASH储存器不同,它采用RapidS串行接口,从而大大减少了可用引脚数量,同时也提高了系统可靠性,降低了开关噪声,缩小了封装体积。可以应用于商业、工业等需要高密度、低引脚数、低电压与低功耗的应用场合。
AT45DB161D允许简单的在系统重新编程,而无需输入高编程电压。芯片可以采用2.5V~3.6V或2.7V~3.6V单 电源供电,进行编程与读取操作。它可以通过#CS来进行使能,并通过三线接口(SI、SO、SCK)进行数据 通信。
(2)引脚配置与封装
1.芯片封装图
2.引脚功能详述
符号
|
|
|
|
| 片选:#CS用以选中芯片。当#CS被设置为无效状态时,芯片则不被选中,并且处于闲置状态(不是深度睡眠状态),输出引脚SO处于高阻态。当芯片未被选中时,从输入引脚SI输入的数据将不被接受。
#CS引脚上的下降沿将会启动一个操作,而上跳沿则会结束一个操作。在一个内部操作如芯片内部的编程或擦除周期内,芯片不会进入闲置状态,直到操作完毕。
|
|
|
| 串行时钟:此引脚用来向芯片提供时钟信号,有来控制数据流的出入。SI引脚上的命令、地址与输入数据在时钟SCK的上升沿被写入,而SO引脚上的输出数据则在时钟的下降沿变化。
|
|
|
| 串行输入:SI引脚用来向芯片以移位方式写入数据。SI引脚上的所有数据输入包括命令与地址。SI上的数据在时钟的上升沿写入芯片。
|
|
|
| 串行输出:SO引脚用来从芯片以移位方式输出数据。SI上的数据在时钟的下降沿变化。
|
|
|
| 写保护:当#WP被设置为有效时芯片的扇区将被保护起来,以防止编程与擦除对数据的破坏。但是扇区保护使能与扇区死锁命令仍然可以被芯片识别。#WP引脚在内部被拉高,可以悬空。但是仍然建议在外部接到VCC。
|
|
|
| 复位:#RESET引脚上的低电平会终止正在处理的操作并复位内部状态机到闲置状态。#RESET引脚上的低电平会使芯片一直处于复位状态。当#RESET上转为高电平后,才能进行正常的操作。
芯片内部设置上电复位电路。当此引脚不用时,外部接到高电平。
|
|
|
| 就绪/忙碌状态指示:此引脚是漏极开路的输出引脚。当芯片处于忙状态时(内部操作过程中)此引脚为低电平,此引脚在正常状态下为高电平(外部接上拉电阻)。当正在进行编程/擦除操作,比较操作与页-缓冲区传送时,被拉低。
忙状态指示FLASH储存阵列与某一个缓冲区不能***作,而对另一个缓冲区的读与写操作仍然可以进行。
|
|
|
|
|
|
|
|
|
|
|
(3)AT45DB161D的功能框图:
(4)存储器阵列:
AT45DB161D的储存器阵列被分为3个级别的粒度,分别为扇区、块与页。下面的“存储器结构图”对各个级别进行了分析,详细说明了每个扇区与块的页数。所有的编程操作都是针对于页的。擦除操作可以作用于芯片、扇区、块或页。
扇区结构:
(扇区 0A)=8页 4096 /4224 字节
| (扇区 0B)=248页 126,976/130,944字节
| (扇区 1 )=256页 131,072/135,168字节
| (扇区 2 )=256页 131,072/135,168字节
|
| (扇区 14)=256页 131,072/135,168字节
| (扇区 15)=256页 131,072/135,168字节
|
块结构:
页结构:
(5)芯片操作:
芯片的操作是通过 单片机的指令来完成的。指令列表与指令操作码在后面的“指令表”中有详细的说明。一个有效的指令由#CS的下降沿来指示它的开始,随后是一个有意义的8位操作码与缓存区或主存储器的地址。当#CS为低时,由时钟SCK引脚来控制由SI引脚写入的操作码与缓存区或主存储器的地址。所有的指令、地址与数据在传输时都是高位在前的。
528字节模式下,缓冲区中数据的地址由BFA9~BFA0来表示。主存储器中数据的地址由PA11~PA0与BA9~BA0来表示,PA11~PA0用来表示12位页地址,BA9~BA0表示10位的页内字节地址。在512字节模式下,缓冲区中数据地址由BFA8~BFA0来表示。主存储器中数据的地址由A20~A0来表示,其中A20~A9是12位的页地址,A8~A0为9位的页内字节地址。
(6)读命令
使用相应的操作码,数据可以从主存储器或某一个SRAM缓冲区中读出。
1. 连续读(命令码:E8H):可以达到66MHz
在提供了主存储器阵列的开始地址后,在时钟信号的作用下连续读命令可以从芯片中以数据流方式进行数据读取,而无需额外的地址信息或控制信号。芯片内部的地址计数器会在每一个时钟周期后自动自增,因而可以在不用写入新的地址的情况下继续读取下一个字节。要进行一次对页(528字节)的连续读操作,操作码E8H必须要写入芯片中,随后是3个字节的地址(22位的页与字节地址序列)与4个无关字节。开始的12位(PA11~PA0)来用表示将要读取的数据在主存储器中的页地址。后10位(BA9~BA0)用来表示字节在页中的地址。而要进行一次对页(512字节)的连续读时,操作码E8H同样也要先写入到芯片中,随后是三个字节的地址与4个无关字节。21位序列中前12位(A20~A9)表示要读的数据在主存储器的页地址,后9位(A8~A0)是页内的字节地址。那些无关字节在读操作初始化时是必需的。在无关字节后,SCK引脚上的时钟信号使数据从SO引脚输出。
在操作写入地址字节、无关字节与数据读取的过程中,#CS引脚上要保持低电平。连续读到达一个页的结尾时,芯片会从下个页的开头继续读取,页间的跨越是没有延时的。当主存储器的最后一个位被读出后,芯片会自动返回到第一页的开头继续读取。与页间跨越相同的,从存储器阵列结尾转到开头也是无延时的。
2. 连续读(命令码:0BH 高速模式):可以达到66MHz
此命令可以在最高频率以下的任意时钟频率下通过串行接口对主存储器进行高速读取。要进行一次连续读(页容量为528字节),#CS必须处于有效状态,然后操作码0BH必须写入到芯片中,随后是3字节地址与一个字节。22位地址序列中的前12位(PA11~PA0)表示将要读取的数据在主存储器中的页地址,后10位(BA9~BA0)表示页内的字节地址。要进行一次连续读(页容量为512字节),同样地,操作码OBH也要先写入芯片中,随后是3字节地址(A20~A0)与一个字节。在此字节后数据将在SCK引脚上的时钟信号作用下从SO引脚输出。
同1中的内容。
3. 连续读(命令码:03H 低速模式):可以达到33MHz
大部分与高速模式下的连续读是相同的。不同的在于3字节地址写入后无需再写入一个字节。
4. 主存储器页读(操作码:D2H)
主存储器页读允许直接从4096个页中某一个页中读取数据,而不影响缓冲区中的数据。其它的内容与1相同。
5. 缓存区读(操作码:缓冲区1D4H或D1H 缓冲区2 D6H或D3H)
主存储阵列中的数据可以放在SRAM数据缓存区内,使用缓存区读命令允许直接从缓冲区中读取数据。操作码的选用要根据时钟频率而定。D4H、D6H与D1H、D3H可以分别使用在频率低于66MHz与33MHz的情况下。要进行一次缓冲区读(528字节),操作码必须先写入芯片,随后是3字节地址(14个无关位与10位缓冲区地址)。要进行一次缓冲区读(512字节),操作同样也要先写入芯片,随后是3字节地址(15个无关位与9位缓冲区地址)。在地址字节后,一个无关字节必须要写入芯片以初始化读操作。在操作码、地址字节、无关字节写入的过程中,#CS引脚必须保持低电平。当到达缓冲区的结尾时,芯片会自动返回到缓冲区的开始。#CS的上跳沿将终止读操作。
(7)编程与擦除命令
1. 缓冲区写(操作码:缓冲区1 84H 缓冲区2 87H)
数据可以通过SI引脚写入缓冲区1或2中。要将数据写入缓冲区(528字节),操作码必须先写入芯片,随后是3字节地址(14位无关位与10位缓冲区地址 BFA9~BFA0)。这10位地址表示要写入的数据的第一个字节的缓冲区地址。李将数据写入缓冲区(512字节),操作码同样也要先写入芯片,随后是3字节地址(15个无关位与9位缓冲区地址 BFA8~BFA0)。这9位缓冲区地址表示要写入的每个字节的地址。在最后一个地址位写入后,就可以开始向其写入数据了。如果到达了缓冲区的结尾,则芯片会自动返回到缓冲区的开头。数据会继续写入到缓冲区中,直到#CS引脚上产生上跳沿为止。
2. 缓冲向主存储器页编程(带预擦除操作码:缓冲区1 83H 缓冲区2 86H)
被写入到缓冲中的数据可以被编程到主存储器中。先写入操作码,对于页容量为528字节的情况,随后是3字节地址(2个无关位,12位页地址 PA11~PA0 与10个无关位)。而对于容量为512字节的情况,操作码写入后,随后是3字节地址(3个无关位,12位的地址位 A20~A9 与9个无关位)。当#CS引脚的上跳沿时,芯片会先擦除主存储器中所选中的页(擦除后都为逻辑1),然后将缓冲区中的数据编程到页中。擦除与编程操作都是内部进行的,并会在一定时间内完成。在这期间,状态寄存器与RDY/#BUSY都会指示芯片处于忙状态。
3. 缓冲区向主存储器页编程(无预擦除操作码:缓冲区1 88H 缓冲区2 89H)
主存储器中已经被擦除的页可以通过此操作由缓冲区向其编程。与有预擦除的操作不同就在于它是无预擦除的。
4. 页擦除(操作码:81H)
页擦除操作可以独立对主存储阵列中某一个页进行擦除,随后可以对该页进行缓冲区向主存储器页编程(无预擦除)操作。对于页容量为528字节的情况,先要写入操作码,随后是3字节地址(2个无关位,12位页地址 PA11~P10 与10个无关位)。对于页容量512字节的情况,也要先写入操作码,随后是3字节地址(3个无关位,12位页地址 A20~A9 与9个无关位)。当#CS引脚上产生上跳沿时,芯片会擦除所选中的页(擦除后都为逻辑1)。擦除操作是内部进行的,并会在一定时间内完成。在这期间,状态寄存器与RDY/#BUSY都会指示芯片处于忙状态。
5. 块擦除(操作码:50H)
块擦除操作可以使块内的8个页一次全部擦除。这个命令可以用在有大量数据需要写入的时候,可以避免多次调用写擦除命令。在页容量为528字节时,操作码先要写入芯片,随后是3字节地址(2个无关位,9位页地址 PA11~PA3 ,13个无关位)。要进行一次块擦除操作(页容量512字节),也要先写入操作码,随后是3字节地址(3个无关位,9位页地址 A20~A12与12个无关位)。当#CS上产生上跳沿时,芯片将擦除选中的块。擦除操作是内部进行的,并会在一定时间内完成。在这期间,状态寄存器与RDY/#BUSY都会指示芯片处于忙状态。
块擦除地址如下表所示:
6. 扇区擦除(操作码:7CH)
扇区擦除命令可以独立对主存储器中的某一个扇区进行擦除。一共有16个扇区,每次扇区擦除操作只能对一个扇区进行擦除。页容量为528字节时,要对扇区0A或扇区0B进行擦除,需要先写入操作码,随后是3字节地址(2个无关位,9位页地址 PA11~PA3 与13个无关位)。要擦除扇区1~15,也要先写入操作码,随后是3字节地址(2个无关位,4位页地址PA11~PA8 与18个无关位)。页容量为512字节时,要对扇区0A或扇区0B进行擦除,先写入操作码,随后是3字节地址(3个无关位,9位页地址 A20~A12 与12个无关位)。要擦除扇区1~15,也要先写入操作码,随后是4字节地址(3个无关位,4位页地址 A20~A17 与17个无关位)。擦除操作是内部进行的,并会在一定时间内完成。在这期间,状态寄存器与RDY/#BUSY都会指示芯片处于忙状态。
7. 片擦除(操作码:C7H、94H、80H与9AH)
主存储器可以使用片擦除命令一次全部擦除。要进行一次片擦除操作,先要写入操作码,无须写入地址,交且操作过程中任何写入的数据都是无效的。操作码写入后,#CS引脚上的上跳沿可以开始擦除过程。在操作过程中,状态寄存器指示芯片处于忙状态。那些被保护或死锁的扇区不受此命令的影响,其数据不会发生改变。只有那些没有保护或死锁的扇区会被擦除。芯片在进行擦除操作的过程中#WP引脚可以设为有效,但是在内部擦除周期完成前保护不会生效。
8. 通过缓冲区对主存储器页编程(操作码:缓冲区1 82H 缓冲区2 85H)
这个命令是缓冲区写与缓冲区向主存储器页编程(带预擦除)两条命令的综合。数据先从输入引脚SI写入缓冲区1或2,再从缓冲区向指定的页编程。在页容量为528字节时,要进行一次此操作,先要写入操作码,再将数据写入到缓冲区中,然后向芯片写入3字节地址(2个无关位,12位页地址 PA11~PA0 与10位缓冲区地址 BFA9~BFA0)。在页容量为512字节时,要进行此操作,也要先将操作码写入,再将数据写入到缓冲区中,随后是3字节地址(3个无关位,12位页地址 A20~A9 与9位缓冲区地址 BFA8~BFA0)。所有的地址字节都被写入后,就可以通过输入引脚向芯片写入数据了。当#CS引脚上出现上跳沿时,芯片先会擦除主存储器所选中的页,然后将存在缓冲区中的数据编程到页中去。编程操作是在芯片内部进行的,并会在一定时间内完成。在这期间,状态寄存器与RDY/#BUSY都会指示芯片处于忙状态。
(8)扇区保护
AT45DB161D提供硬件与软件两种方法对扇区进行保护,以使其避免数据的破坏。软件的方法是通过软件命令来实现扇区保护的使能与禁止的。而硬件的方法则是通过使用#WP引脚来实现的。通过“扇区保护寄存器”对哪一个扇区保护或不保护进行选择。要知道某一个扇区是否有保护,可以查询状态寄存器。
1. 扇区保护的软件方法
1)扇区保护使能命令(操作码:3DH-2AH-7FH-A9H)
指定的扇区通过使扇区保护使能命令可使其在编程与擦除操作中得以保护。要采用方法使能扇区保护,#CS引脚必须处于有效状态,从输入引脚SI写入4字节命令序列。写入后,#CS引脚转为无效状态,此时扇区保护就被使能了。
扇区保护使能命令的时序图:
2)扇区保护禁止命令(操作码:3DH-2AH-7FH-9AH)
用软件方法来禁止扇区保护时,除了写入的操作码序列不事,其它与扇区保护使能命令是相同的。
扇区保护禁止命令的时序图:
3)软件控制保护的各个方面
软件控制保护在#WP没有或不能被单片机控制的情况下是很有用的。在这种情况下,#WP可以悬空(#WP引脚在内部拉高),扇区保护可以由以上两种命令来控制。
(9)保护的硬件控制
#WP引脚设为有效状态后,在扇区保护寄存器中设置为保护的扇区及扇区保护寄存器自身在编程与擦除操作中可以得到保护。扇区保护寄存器与设置为保护的任何一个扇区,都不能被编程或擦除。要改变扇区保护寄存器的值只能将#WP设为无效。如果#WP被接到地,扇区保护寄存器的内容不能被改变。如果#WP被设为无效或接到VCC,则其内容可以被改变。
#WP会使保护的软件控制方法无效。例如:如果扇区原先并没有被扇区保护使能命令保护,那么简单的把#WP设为有效状态就可以使能扇区保护。当#WP引脚设为有效状态而扇区保护使能命令没有执行,扇区保护不会被使能。如果在#WP引脚设为有效状态前扇区保护使能命令被执行了,那么只简单地将#WP设为无效并不能禁止扇区保护。在这种情况下,扇区保护禁止命令需要在#WP引脚无效时执行来使扇区保护禁止。在#WP引脚为有效时,扇区保护禁止命令会被忽略。
1. 扇区保护寄存器
非易挥发的(掉电不丢失)扇区保护寄存器指示哪些扇区被保护或未被保护。扇区保护寄存器包括16个字节,从第0到第15字节的不同值确定了扇区0到15是否被保护。扇区保护寄存器是可以由用户修改的,但在生新程序前必须先擦除。
扇区保护寄存器:
扇区0(0A,0B)
注:从ATMEL出厂后0~15字节默认值为00H。
1)擦除扇区保护寄存器命令(操作码:3DH-2AH-7FH-CFH)
为了修改扇区保护寄存器的值,必须先使用擦除扇区保护寄存器命令将其擦除。
要擦除扇区保护寄存器,#CS必须设置为有效,然后将4字节的操作码序列写入芯片。在操作码写入后,需要将#CS设置为无效,以初始化一个擦除操作。扇区保护寄存器的擦除需要一定的时间,此期间状态寄存器会指示芯片处于忙状态。如果在进行擦除的过程中掉电,则扇区保护寄存器的擦除得不到保证。
擦除扇区保护寄存器命令的时序图:
2)扇区保护寄存器编程命令(操作码:3DH-2AH-7FH-FCH)
在扇区保护寄存器被擦除后,就可以使用扇区保护寄存器编程命令对其进行重新编程。
要对扇区保护寄存器进行编程,必须先将#CS设为有效,从SI引脚写入4字节操作码序列。写入后,再将要写入扇区保护寄存器的内容写入。扇区保护寄存器中包括有16个字节,所以要写入16个字节。每个字节对应对寄存器中的每个单元。
16个字节被写入后,#CS引脚需要设为无效以初始化一个编程周期。编程过程需要一定的时间,在此期间状态寄存器指示芯片处于忙状态。如果在进行编程的过程中掉电,则扇区保护寄存器中的内容的修改得不到保证。
如果在#CS引脚无效以前没有写入适当数量的字节,则没有字节与其相对应的寄存器单元所对应扇区保护状态的改变不能保证。
如果扇区保护寄存器中的字节不是00H或FFH,则相应单元所对应的扇区保护状态的改变不能保证。
扇区保护寄存器编程命令利用内部SRAM数据缓冲区1来实现编程操作。缓冲区1的数据在命令执行完毕后会恢复回到原来的数据。
扇区保护寄存器编程命令的时序图:
3)扇区保护寄存器读取命令(操作码:32H)
要读取扇区保护寄存器,首先要将#CS引脚设为有效,从SI引脚写入操作码与三个字节。写入后,芯片便可以从SO引脚输出数据。第一个字节是扇区0的内容,第二个字节是扇区1的内容,最后一个字节是扇区15的内容。在最后一个字节输出后,再输出的数据就为未定义数据。最后必须要将#CS设为无效状态以终止扇区保护寄存器读取操作,并使输出转为高阻态。
扇区保护寄存器的时序图:
4)扇区保护寄存器的各个方面
扇区保护寄存器约可以擦/写10000次。使用者会很关心芯片在其应用系统中的使用寿命。如果应用系统中需要多于10000次对扇区保护寄存器的修改,因为它需要临时性地对某一个扇区不加以保护,那么应用系统就要限制自身的使用。要合理地设计应用系统,以使其对扇区保护寄存器的个性不超过10000次。
(10)安全措施
1)扇区死锁命令(3DH-2AH-7FH-30H)
这一命令应用于商业上。芯片可以通过扇区死锁命令对某一个扇区进行死锁,从而使扇区变为只读的。这在应用中是很有用的,用来存储代码或安全信息。当一个扇区被死锁后,它就不能再被擦除或编程,也不能解锁。
要执行扇区死锁命令,#CS引脚要设为有效状态,写入4字节操作码序列,一定按正确的顺序写入。写入后,再写入3字节地址。在地址写入后,再将#CS引脚设为无效状态以初始化一个内部死锁操作。
在进行死锁操作的过程中,状态寄存器指示芯片处于忙状态。如果操作过程中掉电,则死锁操作得不到保证。在这种情况下,使用者应读取扇区死锁寄存器以确定相应的扇区是否已经死锁。
扇区死锁命令的时序图:
1. 扇区死锁寄存器
扇区死锁寄存器中包含16个字节,如下表所示:
扇区0(0A,0B)
2. 扇区死锁寄存器读取命令(操作码:35H)
扇区死锁寄存器中的数据可以读取以确定扇区是否被死锁。要读取扇区死锁寄存器,#CS引脚必须设为有效,通过SI引脚写入操作码与3个字节。写入后,扇区死锁寄存器中的数据将从SO引脚输出。每一个字节是扇区0(0A,0B)的内容,第二个字节是扇区1的内容,最后一个字节(第16个字节)是扇区15的内容。16个字节都被读出后,如果产生时钟信号,则会在SO引脚输出未定义数据。
将#CS设为无效以终止扇区死锁寄存器读取操作,并将SO引脚转为高阻态。
扇区死锁寄存器读取命令的时序图:
2)安全寄存器
芯片包含有一个序列化的安全寄存器,用来存储唯一的设备序列码或密钥。安全寄存器包含128个字节,被分为两个部分。前64字节(0~63)是一次性的用户编程空间。一旦这64个字节被编程,则以后不能再对其进行重编程。后64个字节(64~127)由ATMEL编程,以使其包含唯一的数值。出厂时编程的数据是固定不变的,不能被更改。
1. 安全寄存器编程命令(操作码:9BH-00H-00H-00H)
安全寄存器中的用户可编程部分在编程前是不需要擦除的。
要对安全寄存器进行编程,先要将#CS引脚设为有效,写入4字节的操作码序列。写入后,就可以向芯片写入64字节的用户可编程部分的数据。在数据写入后,#CS引脚必须设为无效,来初始化一个编程周期。安全寄存器的编程需要一定的时间,在此期间状态寄存器将指示芯片处于忙状态。如果此过程中掉电,则64字节的用户可编程部分的数据不能得到保证。
如果在#CS设为无效以前,没有写入64个字节,则没有被写入的寄存器单元的值不能得到保证。例如,如果只有两个字节写入,而不是完整的64个字节,则用户可编程部分的后62个字节就得不到保证。而如果写入了多于64个字节,则数据会自动返回到开头的位置。而安全寄存器中的用户可编程部分只能被编程一次。因此,不可能先编程前两个字节,而随后再编程后62个字节。
安全寄存器编程命令利用SRAM数据缓冲区1来实现编程。操作完成后,缓冲区1会恢复到原先的数据。
安全寄存器编程命令的时序图:
2. 安全寄存器读取命令(77H)
要对安全寄存器进行读取时,先将#CS引脚设为有效,写入操作码与3个字节。写入后,在时钟信号的作用下,数据将从SO引脚输出。所有的数据都被输出后,如果时钟信号仍然存在,则会从SO引脚输出未定义数据。将#CS引脚设为无效就会终止安全寄存器读取操作并将SO引脚转为高阻态。
安全寄存器读取命令的时序图:
(11)附加命令
1)主存储器页到缓存区转移命令(缓冲区1 53H 缓冲区2 55H)
2)主存储器页和缓存区比较命令(缓冲区1 60H 缓冲区2 61H)
3)读取状态寄存器命令(操作码:D7H)
4)节电模式和退出节电模式(操作码:B9H/ABH)
|