[应用相关] AT32驱动NAND FLASH(以H27U1G8F2B为例)

[复制链接]
2906|1
 楼主| 林堪堪 发表于 2021-6-28 19:20 | 显示全部楼层 |阅读模式
本帖最后由 林堪堪 于 2021-12-24 16:22 编辑

H27U1G8F2B,是一款存储容量1Gbit(128M*8bit)的NAND FLASH。
1、H27U1G8F2B存储架构和地址分配如下图:
存储架构:分为page,block,device几个等级;
地址分配:分为列地址(也就是byte地址--A0~A11)和行地址(也就是page地址--A12~A17和block地址--A18~A27)

6086360d9a82da7465.png

2、AT32 XMC的NAND接口:
XMC的NAND接口分为8bit和16bit。这两者的差异仅在于data线是8/16 pin。具体如下表:
9260460d9aa9a9faa5.png


3、NAND FLASH的一些常用命令,如读、写、擦除。
NANDFLASH读写只有异步复用模式,没有地址线。读/写均需要特定命令。和NOR FLASH一样,写入数据前需要先擦除需要写入地址所在的块。读/写单位为page;擦除最小单位为block。具体命令见下表:
7813260d9aa1c4e78f.png
常用命令的时序如下:
1139060d9ab1ee3b5a.png
9841960d9ab3540fc6.png

6315960d9ab467c5e2.png

4、关于ECC纠错码
AT32的XMC BANK2/3各有一个ECC计算模块,可以在读/写一个ECCpage后生成一个ECC码,并存储在ECC结果寄存器(XMC_BK2/3ECC)。用户向NAND FLASH写数据时,可将ECC码写入NAND FLASH的spare区域,并在读取数据时读出spare区域的ECC码。后通过软件利用这两个ECC码进行一定的计算,可以矫正1 bit的错误并且检测出2 bit的错误(2bit以上错误不一定能检测)。以下为ECC操作步骤(以H27U1G8F2B为例):

写:
①初始化XMC,其中设置ECCpage= 512byte(ECCPGSIZE[2:0] = 01);
②写数据:使能ECC(ECCEN=1)往NAND FLASH写一组长度为512byte的数据等待FIFO空(FIFOE=0)读取ECC结果寄存器失能ECC(ECCEN=0)。(此操作重复4次,以发送2048byte数据和得到4个ECC值);
③写spare区域:将②步骤读取的4个ECC值写入spare区域。
按下图位置发送:64byte的spare区域的第[8:11],[24:26],[40:42],[56:58]byte。其他位置数据不做更改(0xFF)。
下图为SAMSUNG提供的一个page大小为2k+64byte的spare格式模板:(笔者搜索了网络上关于spare区域的格式,似乎没有一个行业标准,只找到了这个三星的spare区域格式定义。这个区域应该是可以使用者自行定义的。这里的示例也是按照三星的这个标准来读写spare区域的。)
1548960d9ab8d40b5e.png

读:
①初始化XMC(同写操作);
②读数据:使能ECC(ECCEN=1)从NAND FLASH读一组长度为512byte的数据等待FIFO空(FIFOE=0)读取ECC结果寄存器失能ECC(ECCEN=0)。(此操作重复4次,以接收2048byte数据和得到4个ECC值);
③读取spare区域:继续读取64byte数据,并摘取ECC段。
④将spare区域读取的ECC码与ECC结果寄存器读取的ECC码进行比较。
--如果一样则数据正确;
--如果不一样则可使用软件利用这两个ECC码,通过一定计算纠正1bit的数据/检测出2bit的错误。(更多的错误无法定位和检测,用户可选择丢弃此page数据)
另外,根据ECCpage配置大小的不同,ECC结果寄存器的有效位数不同,详见下表:

7334360d9aed42a145.png


ECC的简单操作demo见附件(就是AT官方BSP包含的ECC demo,需要的话可以去AT官网下载整个bsp,有更完整的NAND相关demo)


ECC.rar

21.68 KB, 下载次数: 15

caigang13 发表于 2021-7-1 08:39 来自手机 | 显示全部楼层
MCU外挂NAND,主要是坏块管理不好做。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

119

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部