本帖最后由 林堪堪 于 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)
2、AT32 XMC的NAND接口:
XMC的NAND接口分为8bit和16bit。这两者的差异仅在于data线是8/16 pin。具体如下表:
3、NAND FLASH的一些常用命令,如读、写、擦除。
NANDFLASH读写只有异步复用模式,没有地址线。读/写均需要特定命令。和NOR FLASH一样,写入数据前需要先擦除需要写入地址所在的块。读/写单位为page;擦除最小单位为block。具体命令见下表:
常用命令的时序如下:
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区域的。)
读:
①初始化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结果寄存器的有效位数不同,详见下表:
ECC的简单操作demo见附件(就是AT官方BSP包含的ECC demo,需要的话可以去AT官网下载整个bsp,有更完整的NAND相关demo)
|