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












