nand关于读、写和擦除的命令流程

转载地址:http://blog.sina.com.cn/s/blog_5c401a150101d9yk.html

读操作

    读操作是指从一个指定地址读取数据出来。为了完成读取,当一个读操作被触发的时候NAND必须去识别这

个操作和相对应的地址。在执行了读取操作算法一段时间之后,NAND Flash就开始输出了数据序列。基于NAND的

各个pin的信号,NAND的Command Interface就能够去识别被触发的命令。

    图2.11展示了一个命令周期,当CLE为高的时候Command Interface就会识别一个命令周期;在那种情况下,

DQs上输出的8-bit的值就代表command。

    图2.12展示的是一个地址周期,通常任何操作都需要对要进行操作的部分进行寻址。地址的长度依赖于要

做什么操作和NAND本身的容量。不管怎样,输入列地址需要N个周期,输入行地址需要M个周期。当ALE是高的时候Command Interface就识别地址;同样的如果所有的输入信号是低的时候DQs的值也是地址。

    在读操作的最后一个命令阶段就是数据输出,如图2.13所示。数据的输出是由RE#信号来进行切换的:在每

一个周期内DQs上都会有一个新的数据。

[NAND] <wbr>关于读、写和擦除的命令流程
 

 

    这些基本的时钟周期是被NAND用来解码和执行各个操作,图2.14展示了一个读命令的时序。第一个周期被

用来触发读命令“RD”(例如00h)。在命令周期之后会有一连串时钟周期,这些周期是为了提供地址。之前有

