这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » AT32驱动NANDFLASH(以H27U1G8F2B为例)

共4条 1/1 1 跳转至

AT32驱动NANDFLASH(以H27U1G8F2B为例)

菜鸟
2021-06-28 19:50:12     打赏

H27U1G8F2B,是一款存储容量1Gbit(128M*8bit)的NAND FLASH。

1、H27U1G8F2B存储架构和地址分配如下图:

存储架构:分为page,block,device几个等级;

地址分配:分为列地址(也就是byte地址--A0~A11)和行地址(也就是page地址--A12~A17和block地址--A18~A27)

1624880840663180.png

2、AT32 XMC的NAND接口:

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

3、NAND FLASH的一些常用命令,如读、写、擦除。

NANDFLASH读写只有异步复用模式,没有地址线。读/写均需要特定命令。和NOR FLASH一样,写入数据前需要先擦除需要写入地址所在的块。读/写单位为page;擦除最小单位为block。具体命令见下表:

1624880885283400.png

常用命令的时序如下:

1624880916932523.png

1624880938268603.png

1624880962147263.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区域的。)

1624880988534652.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结果寄存器的有效位数不同,详见下表:

1624881005331291.png




关键词: AT32     XMC     NAND     ECC    

专家
2021-06-29 09:32:54     打赏
2楼

感谢楼主的分享,很实用了。


工程师
2021-06-29 09:32:54     打赏
3楼

感谢楼主的分享,很实用了。


工程师
2021-07-14 23:56:58     打赏
4楼

文章写的非常不错


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]