NAND FLASH 2440

本文详细介绍了NAND Flash的存储单元结构、工作原理及其在S3C2440平台上的应用。涵盖基本存储器件MOSFET、页与块的概念、地址寻址方式及读写操作流程。此外,还探讨了错误检测与纠正机制、坏块管理及NAND Flash控制器的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    首先看一下NAND FLASH的组成,总最小的存储单元开始,存储的基本器件是MOSFET,具体怎么存储信息与沟道的形成有关(这在数字电路里面介绍得比较清楚),这个单元可能是SLC或者MLC,区别在于单个单元的存储信息量的不同,实现方式上是通过将电压分为多个档次,这样没个档次可以对应一个信息,比如一共4个档次,那么就可以存储2BITS的信息。然后大一点就是PAGE了,一个PAGE可能有几百或者几K BYTES的存储容量。其中PAGE联系之前SDRAM中的PAGE有一个共同的特性,就是指一行所包括的的全部单元(ROW)。这样多个行,也就是多哥PAGE就形成了快BLOCK,多个块就形成了一个芯片。所以地址需要根据这样的结构来进行寻址。外部来看,NAND FLASH 的一个特点是它没有具体的地址总线和数据总线,所以并不挂在CPU外部总线上,而是用IO口代替实现寻址和数据交换,这样的结果也使得不能在NAND FLASH中直接执行程序,因为CPU并不能直接依赖总线去NAND中取指令,所以在2440中配合NAND就有了一个STEPPING STONE。这里想到还有一个就是说,因为CPU RESET后总是从0地址开始取指的,这样从哪个器件启动程序就需要将哪个器件映射到0地址,而做这个工作的就是OM[1:0]引脚对应的内部逻辑单元。

    接着是NAND FLASH的工作原理。由于NAND FLASH的外部结构决定了只能是软件方式串行的操作,所以整个过程需要有操作命令和地址、数据等。又因为容量决定了地址寻址的位数可能不址IO引脚的数量,所以需要根据具体的容量大小和IO引脚的数量来确定地址的输入周期。这个参数也是需通知控制寄存器的,具体的地址在每个周期中的写法需要参考具体的NAND芯片的设计。接下来就是根据相应地址来读写数据了,根据不同芯片这个过程中有一种情况,比如我们在写操作的时候是将数据写进了NAND控制器相应的FIFO中,但是还需要经过一个BUFFER才能真正到NAND FLASH中,这个BUFFER是一个页的大小,也叫PAGE BUFFER,这也就解释了为什么有些NAND芯片的读写操作需要两个读写命令,第一个命令告诉NAND接下来的是要读还是写,让它准备好,那么相应的数据这个时候就暂时放在了BUUER中,然后第2个命令才是将BUFFER中的数据存入目标寄存器。

    由于NAND的制造技术使得坏块存在的可能性很大,所以这里要涉及一个检错纠错的功能,这个过程非常复杂,但是2440在硬件电路上已经设计好了这个模块,所以根据需要可以来选择这个功能。同时在NAND的页中也分成了两块,MAIN区放着实际数据,SPARE区放着EEC标记,这些信息就是用来检查坏块的。坏块有2种可能的情况,出厂时就存在的和在使用过程中产生的。他们都有相应的信息进行标注,比如块中第一个页的某个地址,如果不是0XFF,那么就是可、坏块。同时可以设置一张坏块表来实现坏块的管理BBT,这在UBOOT和LINUX中有相应的实现。而这张坏块表本身需要放在相对比较稳定的块中,而一般的厂商基本都会保证第一个块的完好。

    根据不同的NAND FLASH芯片,可能有不一样的操作指令,这个需要查找对应的DATASHEET来使用。

    参考2440数据手册中:

    SOFTWARE MODE