说过给地址的过程是先给列地址,接着给行地址。所有的引脚(ALE\CLE\RE#)包括图中没有的都必须按照之前

所描述的那样去进行操作。代码“RDC”(Read Command Confirm,例如30h)被用于确认读命令。最后,开始

进行读取操作并且设备进入到忙碌状态;当NAND重新回到准备状态,数据的输出周期也就开始了。

    上面所描述的读命令输出的数据时整个页的数据一起输出,而不会去管你是否想要读哪个byte的数据。在

某些情况下,我们只需要对很小的数据进行操作,或者是我们只想读一个页里面的随机值。这种时候Command

Change Read Column(也就是我们熟知的随机数据输出)就能够改变我们正在读取的列地址。

    图2.15展示了Change Read Column的时序,通常在读命令被执行之后,将会由可能在数据输出的时候改变

列地址。当一个命令周期内触发了“CRC”(Change Read Column 例如05h),紧接着是我们想要去进行读取的

数据的地址。当由于需要的列地址更少的时候 那么对读命令所需求的周期就更少了。用于确认的命令周期“CRCC”(Change Read Column Confirm 例如:E0h)被用于使能数据输出。由于这个过程数据已经存储到页缓存里面,所以就不需要额外的时间去做这个动作。

    一般而言,一个读操作的忙碌时间会持续大概25-30us。通过Read Cache Command来提高读的效率是一种不错的方法;在这个命令里面,我们可能会从Flash存储器中去下载数据,而页缓存则正在读另外一个页的内容。

[NAND] <wbr>关于读、写和擦除的命令流程

[NAND] <wbr>关于读、写和擦除的命令流程
 

    Sequential Read Cache Command 序列如图2.16所示。读命令必须在Read Cache Command之前被触发。在

设备返回准备状态之后,命令代码"RC"(Read Cache 例如31h)是被用来初始化数据从存储阵列到页缓存的下载。

RB#会拉低一会然后NDout周期被用来输出第一个页。由于没有其他地址输入,下一个顺序页的内容就会被自动

读取。当我们不需要读其他页里面的内容的时候,最后一个页的内容会被命令“RCE”(Read Cache End 例如

3Fh)复制到页缓存中。

    随机缓存读序列如图2.17所示:在这个命令的过程中我们可以选择我们想要进行缓存的页 的地址。

 

 

[NAND] <wbr>关于读、写和擦除的命令流程

 

 

    

    对于一个多plane的芯片,我们可以对多个plane同时触发读命令。图2.18展示多Plane的读命令序列。

    在标准读命令周期“RD”之后,对plane 0中我们想要读取的页的地址就会被触发。命令代码“MR”

(Multi-plane read 如32h)会被用在下一个命令周期中,这样设备就可以为接收plane 1的数据的地址做准备。一旦新的地址和读命令确认代码“RDC”给出,那么设备就会进入到忙碌状态并开始在两个planes上同时执行读取算法。当设备返回准备状态,命令周期CC(Choose Column 例如06h)就会被用来选择我们想要输出的页的地址,接着就是一连串地址周期。命令代码“CCC”(Choose Column Confirm 例如 E0h)是一个命令确认代码。最后Dout的周期就是被用来输出读取的数据。

    由于不管Read Cache Command还是多plane的读取都是为了提高NAND的读数据的效能,所以我们简单的对他

们进行了对比,如图2.19所示为一般读取、缓存读取和多plane读取的比较结果。

[NAND] <wbr>关于读、写和擦除的命令流程

[NAND] <wbr>关于读、写和擦除的命令流程
 

    已经给出的Talgo这个时间需要去从NAND中读取,Tout这个时间需要去页里面进行下载,执行对两个页的读

取的全部时间是 T = 2*Talgo + 2*Tout。如果一个多plane命令被用到了,Talgo在两个plane同时被执行,那么

T = Talgo + 2*Tout。评价在Cache Read中的时间T比较困难。因为我们必须考虑到Talgo和Tout的比率问题。

如果Tout比Talgo更长的话,那么T = Talgo + 2*Tout。他必须遵守这样的规则:Cache Read 和 Double Plane

Read是一样的。相比之下,如果Talgo比Tout更长的话,那么就不可能用Talgo去对单个页的数据输出进行标识。

在这种情况下,Double-plane Read的效能就会比Cache Read的效能要好。

[NAND] <wbr>关于读、写和擦除的命令流程
 

 

写操作

    写操作的目的是将一个数据序列写进一个指定的地址中去。基本的关于周期的概念在上面读操作中已经介绍

过了:如命令周期和地址周期,唯一需要增加的周期是"Din"周期,参考图2.21。数据输入靠信号WE#来进行转换,在每一个周期一个新的字节就会出现在DQs上。

[NAND] <wbr>关于读、写和擦除的命令流程
 

    写的时序流程如图2.22所示。一个命令周期输入“PM”码(写 例如80h)然后紧跟着希望写的地址的地址

周期。当地址设置完成,若干个“Din”周期就会被用于将数据输入到页缓存中。最后一个“PMC”(Program 

Confirm 例如10h)命令被用来触发这个读算法的开始。

[NAND] <wbr>关于读、写和擦除的命令流程
 

    如之前已经讲解过的读操作,在写操作的情况下也需要传输大量的数据。Change Write Column被用于改变

我们想要写的地址的列地址。

    写的过程需要保持忙碌的时间会比较长:一般150-200us。写缓存操作或是两个plane的写操作都是用来提高

写操作的效率的。图2.23展示了写缓存操作和两个plane写操作的时序。

    第一阶段的周期(“PM”周期,地址周期和“Din”周期)是和标准写操作的周期是一样的。没有用“PMC”

而是用了一个“C/M”命令周期来进行触发。“C/M”可以是写缓存操作(例如15h)也可以是两个plane操作(例如11h)。一旦另外一个“PM”命令给出,紧接着就是新的地址和“PMC”命令。存储器会进入到忙碌状态并且写

算法也会在两个页中被同时执行。两个plane的情况不需要上面这样操作,因为两个plane的写操作已经被熟知

为是一种同时在两个plane上进行写的动作,写算法会同时在两个plane上同时工作。

[NAND] <wbr>关于读、写和擦除的命令流程
 

    重叠的双plane的写操作也是可以的。第一个plane的写操作在数据被加载到页缓存中就立刻开始进行写了。

这种情况NAND的架构必须要能够在两个plane上用独立的方式去执行写算法。

    上面提到的写算法的命令的差异比较见图2.24.

[NAND] <wbr>关于读、写和擦除的命令流程
 

 

擦除操作

    擦除操作是被用来在NAND上删除数据的操作。如之前所说,擦除操作最小的操作单元是block。图2.25展示

擦除命令的序列。

    擦除命令是非常简单的:一个“ER”码(擦除命令 例如60h)先触发,紧接着是block的地址和“ERC”码

(擦除确认命令 例如D0h)。之后存储器就开始执行擦除算法并进入忙碌状态了。

[NAND] <wbr>关于读、写和擦除的命令流程
 

    由于擦除是时间最长的的操作(大约耗时1ms),双plane的擦除命令可用于在同一时间擦除两个blocks。

图2.26展示了双plane擦除的命令序列。

    标准的擦除周期(“ER”命令和行地址周期)是跟在一个“MER”命令(Multi-plane擦除 例如D1h)之后

的。一旦两个plane的地址和"ERC"码都被给出,那个存储器就进入到了忙碌状态,这个时候两个plane上的两个

block就在被同时擦除。

[NAND] <wbr>关于读、写和擦除的命令流程
 

 

同步操作

    NAND的读操作的吞吐量是由寻址时间和数据传输时间决定的。异步总线的数据传输速度极限是40MB/s。随着

制程技术的提升,页的大小在提升,同时数据传输所需的时间也有所增加。这样,NAND的读操作的吞吐量反而

降低了。这也就在寻址时间和数据传输时间的比率上造成了混乱。DDR的接口引入就是为了解决这样的问题。

    现在市场上两种可能的解决方法:第一是Source Synchronous Interface(SSI),SSI是一种被ONFI结构

(Open NAND Flash Interface)驱动的方法;ONFI是为了让NAND的接口标准化而在2006年的时候制定的。另外

一些NAND供应商则使用的是Toggle-Mode接口。

    图2.27展示的是NAND的SSI标准的接口。和异步接口(ASI)进行对比,可以发现主要有三点不同:

1、RE#变成了W/R#,W/R#是一个指示读/写的引脚

  2、WE#变成了CLK时钟信号脚。

3、多了一个DQS脚,主要是用来作为数据的阀门作用;例如他可以用来指示数据的有效窗口。

[NAND] <wbr>关于读、写和擦除的命令流程
[NAND] <wbr>关于读、写和擦除的命令流程
 

    这里,时钟是被用来指引命令和地址的传输;而数据阀门信号则是用来指引数据应该被传输到哪里去。

DQS是一个双向总线,也是由和时钟同样的频率来进行驱动。

    之前的关于基本命令周期的介绍必须根据接口来进行调整。

    图2.28展示了SSI标准的一个操作序列,命令周期发完之后紧跟着Dout周期。

    Toggle-Mode DDR 接口使用的引脚如图2.29所示。

[NAND] <wbr>关于读、写和擦除的命令流程
 

 

    另外需要注意的是只有DQS引脚才被添加进了ASI标准协议之中。这样,更高的速度就可以通过切换RE#的频率的提升来实现。

    图2.30展示了Toggle-Mode接口:一个命令序列后面接着“Dout”周期。

<think>好的,我现在需要回答用户关于NAND Flash擦除测试程序的问题。首先,我要确定用户的需求是什么。他们可能是在开发嵌入式系统,或者进行存储设备的测试,需要了解如何编或理解这些测试程序的基本流程。 接下来,我应该先回顾NAND Flash的基本特性。NAND Flash的存储结构分为块(Block)、页(Page),每个页可能有多个扇区。擦除操作是以块为单位进行的,而则是以页为单位。这一点很重要,因为在编测试程序时必须遵循这些物理特性,否则可能导致操作失败或损坏设备。 然后,关于擦除测试程序。用户可能想知道如何正确擦除一个块。需要检查块地址是否有效,发送擦除命令到相应的地址,然后等待操作完成。同时,必须验证擦除是否成功,通常通过取块中的数据是否为全1来判断,因为擦除后的状态是1,入才会变为0。这里可能需要处理坏块的问题,因为NAND Flash可能存在出厂坏块或在使用中产生的坏块,测试程序需要能识别并跳过这些块。 接下来是入测试。入通常是按页进行的,需要发送命令、地址,然后入数据。入完成后,需要取数据来验证是否正确入。这里要考虑入的数据模式,比如全0、交替模式等,以检测潜在的入错误。同时,需要考虑ECC(纠错码)的使用,因为NAND Flash可能存在位翻转,ECC能帮助检测纠正这些错误。 取测试方面,需要验证取的数据是否与入的一致。此外,还需要处理取过程中可能出现的错误,比如使用ECC校验。如果发现错误,可能需要重试或标记坏块。另外,取时需要考虑时序电压的稳定性,这些可能影响数据的正确性。 在测试程序中,错误处理是一个关键部分。需要检查状态寄存器的标志位,判断操作是否成功。如果失败,可能需要重试操作,或者标记坏块,避免后续使用。同时,测试程序需要记录日志,方便调试分析问题。 还有测试流程的设计。比如,先进行全盘擦除,然后按顺序或随机选择块进行擦除入、取验证。压力测试可能需要多次循环擦,以检测Flash的耐久性。性能测试则需要统计擦除入、取的时间,评估速度是否符合规格。 需要考虑不同厂商的NAND Flash可能存在差异,比如命令集、时序参数等,测试程序需要有一定的可配置性。此外,坏块管理策略也很重要,比如使用坏块表(BBT)来跟踪坏块的位置。 用户可能还关心实际代码的结构。比如,初始化控制器、扫描坏块、执行擦除入测试数据、取验证、结果输出等步骤。每个步骤需要调用对应的驱动函数,并处理可能的异常情况。 总结下来,回答需要涵盖擦除入、取的基本流程,注意事项如坏块处理、ECC、错误检测,以及测试程序的设计要点常见测试方法。需要结构清晰,分点说明,让用户能够逐步理解如何实现这些测试程序。</think>以下是NAND Flash擦除测试程序的实现要点(以嵌入式系统为例): $$ \text{典型测试流程} = \text{初始化} \rightarrow \text{坏块扫描} \rightarrow \text{擦除测试} \rightarrow \text{入测试} \rightarrow \text{取验证} $$ 一、**擦除测试程序** 1. **块选择** - 通过物理地址选择目标块(如:Block 0x100) - 检查坏块标记(OOB区域的第一个字节) 2. **发送擦除命令序列** ```c // 示例伪代码 send_command(0x60); // 擦除周期1 send_address(block_addr); send_command(0xD0); // 擦除周期2 ``` 3. **等待完成 & 状态检查** ```c while(!nand_ready()); // 等待操作完成 status = read_status(); if(status & 0x01) { // 检查失败标志 mark_bad_block(block_addr); } ``` 4. **验证擦除结果** 取整块数据,验证是否全为0xFF(每个单元需满足$D_{n}=FF_{hex}$) --- 二、**入测试程序** 1. **页编程流程** ```c send_command(0x80); // 编程周期1 send_address(page_addr); write_data(buffer, 2048); // 假设页大小2KB send_command(0x10); // 编程周期2 ``` 2. **数据模式选择** - 全0模式:$00_{hex}$填充(压力测试电荷保持) - 棋盘格模式:$AA_{hex}/55_{hex}$交替(检测耦合干扰) - 伪随机序列:使用LFSR生成 3. **OOB区域处理** 入ECC校验码(如Hamming码、BCH码): $$ ECC = f(D_{0},D_{1},...,D_{2047}) $$ --- 三、**取测试程序** 1. **标准取操作** ```c send_command(0x00); // 取周期1 send_address(page_addr); send_command(0x30); // 取周期2 read_data(buffer, 2048+64); // 数据+OOB ``` 2. **数据校验** ```c if(memcmp(write_buf, read_buf, 2048) != 0) { error_count++; recalculate_ecc(); // 验证ECC纠错能力 } ``` 3. **误码率统计** 计算每比特错误概率: $$ BER = \frac{\sum_{i=0}^{n}err_{i}}{2048 \times 8 \times n_{test}} $$ --- 四、**关键注意事项** 1. **时序控制** 需严格遵循芯片手册参数(如t_{PROG}<25ms,t_{BERS}<3ms) 2. **坏块处理策略** - 出厂坏块:标记在OOB第六字节(不同厂商可能不同) - 动态坏块:维护坏块映射表(BBT) 3. **磨损均衡** 使用动态地址映射算法,避免频繁擦同一块: $$ W_{cycle} = \frac{\sum EraseCount_{i}}{N_{blocks}} \leq spec_{max} $$ --- 五、**测试用例设计** 1. **边界测试** - 首尾块操作(Block 0Block N-1) - 跨页入(如连续Page 0-63) 2. **压力测试** - 持续擦循环(验证P/E周期指标) - 高温老化测试(加速电荷泄漏) 3. **异常场景** - 突然断电恢复测试 - 错误注入测试(模拟位翻转) --- **典型测试结果输出示例** ``` [Block 0x1A00] Erase Test: PASS (368ms) [Page 0x3400] Write-Read: 2 bit errors (corrected by ECC) Endurance Test: 10,000 cycles (BER < 1e-9) ``` 建议实际开发时结合具体控制器(如STM32 FMC、Linux MTD子系统)实现驱动层交互,并通过逻辑分析仪验证时序波形。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值