一、了解NAND Flash
Flash即是存儲芯片的一種,其結合了ROM和RAM的特點,既具備電可擦除編程的性能,又可以快速讀取數據,數據不會因斷電丟失。目前市面上Flash主要有NOR Flash和NAND Flash。
簡單的理解就是,NOR Flash具有隨機存取和隨字節執行寫操作的能力,即可以訪問到存儲器內部的任意一個字節,且具有讀取速度快等特點,它占據1MB—16MB閃存的大部分市場,根據其讀取數據速度快的特點主要應用在代碼存儲;而NAND Flash以“頁”為單位進行對數據的讀寫操作,且具有寫入和擦除速度快等特點,它應用在8MB—256MB的產品中,根據其特點主要應用在數據存儲上。
以型號HY27UF081G2A的NAND Flash芯片為例,其總線寬度為8bit,總內存大小為1Gbit(即128MB),共分為1024塊(Block),每塊又分為64頁(Page),每頁共2KB(main memory)+64B(spare memory),main memory用來存放數據,spare memory用來標記已壞的塊區和保存對main memory的ECC校驗碼等(正常情況下不用)。更多的HY27UF081G2A資料參照相關Datasheet。
二、了解HY27UF081G2A芯片引腳功能和NAND Flash接口時序及控制命令
1、引腳說明
圖1 引腳圖
|
圖2 引腳名稱
|
2、地址周期
圖3 地址周期
|
其中A10—A0表示頁內地址偏移(表示0—2047字節,1頁大小即為2K)
A11表示上半頁或者下半頁(這位程序員無需關心,決定A10—A0時也間接決定了A11)
A17—A12表示頁地址(表示0—63頁)
A27—A18表示塊地址(表示0—1023塊)
由于NAND Flash訪問的單位是“頁”,設置訪問地址時只需要確定A27—A12的值即可確定到某一頁,如果要從頁內的某一位置開始訪問,則根據需要設置A10—A0位來確定從頁內第幾個字節開始訪問,如:要訪問存儲空間為第3塊的第5頁,且從第100字節開始進行訪問,則對應的4個Cycle周期的地址信號為:1 st :0x64 , 2 nd :0x00 , 3 rd :0xC5 , 4th :0x00
3、了解控制命令,如下所示
圖4 控制命令
|
4、了解接口時序,對該存儲器進行訪問操作有讀取芯片ID、讀頁數據、寫頁數據,塊擦除等共有13種,每種不同的操作對應不用的接口時序,此處只例舉其中的4種操作:讀取芯片ID、讀頁數據、寫頁數據、塊擦除相應的接口時序圖,更多操作參閱其Datasheet。
圖5 讀取芯片ID時序
|
圖6 讀取一頁數據
|
圖7 寫一頁數據(頁編程)
|
圖8 塊擦除
|
同時應注意一些時序參數,如在上幾幅時序圖中出現的tAR(ALE至~RE的延時),tCLR(CLE至~RE的延時)等等,這些時間參數都有不同的取值范圍(ns級別),時序圖中出現的Col Add1、Col Add2為列地址表示頁內地址偏移,對應4個Cycle地址中的第1、第2個,Row Add1、Row Add2為行地址標識某塊某頁地址,對應4個Cycle地址中的第3、第4個。更多詳細資料參見相關Datasheet。
三、STM32F10x增強型控制器的FSMC模塊
FSMC(可變靜態存儲控制器)是STM32系列微控制器采用的一種新型的存儲器擴展技術,可根據系統的需要方便的進行不用類型大容量靜態存儲器的擴展;簡單的理解FSMC模塊可對多種外接存儲器進行控制,其主要包括NOR Flash、NAND Flash、PC卡,下面對訪問NANDFlash介紹。
1、STM32F10x控制器與HY27UF081G2A的對接
先看STM32F10x控制器提供的NAND Flash接口(這里為8位的NAND閃存)
圖9 STM32F10x控制器的NAND Flash接口
|
接口各信號對應的GPIO口為:
A[17] : PD12
A[16] : PD11
D[0:7] : PD14,PD15,PD0,PD1,PE7,PE8,PE9,PE10
NCE[x] : 這里使用NCE[2],對應GPIO口為PD7
NOE(=NER) : PD4
NWE : PD5
NWAIT/INT[3:2] : PD6(根據情況使用該引腳信號,這里不使用)
結合HY27UF081G2A的引腳功能說明,STM32與HY27UF081G2A的連線方式選擇如下:
STM32F10x的NAND接口 HY27UF081G2A引腳
D[0:7]------------------------------------------IO0~IO7
A[17]-------------------------------------------ALE
A[16]-------------------------------------------CLE這里使用PG6接到R/~B,在檢測NAND Flash
NEC[2]------------------------------------------~CE
NOE---------------------------------------------~RE
NWE--------------------------------------------~WE
PG6---------------------------------------------R/~B(是否忙時直接讀取PG6引腳上的電平來判斷)
2、NAND地址映像及功能介紹
圖10 存儲器映像和時序寄存器(這里只用塊2來控制訪問NAND Flash)
|
通用和屬性空間又可以在低256K字節部分畫分為三個區
圖11 存儲塊選擇
|
應用軟件使用這三個區訪問NAND Flash存儲器:
發送命令至NAND Flash:對命令區任意地區寫入命令即可。
指定NAND Flash的地址:對地址區任意地址寫入地址命令即可,一個NAND地址有4或5個字節(這里使用的HY27UF081G2A芯片為4個字節),需要連續地執行對地址區的寫才能輸出完整的操作地址。
讀寫數據:軟件只需對數據區任意一個地址寫入或讀出數據即可。
注:因為NAND Flash存儲器自動累加其內部的操作地址,讀寫數據時沒有必要變換數據區的地址,即不必對連續的地址區操作;應用軟件使用這三個區進行訪問NAND Flash之前要先完成對相應的管理寄存器的初始化配置,下面介紹相應的管理配置寄存器。
3、STM32的NAND Flash存儲器塊通過以下一組寄存器來管理配置
控制寄存器:FSMC_PCRx
中斷狀態寄存器:FSMC_SRx
ECC寄存器:FSMC_ECCRx
通用存儲器空間的時序寄存器:FSMC_MEMx
屬性存儲器空間的時序寄存器:FSMC_PATTx
I/O空間的時序寄存器:FSMC_PIOx
注:這里用的是塊2部分,因此上面寄存器中的x=2。
對于要只控制NAND Flash存儲器,上面的三個時序寄存器中只用到FSMC_MEMx,配置該寄存器來控制NAND通用存儲空間的訪問時序,該寄存器中保存著訪問時序的4個時間參數(MEMsSET+1、MEMxHIZ+1、MEMxWAIT+1、MEMxHOLD+1),每個時間參數的具體說明可參閱STM32相應Datasheet。訪問時序圖如下:
圖12 STM32的NAND通用存儲空間的訪問時序
|
對NAND Flash的簡單控制訪問(讀、寫、擦除等)這里只需要配置FSMC_PCRx和FSMC_MEMx這兩個寄存器就夠了,對NAND Flash復雜的控制訪問(檢測壞塊、ECC校驗等)此處不做研究。FSMC_PCRx和FSMC_MEMx寄存器功能參閱STM32相關Datasheet。
四、STM32F10x控制器訪問HY27UF081G2A過程
針對于簡單的讀、寫、擦除等訪問,則過程為:
1、管理寄存器FSMC_PCRx和FSMC_MEMx初始化
2、通過訪問通用空間的命令區、數據區、地址區完成對NAND Flash的讀、寫、擦除等操作。
軟件實現過程:(在此之前要完成系統時鐘配置、相應的總線時鐘使能、相應GPIO口的初始化工作,這里不再進行說明)
1、管理寄存器FSMC_PCRx和FSMC_MEMx初始化
FSMC_PCRx = 0x00060048;
(設置ECC頁面大小2048字節、ALE至~RE的延時為1個HCLK,CLE至~RE的延時為1個HCLK,使能ECC電路,設置總線寬度為8位,設置存儲器類型為NAND Flash,關閉模塊功能,關閉模塊等待功能)
FSMC_MEMx = 0x01020301; //設置MEMsSET+1 = 4個HCLK、MEMxHIZ+1 = 3個HCLK、
//MEMxWAIT+1 = 4個HCLK、MEMxHOLD+1 = 4個HCLK
FSMC_PCRx |= 0x00000002; //使能模塊功能