S3C2440A supports only software mode access. Using this mode, you can completely access the NAND flash
memory. The NAND Flash Controller supports direct access interface with the NAND flash memory.
1. Writing to the command register = the NAND Flash Memory command cycle
2. Writing to the address register = the NAND Flash Memory address cycle
3. Writing to the data register = write data to the NAND Flash Memory (write cycle)
4. Reading from the data register = read data from the NAND Flash Memory (read cycle)
5. Reading main ECC registers and Spare ECC registers = read data from the NAND Flash Memory
    NOTE
    In the software mode, you have to check the RnB status input pin by using polling or interrupt.


    结合NAND的特性,大概总结一下需要如下的一些设置:

         1、尺寸方面,IO BUS WIDTH,PAGE SIZE,ADDRESS CYCLE,这些在NFCONF中可以READ,但是根据NAND datasheet在引脚上来进行配置;

         2、时序方面,TACLS,TWRPH0,TWRPH1,这些也在NFCONF中进行设置;

         3(1)、使能+片选,不过这个在BOOT的时候被自动控制了,而后面的要对NANDFLASH进行操作的话,就需要设置使相应位使能。

         以上的基本设置设置好了之后,2440的NAND BOOT就可以通过硬件将前4K代码搬移到SDRAM中了,但是具体的实现跟软件的读写操作需要的步骤有什么不同我不是很清楚。

         4、其他如果要涉及ECC,那么还需要设置相应的寄存器,这在NFCONT中有相应的位。

         5、如果要对某些区域进行权限控制,比如禁止擦除和写等,这个在LOCK选项中实现,在NFCONT中进行设置。可以是LOCK TIGHT或者SOFT LOCK,区别在于,一个LOCK后只能在RESET后UNLOCK,后者可以通过软件方式修改LOCK状态。

         3(2)、使能+片选,NFCONT中的MODE,Reg_nCE位。清RnB 信号,NFSTAT的RnB_TransDetect位。

         6、接下来根据具体的操作来配置寄存器了,首先是输入相应的命令到NFCMMD,这个寄存器的可用位是8位,但是在看NAND数据手册的时候可以看到它的命令也正好是8位的,可见应该是统一的;然后是地址到NFADDR,这就需要联系2中的时序来进行操作,这些都需要根据具体的NAND芯片事先决定;然后判断前异一步操作是否完成,通过NFSTAT的RnB (Read-only)和RnB_TransDetect位,这里可以根据前面的NOTE中有轮询和中断两种办法;在不忙状态后,因为读/写是以页为单位进行的,接下来就连续读/写NFDATA中的数据,具体次数根据页的大小和IO位数来决定。

         7、禁止NANDFLASH,在NFCONT中进行,与3(2)对应。

 

    特别在根据NAND手册写入地址时需要根据手册中相应的位准确写入每个周期的相应地址,比如A8用来判断是一页的前半部分还是后半部分,但是并不在写地址过程中指定,而是在写命令的时候就已经确定了。

 

    在上电的时候,NAND FLASH中前4K代码将自动被装入STEPPING STONE中,由于此时还没有进行任何的程序执行,所以这部分可想而知完全是由硬件完成的,具体电路上怎么实现我还不清楚,但是即使不管NAND FLASH在读写操作上与NOR FLASH有什么区别,至少接口数目,内部爷的大小等信息还是必须要在搬移过程中知道的,而刚上电的时候怎么去获得这些信息:通过外部引脚。所以事先要设置与这些信息相对应的外部引脚的电平。参考2440 DATASHEET:

    PIN CONFIGURATION
    OM[1:0] = 00: Enable NAND flash memory boot
    NCON: NAND flash memory selection(Normal / Advance)
    0: Normal NAND flash(256Words/512Bytes page size, 3/4 address cycle)
    1: Advance NAND flash(1KWords/2KBytes page size, 4/5 address cycle)
    GPG13: NAND flash memory page capacitance selection
    0: Page=256Words(NCON = 0) or Page=1KWords(NCON = 1)
    1: Page=512Bytes(NCON = 0) or Page=2KBytes(NCON = 1)
    GPG14: NAND flash memory address cycle selection
    0: 3 address cycle(NCON = 0) or 4 address cycle(NCON = 1)
    1: 4 address cycle(NCON = 0) or 5 address cycle(NCON = 1)
    GPG15: NAND flash memory bus width selection
    0: 8-bit bus width
    1: 16-bit bus width
    NOTE
    The configuration pin – NCON, GPG[15:13] – will be fetched during reset.
In normal status, these pins must be set as input so that the pin status is not to be changed, when enters
Sleep mode by software or unexpected cause.

    另外:

    NOTE
During the auto boot, the ECC is not checked. So, the first 4-KB of NAND flash should have no bit error.

    可见BOOT过程也并不需要考虑ECC操作。

 

 

### SSD 3D NAND Page Buffer 工作原理和技术细节 #### 页面缓冲区的作用 页面缓冲区(Page Buffer)是NAND闪存内部的一个重要组件,用于临时存储要写入或读取的数据。在3D NAND架构中,页面缓冲器不仅承担了传统2D NAND的功能,还针对三维堆叠结构进行了优化。 #### 数据传输流程 当执行写入操作时,主机发送待编程的数据至SSD控制器,随后这些数据被暂存在DRAM缓存内;接着通过串行接口传送到对应的NAND芯片并加载到其各自的Page Buffer里等待实际的Program命令触发[^1]。 对于读取请求而言,则是从目标单元获取信息后先放置于Page Buffer之中完成必要的处理(比如纠错),再经由相同的路径返回给外部设备。 #### 缓冲区内部分配机制 为了适应多层单元(Multi-Level Cell, MLC)/三层单元(Triple-Level Cell, TLC)甚至四层单元(Quad-Level Cell, QLC)的不同需求,现代3D NAND Flash采用了更为复杂的Page Buffer设计方案: - **位线分配**:每条Bit Line连接多个Cell String上的浮动栅晶体管源端,因此需要合理安排各字节之间的映射关系以便准确无误地访问指定位置。 - **电压管理**:考虑到不同阈值范围所代表的状态差异较大,在进行Read/Verify动作期间必须精确设置Vth比较电平来区分有效信号与噪声干扰[^4]。 #### 物理实现方式 具体来说,Page Buffer通常集成有Sense Amplifier阵列以及辅助电路用来支持高速I/O通信和复杂算法运算等功能。此外,随着垂直方向层数不断增加,如何保持良好的电气特性成为制造商面临的一大挑战——例如采用新型材料降低寄生电阻、改进布线布局减少耦合效应等措施均有助于提升整体性能表现[^5]。 ```python def read_page_data(page_buffer_address): """ 模拟从特定地址处读取一页数据的过程 Args: page_buffer_address (int): 要读取的页缓冲区起始地址 Returns: list: 返回该页的内容列表形式表示 """ data = [] # 假设此处已经完成了所有准备工作... for i in range(PAGE_SIZE_IN_BYTES): byte_value = simulate_read_operation(page_buffer_address + i) data.append(byte_value) return data def write_to_page_buffer(data_list, target_page_buffer_addr): """ 向指定的目标页缓冲区写入一组新的数据 Args: data_list (list of int): 待写入的新数据序列 target_page_buffer_addr (int): 目标页缓冲区首址 """ assert len(data_list) == PAGE_SIZE_IN_BYTES, "Data size mismatch!" for index, value in enumerate(data_list): perform_write_action(target_page_buffer_addr + index, value) PAGE_SIZE_IN_BYTES = 8 * KiB # 这只是一个假设性的常量定义 simulate_read_operation = lambda addr: ... # 此函数模拟真实的硬件交互行为 perform_write_action = lambda addr, val: ... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值