1、Basic Development Document NAND Flash 版本号 1.0 2009 年 12 月 06 日 文件标识:R&DNXP LPC3250_EK 平台 当前版本: v1.00 作 者: 林鸿飞 文件状态: 草稿 正式发布 正在修改 完成日期: 2009-12-06 作 者:林鸿飞 日 期: 2009-12-06 基本开发文档(BD) NAND Flash All Rights Reserved, Copyright (c) Honphy Lin Limited 1/16 Basic Development Document NAND Flash 版本号 1.0 200
2、9 年 12 月 06 日 版本 /状态 作者 参与者 起止日期 修改内容 v1.00 林鸿飞 2009-12-06 初始版本 All Rights Reserved, Copyright (c) Honphy Lin Limited 2/16 Basic Development Document NAND Flash 版本号 1.0 2009 年 12 月 06 日 目 录 All Rights Reserved, Copyright (c) Honphy Lin Limited 3/16 Basic Development Document NAND Flash 版本号 1.0 2009
3、年 12 月 06 日 第 1章 LPC32x0 多级 NAND flash 控制器 1.1 介绍 注: LPC32x0 有两个 NAND Flash 控制器,一个多级 NAND Flash 控制器和一个单级 NAND Flash 控制器。这两个 NAND Flash 控制器使用相同的引脚接口来外接 NAND Flash 芯片,因此在某一时间只有一个接口是可用的。 NAND Flash 控制器可在 FLASHCLK_CTRL 寄存器中设置位来禁止,为了省电在她们没有被用时。多级单元 MLC NAND Flash 控制器接口连接到多级 NAND Flash 设备。外部 NAND Flash 设备
4、(不论是多级还是单级类型)可用于允许自动引导程序加载到内部 RAM 用于执行应用程序,详情请见“引导程序开发文档” 。 1.2 EMC 的特性 1.3 管脚 All Rights Reserved, Copyright (c) Honphy Lin Limited 4/16 Basic Development Document NAND Flash 版本号 1.0 2009 年 12 月 06 日 第 2章 LPC32x0 单级 NAND flash 控制器 2.1 介绍 注: LPC32x0 有两个 NAND Flash 控制器,一个多级 NAND Flash 控制器和一个单级 NAND F
5、lash 控制器。这两个 NAND Flash 控制器使用相同的引脚接口来外接 NAND Flash 芯片,因此在某一时间只有一个接口是可用的。 NAND Flash 控制器可在 FLASHCLK_CTRL 寄存器中设置位来禁止,为了省电在她们没有被用时。 单级单元 MLC NAND Flash 控制器接口连接到单级 NAND Flash 设备。外部 NAND Flash 设备(不论是多级还是单级类型)可用于允许自动引导程序加载到内部 RAM 用于执行应用程序,详情请见“引导程序开发文档” 。 2.2 特性 z 闪存设备大小高达 2Gbit。更小的设备将被隐藏。 z NAND 闪存宽度为 8位
6、。 z DMA 页传输。 z 20 字节的 DMA 读和写 FIFO , 8 字节的命令 FIFO。 z 在主数据区硬件支持 ECC(错误检查和校正)。如果发现错误,软件必须修复。支持双位错误检测和 1位错误更正。备用区的错误检测则需由软件来实现。 2.3 管脚描述 表 2.1 NAND flash 控制器管脚 管脚名称 类型 NAND 闪存 信号 功能 FLASH_CE_N 输出 CEn 芯片选择,低电平有效。 FLASH_WR_N 输出 WEn 写使能,低电平有效。 FLASH_RD_N 输出 REn 读使能,低电平有效。 FLASH_ALE 输出 ALE 地址锁存使能。 FLASH_CL
7、E 输出 CLE 命令锁存使能。 FLASH_RDY 输入 RDY 激活高就绪信号。 FLASH_IO7:0 输入 /输出 D_IO I/O 管脚,命令,地址和数据。 2.3.1 2.3.2 NAND flash 控制器中断信号 MLC NAND Flash 控制器中断被 NAND_INT_E 屏蔽且 ORed 在 SLC NAND Flash 控制器变为中断控制器之前带有中断信号。 MLC 和 SLC NAND Flash 控制器的中断连接入图 2.1 所示。 NAND flash 控制器 DMA 请求信号 dma_breq(0)、 dma_sreq(0)以及 dma_sreq(1) 都是
8、ORed 并连接到作为从 SLC Flash 控制器( DMA 控制器外围设备号 1)突发请求新信号的 DMA 控制器。为了能够使 SLC NAND Flash 控制器能够使用外设到外设的 DMA 传输,这种突发请求信号也被连接到 DMA 控制器外围设备号 12 在 SLC Flash 控制器被选择时。 当 MLC NAND Flash 控制器被选择, MLC Flash 控制器的突发请求信号被连接到 DMA 控制器外部设备号 12。 All Rights Reserved, Copyright (c) Honphy Lin Limited 5/16 Basic Development Doc
9、ument NAND Flash 版本号 1.0 2009 年 12 月 06 日 MLC 和 SLC NAND Flash 控制器的 DMA 信号连接如图 2.1 所示。 图 2.1 略。 2.4 SLC NAND flash 控制器描述 SLC NAND flash 控制器的框图如图 2.2 所示。 AHB 总线IRQDMABREQDMABREQDMACLR 2.5 DMA 接口 下面的 DMA 信号用于 SLC NAND flash 控制器。在某一时间只有一个请求信号可被激活。请求信号保持断言直到 DMA 控制器断言 DMACLR 信号。 2.5.1 DMA SREQ 单字 DMA 请求
10、。 2.5.1.1 DMABREQ 突发 DMA 请求。DMABREQ 信号用于数据传输阶段。当读取时,如果数据 FIFO 有 4 字或更多需要传输就产生断言。当写入时,如果在数据 FIFO 中少于 4 字则产生断言。 注: SLC 控制器产生的 dma_breq(0)、 dma_sreq(0)以及 dma_sreq(1)信号,它们连接在一起并连接到 DMA 控制器作为 SLC flash 控制器(作为外围设备号 1)的突发请求信号。为了能够使 SLC NAND Flash 控制All Rights Reserved, Copyright (c) Honphy Lin Limited 6/16
11、 Basic Development Document NAND Flash 版本号 1.0 2009 年 12 月 06 日 器能够使用外设到外设的 DMA 传输,这种突发请求信号也被连接到 DMA 控制器外围设备号 12 在 SLC Flash 控制器被选择时。 2.5.1.2 DMACLR DMA 请求清除输入。 DMA 控制器在突发传输的最后字传输之间断言。 2.5.2 数据 FIFO 这里只有一个数据 FIFO。数据 FIFO 可配置成读或写模式。 1 当数据 FIFO 配置成读模式时,音序器从 NAND flash 读取数据并存储数据到数据 FIFO 中。然后,不论 ARM 还是
12、DMA 在 AHB 总线上通过 32 位读来清空 FIFO。 2 当数据 FIFO 配置成写模式时, ARM 或 DMA 写数据到带有 32 位 AHB 总线写的 FIFO。然后,音序器在某一个时间取出 FIFO 8 位数据并把这些数据写入 NAND flash。 2.6 寄存器描述 表 2.2 显示了单级 NAND 闪存控制器相关的寄存器以及它们的功能。下面的表对每个寄存器都有做详细的说明。 表 2.2 单级 NAND 闪存控制寄存器 地址 寄存器名称 描述 复位值 类型 0x2002 0000 SLC_DATA SLC NAND flash 数据寄存器 - R/W 0x2002 0004
13、SLC_ADDR SLC NAND flash 地址寄存器 - W 0x2002 0008 SLC_CMD SLC NAND flash 命令寄存器 - W 0x2002 000C SLC_STOP SLC NAND flash 停止寄存器 - W 0x2002 0010 SLC_CTRL SLC NAND flash 控制寄存器 0x00 R/W 0x2002 0014 SLC_CFG SLC NAND flash 配置寄存器 0x00 R/W 0x2002 0018 SLC_STAT SLC NAND flash 状态寄存器 00X 二进制 R 0x2002 001C SLC_INT_ST
14、AT SLC NAND flash 中断状态寄存器 0x00 R 0x2002 0020 SLC_IEN SLC NAND flash 中断使能寄存器 0x00 R/W 0x2002 0024 SLC_ISR SLC NAND flash 中断设置寄存器 0x00 W 0x2002 0028 SLC_ICR SLC NAND flash 中断清除寄存器 0x00 W 0x2002 002C SLC_TAC SLC NAND flash 读时序弧配置寄存器校验位 0x00 R/W 0x2002 0030 SLC_TC SLC NAND flash 传输数据寄存器 0x00 R/W 0x2002
15、0034 SLC_ECC SLC NAND flash 校验位 0x00 R 0x2002 0038 SLC_DMA_DATA SLC NAND flash DMA 数据 - R/W 2.6.1 SLC NAND flash 数据寄存器(SLC_DATA - 0x2002 0000 ) SLC_DATA 是一个 16 位宽寄存器,提供直接对 NAND flash 存取功能。 SLC_DATA 的功能位如表 2.3 所示。写入的数据进行缓冲,然后转移到 flash 内存。SLC_DATA 必须是作为一个字寄存器来存取,尽管在都和写时只有 8 位数据。 任何 SLC_DATA 读被转移到 flas
16、h 存储器的读循环且总线处理可以延长直到请求数据可用。 表 2.3 SLC NAND flash 数据寄存器(SLC_DATA - 0x2002 0000 ) 位 描述 复位值 15:8 保留,用户软件不要向这些位写 1。从保留位读出的值未定义。 - All Rights Reserved, Copyright (c) Honphy Lin Limited 7/16 Basic Development Document NAND Flash 版本号 1.0 2009 年 12 月 06 日 7:0 NAND flash 读或写数据 - 2.6.2 SLC NAND flash 地址寄存器(SL
17、C_ADDR - 0x2002 0004 ) SLC_ADDR 是一个 8位宽度寄存器,提供直接存取 NAND flash 地址寄存器功能。 SLC_ADDR 的功能位如表 2.4 所示。 CLE 输出在写 SLC_ADDR 后被驱动,且寄存器的内容被发送到 NAND flash 数据线 D_OUT7:0。多重写 SLC_ADDR 可以增加传输地址的总宽度。写 SLC_ADDR 被存储在同样用于 SLC_CMD 和 SLC_STOP 的内部 FIFO 。 FIFO 允许内部继续操作尽管外部 NAND flash 操作已经完成。 表 2.4 SLC NAND flash 地址寄存器(SLC_AD
18、DR - 0x2002 0004 ) 位 描述 复位值 7:0 NAND flash 读和写地址。 - 2.6.3 SLC NAND flash 命令寄存器(SLC_CMD - 0x2002 0008 ) SLC_CMD 是一个 8 位宽度寄存器,提供直接存取 NAND flash 命令寄存器功能。CLE 输出在写 SLC_CMD 后被驱动,且寄存器的内容被发送到 NAND flash 数据线。写 SLC_CMD 被存储在同样用于 SLC_ADDR 和 SLC_STOP 的内部 FIFO。 FIFO 允许内部继续操作尽管外部 NAND flash 操作已经完成。 表 2.5 SLC NAND
19、flash 命令寄存器(SLC_CMD - 0x2002 0008 ) 位 描述 复位值 7:0 NAND flash 命令。 - 2.6.4 SLC NAND flash 停止寄存器(SLC_STOP - 0x2002 000C ) 写 SLC_STOP 寄存器引发闪存控制器挂起所有命令 /地址序列。SLC_STOP 位功能如表 2.6 所示。停止命令在 DMA 存取结尾被清除,在传输计数 TC = 0 时。写 SLC_STOP 被存储在同样用于 SLC_ADDR 和 SLC_CMD 的内部 FIFO。 FIFO 允许内部继续操作尽管外部 NAND flash 操作已经完成。 表 2.6 S
20、LC NAND flash 停止寄存器(SLC_STOP - 0x2002 000C ) 位 描述 复位值 7:0 写此寄存器引发 SLC 闪存控制器挂起所有命令 /地址序列。 - 2.6.5 SLC NAND flash 控制寄存器(SLC_CTRL - 0x2002 0010 ) SLC_CTRL 寄存器提供对 NAND 闪存控制器的基本控制。这些包括复位接口,清除 ECC 生成以及启动 DMA 功能。SLC_CTRL 功能位如表 2.7 所示。 表 2.7 SLC NAND flash 控制寄存器(SLC_CTRL - 0x2002 0010) 位 描述 复位值 31:3 保留,用户软件
21、不要向这些位写 1。从保留位读出的值未定义。 0 2 SW_RESET 写 1 到此位引发 SLC NAND 闪存控制器的复位。 0 1 ECC_CLEAR 写 1 到此位清除 ECC 校验位并为 ECC 积累复位计数器。 0 0 DMA_START 写 1 启动 DMA 数据通道。 0 All Rights Reserved, Copyright (c) Honphy Lin Limited 8/16 Basic Development Document NAND Flash 版本号 1.0 2009 年 12 月 06 日 2.6.6 SLC NAND flash 配置寄存器(SLC_CF
22、G - 0x2002 0014) SLC_CFG 寄存器选择 SLC NAND 闪存接口的某些配置选项。 SLC_CFG 的功能位如表 2.8 所示。 表 2.8 SLC NAND flash 配置寄存器(SLC_CFG - 0x2002 0014 ) 位 描述 复位值 31:6 保留,用户软件不要向这些位写 1。从保留位读出的值未定义。 0 5 CE_LOW 写 1 迫使 CEn 保持低,否则 CEn 只有在 SLC 访问时为低。 0 4 DMA_ECC 0: DMA ECC 通道禁止 1: DMA ECC 通道使能 0 3 ECC_EN 0: ECC 禁止 1: ECC 使能 0 2 DM
23、A_BURST 0:突发禁止,只使用 dmasreq0 信号 1:突发使能,数据通道使用 DMA_BREQ 信号 0 1 DMA_DIR 0: DMA 写如 SLC 1: DMA 从 SLC 读 0 0 宽度:外部设备宽度选择 0: 8 为设备 1:未使用 0 2.6.7 SLC NAND flash 状态寄存器(SLC_STAT- 0x2002 0018 ) 只读寄存器 SLC_STAT 表示 FIFOs 和外部闪存器件的状态。 SLC_STAT 的功能位如表 2.9 所示。 表 2.9 SLC NAND flash 状态寄存器(SLC_STAT - 0x2002 0018 ) 位 描述 复
24、位值 31:3 保留,用户软件不要向这些位写 1。从保留位读出的值未定义。 0 2 DMA_ACTIVE: DMA_FIFO 状态 0:没有数据在 DMA_FIFO 中 1: DMA_FIFO 包含数据 0 1 SLC_ACTIVE: SLC_FIFO 状态 0:没有数据在 DMA_FIFO 中 1: SLC_FIFO 包含数据 0 0 准备: NAND 闪存器件就绪信号 0:器件忙 1:器件准备好 未定义 2.6.8 SLC NAND flash 中断状态寄存器( SLC_INT_STAT - 0x2002 001C) 只读寄存器 SLC_INT_STAT 反映的是 SLC NAND 闪存接
25、口提供的中断标志。 SLC_INT_STAT 功能如表 2.10 所示。 表 2.10 SLC NAND flash 中断状态寄存器( SLC_INT_STAT - 0x2002 001C) All Rights Reserved, Copyright (c) Honphy Lin Limited 9/16 Basic Development Document NAND Flash 版本号 1.0 2009 年 12 月 06 日 位 描述 复位值 31:2 保留,用户软件不要向这些位写 1。从保留位读出的值未定义。 0 1 INT_TC_STAT:中断计数中断状态 0:中断没有等待(而后由
26、SLC_IEN 屏蔽) 1:中断正在等待(而后由 SLC_IEN 屏蔽) 0 0 INT_RDY_STAT:器件准备中断状态 0:中断没有等待(而后由 SLC_IEN 屏蔽) 1:中断正在等待(而后由 SLC_IEN 屏蔽) 0 2.6.9 SLC NAND flash 中断使能寄存器( SLC_IEN - 0x2002 0020) 只写寄存器 SLC_IEN 包含 SLC NAND 闪存接口的中断使能标志。SLC_IEN 的功能位如表 2.11 所示。 表 2.11 SLC NAND flash 中断使能寄存器( SLC_IEN - 0x2002 0020) 位 描述 复位值 31:2 保留
27、,用户软件不要向这些位写 1。从保留位读出的值未定义。 0 1 INT_TC_EN 0:禁止 TC 中断 1:使能中断在 TC 到达 0 时 0 0 INT_RDY_EN 0:禁止 RDY 中断 1:使能中断在 RDY 断言时 0 2.6.10 SLC NAND flash 中断设置寄存器( SLC_ISR - 0x2002 0024) 只写寄存器 SLC_ISR 允许软件设置 NAND 闪存中断标志。 SLC_ISR 的功能位如表 2.12 所示。 表 2.12 SLC NAND flash 中断设置寄存器( SLC_ISR - 0x2002 0024) 位 描述 复位值 31:2 保留,用
28、户软件不要向这些位写 1。从保留位读出的值未定义。 - 1 INT_TC_SET 0:写 0 无效 1:写 1 设置 TC 中断 - 0 INT_RDY_SET 0:写 0 无效 1:写 1 设置 RDY 中断 - 2.6.11 SLC NAND flash 中断清除寄存器( SLC_ICR - 0x2002 0028) 只写 SLC_ICR 寄存器允许软件清除 NAND 闪存中断标志。 SLC_ICR 功能位如表 2.13 所示。 表 2.13 SLC NAND flash 中断清除寄存器( SLC_ISR - 0x2002 0028) 位 描述 复位值 31:2 保留,用户软件不要向这些位
29、写 1。从保留位读出的值未定义。 - 1 INT_TC_CLR 0:写 0 无效 1:写 1 清除 TC 中断 - 0 INT_RDY_CLR 0:写 0 无效 1:写 1 清除 RDY 中断 - SLC NAND flash 计时 Arcs配置寄存器( SLC_TAC - 0x2002 2.6.12 All Rights Reserved, Copyright (c) Honphy Lin Limited 10/16 Basic Development Document NAND Flash 版本号 1.0 2009 年 12 月 06 日 002C) SLC_TAC 寄存器给出 NAND
30、闪存总线计时控制。 SLC_TAC 功能位如表 2.14 所示。 表 2.14 SLC NAND flash 计时 Arcs 配置寄存器(SLC_TAC - 0x2002 002C ) 位 描述 复位值 31:28 W_RDY3:0 在信号 RDY 之前根据 2 * clock 周期测试的时间。在这些 2*W_RDY2:0 时钟之后,RDY 通过接口采样。如果 RDY = 0 ,总选序列器停止。RDY 在每个块上采样直到它等于 1 ,然后继续总选序列器。 0 27:24 W_WIDTH3:0 块周期中的写脉冲宽度。可编程从 1 到 16 块。 0 23:20 W_HOLD3:0 在块周期内 A
31、LE、 CLE、 CEn 和数据写保持时间。 0 19:16 W_SETUP3:0 在块周期内 ALE、 CLE、 CEn 和数据写建立时间。可编程从 1 到 16块。 0 15:12 R_RDY3:0 在信号 RDY 之前根据 2 * clock 周期测试的时间。在这些 2*R_RDY2:0 时钟之后, RDY 通过接口采样。如果 RDY = 0,总选序列器停止。RDY 在每个块上采样直到它等于 1 ,然后继续总选序列器。 0 11:8 R_WIDTH3:0 块周期中的读脉冲。可编程从 1 到 16 块。 0 7:4 R_HOLD3:0 在块周期内 ALE、 CLE、 CEn 和数据读保持时
32、间。 0 3:0 R_SETUP3:0 在块周期内 ALE、 CLE、 CEn 和数据读建立时间。可编程从 1 到 16块。 0 2.6.13 SLC NAND flash 传输计数寄存器( SLC_TC - 0x2002 0030) SLC_TC 寄存器表示的是在 DMA 完成之前余留的 DMA 传输数。 SLC_TC 在每个 DMA 传输完成之后减少,且在任何后续的 DMA 传输时重新初始化。写入 SLC_TC 寄存器的值必须为 4 的倍数。 SLC_TC 功能位如表 2.15 所示。 表 2.15 SLC NAND flash 传输计数寄存器( SLC_TC- 0x2002 0030)
33、位 描述 复位值 15:0 T_C DMA 操作期间从 NAND flash 传输或传输到 NAND flash 的剩余字节数。 0 2.6.14 SLC NAND flash 错误校验码寄存器( SLC_ECC - 0x2002 0034) 只读寄存器 SLC_ECC 包含为 NAND 闪存数据计算的奇偶校验信息。详细请见 ECC 章节。 SLC_ECC 功能位如表 2.16 所示。 表 2.16 SLC NAND flash 错误码寄存器( SLC_ECC- 0x2002 0034) All Rights Reserved, Copyright (c) Honphy Lin Limited
34、 11/16 Basic Development Document NAND Flash 版本号 1.0 2009 年 12 月 06 日 位 描述 复位值 31:22 保留,用户软件不要向这些位写 1。从保留位读出的值未定义。 0 21:6 LP15:0 - 行奇偶 0 5:0 CP15:0 - 列奇偶 注: ECC 是计算在 256 字节大小的数据块上的,且它们在数据从 NAND 闪存存储器读(或写入)在 DMA 在突发模式下使能时计算的。如果需要支持大页,必须做多重 ECC 校验。 ECC 在每个包之前自动复位,因此奇偶位必须为后面的检测立即保存并通过软件修正。这样可以通过使用 DMA
35、控制器分散 /集中链表模而无需 CPU 干涉来支持。 2.6.15 SLC NAND flash DMA 数据寄存器( SLC_DMA_DATA - 0x2002 0038) SLC_DMA_DATA 寄存器只能通过 DMA 来访问。所有读和写该寄存器全是 32 位宽,每个包含 4数据字节。先传输低 8 位,等等。如果需要的话,数据的存储顺序可通过 DMA 控制器来改变。 SLC_DMA_DATA 功能位如表 2.17 所示。 表 2.17 SLC NAND flash DMA 数据寄存器( SLC_DMA_DATA- 0x2002 0038) 位 描述 复位值 31:24 最后传输的字节,对
36、应高端地址。 0 23:16 第三个被传输的字节。 0 15:8 第二个被传输的字节。 0 7:0 第一个被传输的字节,对应低端地址。 0 SLC_DMA_DATA 是在 4 字触发、 5 字宽的 FIFO 缓冲。第 5 个字允许 SLC 闪存控制器在每 4字节之无需间隔继续读取闪存。 2.7 SLC NAND flash 读 /写序列 DMA 中分散 /收集链表用于初始化传输类型并传输数据和 ECC。 存取 NAND flash 块大于 256 字节需要额外的 ECC 信息的软件操作。在下面的讨论中,术语 ECCM1 指的是在两个 256 字节数据块中的首块上通过硬件计算出来的值, ECCM
37、2 则指的是在两个 256 字节数据块中的第二块上通过硬件计算的值,而 ECCS 值指的是在空闲(额外)区通过软件计算的 ECC 值。 2.7.1 使用分散/ 集中 DMA 从 SLC NAND flash 序列读一个 528 字页 1. 从 CPU( SLC_CFG = 0X1E, SLC_IEN = 0x1, SLC_TAC = 依赖时钟频率)设置 SLC NAND 闪存控制器。只需要在复位后设置 SLC NAND 闪存控制器。 2. 从 CPU 配置 DMA 控制器和通道设置,它应该使用分散 /集中链表模式。 3. 从 CPU 通过写 SLC_CMD( SLC_CMD = 0x00)来发
38、送一个页读命令。 SLC_CMD 寄存器缓冲,因此 AHB 总线不会等待此写操作。 4. 从 CPU 通过写 SLC_ADDR(四地址写) ( SLC_ADDR = 列地址, SLC_ADDR = 行地址 1,SLC_ADDR = 行地址 2 , SLC_ADDR = 行地址 3 )来发送读地址命令。SLC_ADDR 寄存器缓冲。AHB 将引发 CPU 等待如果缓冲区装满的话。 5. 从 CPU 写传输计数到 SLC_TC 来触发读( SLC_TC = 0x210)。 6. SLC NAND 闪存控制器采样 RDY 来等待 NAND 闪存在读取连续的数据之前进入就绪并请求 DMA 控制器来传输
39、数据和计算 ECC 到储存器。 7. 当读页完成时, DMA 控制器发一个中断给 CPU。 All Rights Reserved, Copyright (c) Honphy Lin Limited 12/16 Basic Development Document NAND Flash 版本号 1.0 2009 年 12 月 06 日 8. CPU 从空闲 /额外数据区计算 ECCS。 9. CPU 使用从额外区读取的 ECC 值来计算 ECCM1、 ECCM2 以及 ECCS。 2.7.1.1 DMA 功能 表 2.18 在 NAND 闪存读 512 字节之间的分散 /聚集 DMA 功能 功
40、能 主区 512 字节 额外区 16 字节 数据传输 数据块 1 ECCM1 数据块 2 ECCM2 额外区数据 链表对象 LLI1 LL12 LLI3 LLI4 LLI5 使用的请求信号 BREQx16 SREQ BREQx16 SREQ BREQx1 LLI1 传输数据块 1 到存储器。 LLI2 从 SLC_ECC 传输数据块 1 的 ECC 到存储器。 LLI3 传输数据块 2 到存储器。 LLI4 从 SLC_ECC 传输数据块 2 的 ECC 到存储器。 LLI5 传输额外区到存储器,并在完成时给 CPU 一个中断。 2.7.2 使用分散/ 集中 DMA 从 SLC NAND fl
41、ash 序列写一个 528 字页 1. CPU 计算额外区的 ECCS。 2. 从 CPU 设置 SLC NAND 闪存控制器。 3. 从 CPU 配置 DMA 控制器和通道设置,它应该使用分散 /集中链表模式。 4. 从 CPU 通过写 SLC_CMD 来发送一个页写命令。 5. 从 CPU 写 SLC_ADDR(四地址)来发送写地址命令。 6. 从 CPU 写传输计数到 SLC_TC 来触发写。 7. 写编程命令到 SLC_CMD 。 8. SLC NAND 闪存控制器采样 RDY 并等待直到 NAND 闪存就绪。在此之后, DMA 请求断言。 DMA 控制器将进入链表且另一个 DMA_B
42、REQ 断言请求一个 DMA 并保存 ECCM1 。在进入链表之后,将继续传输数据块 2 。在此块中最后的请求信号是 DMA_BREQ,在此后 DMA 控制器将进入链表且另一个 DMA_BREQ 断言请求一个 DMA 读并保存 ECCM2。在此后 DMA 控制器将进入链表并完成空闲区的传输。 9. 当页操作完成, SLC NAND 闪存控制器发送编程命令到 NAND 闪存。 10. SLC NAND 闪存控制器发送一个中断在 NAND 闪存完成( RDY 变高)中编程序列完成时。 11. CPU 写读状态命令到 SLC_CMD 并检测编程序列的结果。 2.7.2.1 DMA 功能 表 2.19
43、 在 NAND 闪存写 512 字节之间的分散 /聚集 DMA 功能 功能 主区 512 字节 额外区 16 字节 数据传输 数据块 1 ECCM1 数据块 2 ECCM2 ECCS 额外区数据 链表对象 LLI1 LL12 LLI3 LLI4 LLI5 使用的请求信号 BREQx16 SREQ BREQx16 SREQ BREQx1 LLI1 传输数据块 1 到存储器。 LLI2 从 SLC_ECC 传输数据块 1 的 ECC 到存储器。 LLI3 传输数据块 2 到存储器。 LLI4 从 SLC_ECC 传输数据块 2 的 ECC 到存储器。 LLI5 传输额外区复位到存储器。 All R
44、ights Reserved, Copyright (c) Honphy Lin Limited 13/16 Basic Development Document NAND Flash 版本号 1.0 2009 年 12 月 06 日 2.8 错误检查和纠正 主区 ECC 产生通过硬件完成且基于 256 字节的数据块。要在一个 256 字节的数据块中探测并修复一位错误,需要 6 列奇偶位和 8 行奇偶位。 在主区写期间, ECC 硬件计算 FIFO 和闪存之间数据流的行奇偶 ( LP0-LP7) 和列奇偶 ( CP0-CP5)。每 256字节数据块的 ECC 必须回读并存储在额外数据接口的正确
45、位置,之后被编程到额外区。 在主区读期间,每个 256 字节数据块的新 ECC 行奇偶( LP0 - LP7)和列奇偶( CP0 CP5)被生成并存储在存储器中。软件必须为当前读取页的额外区中的 ECC 进行检测。如果一个错误被探测到,软件必须修改数据为正确的或做其它响应。 额外区中数据的 ECC 产生不是自动完成的。 整个额外区必须在存储器被编程为 NAND 闪存之前建构好。软件产生额外区 ECC 并存储 ECC 到额外数据结构正确位置的存储器中。当额外区数据在内存储器完成(包括主和额外区的 ECC) ,带有生成 ECC 的数据被编程至 NAND 闪存。 在额外区读期间,数据被读出且软件计算
46、它们的 ECC。 在下面的讨论中,术语 ECCM1 指的是在两个 256 字节数据块中的首块上通过硬件计算出来的值, ECCM2 则指的是在两个 256 字节数据块中的第二块上通过硬件计算的值,而 ECCS 值指的是在空闲(额外)区通过软件计算的 ECC 值。 2.8.1 如何在一个 256 字节数据块上生成 ECC 码 列奇偶校验是针对全部数据块作为处理数据字节来计算的。选择每数据字节位添加至先前每列奇偶校验位值。 列奇偶校验位的公式是: CP00 = 位 7 EXOR 位 5 EXOR 位 3 EXOR 位 1 EXOR CP00 CP01 = 位 6 EXOR 位 4 EXOR 位 2
47、EXOR 位 0 EXOR CP01 CP02 = 位 7 EXOR 位 6 EXOR 位 3 EXOR 位 2 EXOR CP02 CP03 = 位 5 EXOR 位 4 EXOR 位 1 EXOR 位 0 EXOR CP03 CP04 = 位 7 EXOR 位 6 EXOR 位 5 EXOR 位 4 EXOR CP04 CP05 = 位 3 EXOR 位 2 EXOR 位 1 EXOR 位 0 EXOR CP05 行奇偶校验是针对全部数据块作为处理数据字节来计算的。如果一个字节位数总和为 0,列奇偶校验在它重新计算时不会改变。一个字节位数总和是: Dall = 位 7 EXOR 位 6 E
48、XOR 位 5 EXOR 位 4 EXOR 位 3 EXOR 位 2 EXOR 位 1 EXOR 位 0 16 行奇偶位( LP15-LP00)是从数据 256 字节计算得到的。一个 8 位计数器计数数据字节,此计数器的位被用作为列奇偶位的掩码。每个新数据字节计算器按 1 递增。列奇偶校验通过初始化所有列奇偶位为 0 来计算,读每个字节,计算字节和( Dall) ,并在它们通过相应的计算器位使能时添加 Dall 到列奇偶位。 列奇偶位公式是: LP00 = LP00 EXOR (Dall AND Counter_bit0) LP01 = LP01 EXOR (Dall AND Counter_
49、bit0) LP02 = LP02 EXOR (Dall AND Counter_bit1) LP03 = LP03 EXOR (Dall AND Counter_bit1) LP04 = LP04 EXOR (Dall AND Counter_bit2) LP05 = LP05 EXOR (Dall AND Counter_bit2) All Rights Reserved, Copyright (c) Honphy Lin Limited 14/16 Basic Development Document NAND Flash 版本号 1.0 2009 年 12 月 06 日 LP06 = LP06 EXOR (Dall AND Counter_bit3) LP07 = LP07 EXOR (Dall AND Counter_bit3) LP08 = LP08 EXOR (Dall AND Counter_bit4) LP09 = LP09 EXOR (Dall AND Counter_bit4) LP10 = LP10 EXOR (Dall AND Counter_bit5) LP11 = LP11 EXOR (Dall AND C