以Samsung NAND Flash器件K9F1208為例,對(duì)比NAND Flash和NOR Flash的異同;介紹大容量NAND Flash在uPSD3234A增強(qiáng)型單片機(jī)系統(tǒng)中的應(yīng)用,完成了硬件接口設(shè)計(jì)和軟件設(shè)計(jì),并給出硬件連接圖和部分程序代碼。
1 NAND FlaSh和NOR Flash
閃存(Flash Memory)由于其具有非易失性、電可擦除性、可重復(fù)編程以及高密度、低功耗等特點(diǎn),被廣泛地應(yīng)用于手機(jī)、MP3、數(shù)碼相機(jī)、筆記本電腦等數(shù)據(jù)存儲(chǔ)設(shè)備中。NAND Flash和NOR Flash是目前市場(chǎng)上兩種主要的非易失閃存芯片。與NOR Flash相比,NAND Flash在容量、功耗、使用壽命等方面的優(yōu)勢(shì)使其成為高數(shù)據(jù)存儲(chǔ)密度的理想解決方案。NOR Flash的傳輸效率很高,但寫入和擦除速度較低;而NAND Flash以容量大、寫速度快、芯片面積小、單元密度高、擦除速度快、成本低等特點(diǎn),在非易失性類存儲(chǔ)設(shè)備中顯現(xiàn)出強(qiáng)勁的市場(chǎng)競(jìng)爭(zhēng)力。
結(jié)構(gòu):NOR Flash為并行,NAND Flash為串行。
總線:NOR Flash為分離的地址線和數(shù)據(jù)線,而NANDFlash為復(fù)用的。
尺寸:典型的NAND Flash尺寸為NOR Flash尺寸的1/8。
壞塊:NAND器件中的壞塊是隨機(jī)分布的,需要對(duì)介質(zhì)進(jìn)行初始化掃描以發(fā)現(xiàn)壞塊,并將壞塊標(biāo)記為不可用。
位交換:NAND Flash中發(fā)生的次數(shù)要比NOR Flash多,建議使用NAND閃存時(shí),同時(shí)使用EDC/ECC算法。
使用方法:NOR Flash是可在芯片內(nèi)執(zhí)行(XIP,eXecute In Place),應(yīng)用程序可以直接在FIash閃存內(nèi)運(yùn)行,不必再把代碼讀到系統(tǒng)RAM中;而NAND Flash則需I/O接口,因此使用時(shí)需要寫入驅(qū)動(dòng)程序。
通過(guò)以上的分析和比較,NAND Flash更適合于大容量數(shù)據(jù)存儲(chǔ)的嵌入式系統(tǒng)。本設(shè)計(jì)選用Samsung公司生產(chǎn)的NAND Flash存儲(chǔ)器芯片K9F1208作為存儲(chǔ)介質(zhì),并應(yīng)用在基于uPSD3234A增強(qiáng)型8051單片機(jī)的嵌入式系統(tǒng)中。
2 uPSD3234A簡(jiǎn)介
uPSD3234A是由意法半導(dǎo)體公司生產(chǎn)的一款基于8052內(nèi)核的增強(qiáng)型Flash單片機(jī),其結(jié)構(gòu)如圖1所示。該單片機(jī)包含1個(gè)帶8032微控制器的Flash PSD、2塊Flash存儲(chǔ)器、SRAM、通用I/O口可編程邏輯、管理監(jiān)控功能,并可實(shí)現(xiàn)USB、I2C、ADC、DAC和PWM功能。其中,片內(nèi)8032微控制器,帶有2個(gè)標(biāo)準(zhǔn)異步通信口、3個(gè)16位定時(shí)/計(jì)數(shù)器、1個(gè)外部中斷以及JTAG ISP接口(用于在系統(tǒng)編程),一般應(yīng)用于手持設(shè)備、家用電器等領(lǐng)域中。
3 K9F1208介紹
K9F1208是Samsung公司生產(chǎn)的512 Mb(64M×8位)NAND Flash存儲(chǔ)器。該存儲(chǔ)器的工作電壓為2.7~3.6 V,內(nèi)部存儲(chǔ)結(jié)構(gòu)為528字節(jié)×32頁(yè)×4 096塊,頁(yè)大小為528字節(jié),塊大小為(16 KB+512字節(jié));可實(shí)現(xiàn)程序自動(dòng)擦寫、頁(yè)程序、塊擦除、智能的讀/寫和擦除操作,一次可以讀/寫或者擦除4頁(yè)或者塊的內(nèi)容,內(nèi)部有命令寄存器。
如圖2所示,該器件按功能可以劃分為:存儲(chǔ)陣列、輸入/輸出緩沖、命令寄存器、地址譯碼寄存器和控制邏輯產(chǎn)生。其中,命令寄存器用來(lái)確定外部設(shè)備對(duì)存儲(chǔ)器進(jìn)行操作的類型;地址譯碼寄存器用于保存被訪問(wèn)的地址并產(chǎn)生相應(yīng)的譯碼選通信號(hào)。主設(shè)備通過(guò)8位I/O端口分時(shí)復(fù)用訪問(wèn)器件命令、地址和數(shù)據(jù)寄存器,完成對(duì)芯片內(nèi)存儲(chǔ)器的訪問(wèn)。
4 K9F1208讀/寫和擦除操作的實(shí)現(xiàn)
對(duì)于K9F1208的操作主要有頁(yè)讀取和頁(yè)編程操作。圖3是NAND Flash的標(biāo)準(zhǔn)頁(yè)讀取時(shí)序圖。具體的頁(yè)讀取操作如下:發(fā)命令階段,在片選信號(hào)CE有效的情況下,首先命令允許信號(hào)CLE有效,此時(shí)寫入信號(hào)WE有效,芯片準(zhǔn)備好信號(hào)R/B置高,表示準(zhǔn)備好;同時(shí)向I/O口發(fā)送讀操作命令(0x00或0x01),表示是讀操作。
發(fā)地址階段,此時(shí)片選有效,地址允許信號(hào)ALE有效,寫入信號(hào)WE保持有效,連續(xù)發(fā)送4個(gè)地址字;K9F1208的地址寄存器接收到地址值后,R/B信號(hào)將維持“忙”一段時(shí)間,此后R/B變?yōu)闇?zhǔn)備好狀態(tài)。最后是數(shù)據(jù)輸出階段,每次讀有效信號(hào)置低有效時(shí),將會(huì)輸出一組數(shù)據(jù)。如此往復(fù)直到所有數(shù)據(jù)輸出完畢。
圖4是NAND FLash的標(biāo)準(zhǔn)頁(yè)編程時(shí)序圖。具體的頁(yè)編程操作如下:發(fā)命令階段,向I/O口發(fā)送頁(yè)編程操作第一個(gè)命令字(0x80),表示是頁(yè)編程操作。發(fā)地址階段,連續(xù)發(fā)送4個(gè)地址字,K9F1208的地址寄存器接收到地址值后,等待接收數(shù)據(jù);當(dāng)數(shù)據(jù)總線發(fā)送數(shù)據(jù)后,K9F1208連續(xù)接收數(shù)據(jù),直到接收到頁(yè)編程的第二個(gè)命令字(0x10),即結(jié)束等待接收數(shù)據(jù)的狀態(tài);
R/B信號(hào)將維持“忙”一段時(shí)間,此后R/B變?yōu)闇?zhǔn)備好狀態(tài)。最后總線上發(fā)出讀狀態(tài)命令字(0x70),則K9F1208的命令寄存器接收并響應(yīng)該命令,向I/O口發(fā)送表示操作成功的狀態(tài)數(shù)據(jù)(0x00)或表示操作失敗的狀態(tài)數(shù)據(jù)(0X01)。
5 uPSD3234A與K9F1208的連接
5.1 硬件部分
uPSD3234A的數(shù)據(jù)總線DATA0~7直接連接到K9F1208的數(shù)據(jù)線上。K9F1208的讀/寫信號(hào)是直接通過(guò)uPSD3234A的讀/寫信號(hào)驅(qū)動(dòng)的,K9F1208的ALE地址允許信號(hào)、CLE命令允許信號(hào)、片選使能信號(hào)分別由uPSD3234A的P43、P44、P45來(lái)控制,而K9F1208的R/B狀態(tài)輸出信號(hào)由uPSD3234A的P46來(lái)讀取。硬件連接如圖5所示。根據(jù)該硬件連接的情況,在驅(qū)動(dòng)過(guò)程中,可以在uPSD3234A中定義一個(gè)無(wú)效地址,通過(guò)對(duì)該無(wú)效地址進(jìn)行讀寫來(lái)控制WR和RD信號(hào)。
5.2 軟件部分
本設(shè)計(jì)的驅(qū)動(dòng)程序包括基本的操作函數(shù)和Flash操作API函數(shù)。基本的操作函數(shù)包括輸入命令值、輸入地址值、輸入數(shù)據(jù)值、讀取數(shù)據(jù)值和讀取狀態(tài)等函數(shù)。由于K9F1208是無(wú)地址的,故先定義一個(gè)外部存儲(chǔ)器的空地址來(lái)對(duì)它進(jìn)行空寫和空讀。定義的語(yǔ)句為:
xdata unsigned char rK9Fl208DATA _at_0x5000000;
根據(jù)硬件連接圖,基本API函數(shù)的程序?yàn)椋?/p>
(1) 輸入命令值函數(shù)
程序說(shuō)明:賦予P4_5為0,使得CE信號(hào)成低電平,從而片選K9F1208有效;賦予P4_4為1,使得CLE信號(hào)成高電平,從而使K9F1208的命令允許信號(hào)有效;賦予P4_3為0,使得ALE信號(hào)成低電平,從而使K9F1208的地址允許信號(hào)無(wú)效;最后對(duì)rK9F1208DATA進(jìn)行空寫命令字,使得WE信號(hào)成低電平,K9F1208的命令寄存器從數(shù)據(jù)總線接收到命令字,并執(zhí)行相應(yīng)的操作。
(2) 輸入地址值函數(shù)
程序說(shuō)明:賦予P4_5為0,使得CE信號(hào)成低電平,從而片選K9F1208有效;賦予P4_4為0,使得CLE信號(hào)成低電平,從而使K9F1208的命令允許信號(hào)無(wú)效;賦予P4_3為1,使得ALE信號(hào)成高電平,從而K9F1208的地址允許信號(hào)有效;最后對(duì)rK9F1208DATA進(jìn)行空寫地址字,使得WE的信號(hào)成低電平,K9F1208從數(shù)據(jù)總線接收到地址字,并鎖存到地址鎖存器中。
(3) 輸入數(shù)據(jù)值函數(shù)
程序說(shuō)明:賦予P4_5為0,使得CE信號(hào)成低電平,從而片選K9F1208有效;賦予P4_4為0,使得CLE信號(hào)成低電平,從而使K9F1208的命令允許信號(hào)無(wú)效;賦予P4_3為0,使得ALE信號(hào)成低電平,從而使K9F1208的地址允許信號(hào)無(wú)效;最后對(duì)rK9F1208DATA進(jìn)行空寫數(shù)據(jù),使得WE的信號(hào)成低電平,K9F1208從數(shù)據(jù)總線接收到數(shù)據(jù),并根據(jù)命令寄存器和地址鎖存器來(lái)處理接收到的數(shù)據(jù)。
(4) 讀取數(shù)據(jù)值函數(shù)
程序說(shuō)明:賦予P4_5為0,使得CE信號(hào)成低電平,從而片選K9F1208有效;賦予P4_4為0,使得CLE信號(hào)成低電平,從而K9F1208的命令允許信號(hào)無(wú)效;賦予P4_3為0,使得ALE信號(hào)成低電平,從而使K9F1208的地址允許信號(hào)無(wú)效;最后對(duì)rK9F1208DATA進(jìn)行空讀數(shù)據(jù),使得RE的信號(hào)成低電平,K9F1208會(huì)根據(jù)命令寄存器和地址鎖存器來(lái)向數(shù)據(jù)總線發(fā)送相應(yīng)的數(shù)據(jù)。
(5) 讀取狀態(tài)函數(shù)
程序說(shuō)明:只是讀取P4_6的狀態(tài),以判斷K9F1208是否“忙”。如果P4_6為高電平,則表示K9F1208不忙,返回高電平;如果P4_6為低電平,則表示K9F1208“忙”,返回高電平。
為了合理地操作K9F1208,還添加了不選中K9F1208的函數(shù),以便在頁(yè)讀取和頁(yè)編程操作后,使K9F1208不工作。程序只是讓P4_5、P4_4、P4_3為低電平,從而使得K9F1208的片選信號(hào)、命令允許信號(hào)、地址允許信號(hào)無(wú)效。宏定義語(yǔ)句如下:
#define flash_inactive( ){P4_5=0;P4_4=0;P4_3=0;)
Flash操作API函數(shù)包括復(fù)位K9F1208、驗(yàn)證K9F1208的ID號(hào)、擦除K9F1208某一扇區(qū)、湊取K9F1208某一扇區(qū)數(shù)據(jù)和寫入K9F1208某一扇區(qū)數(shù)據(jù)等函數(shù)。因?yàn)槠P(guān)系,只介紹頁(yè)讀取和頁(yè)編程函數(shù)。
圖6是讀取K9F1208某一扇區(qū)或某一頁(yè)的數(shù)據(jù)流程圖。首先,開始向K9F1208發(fā)送頁(yè)讀取命令字0x00,使得K9F1208的命令寄存器接收到命令字;然后取得要讀取扇區(qū)的地址,連續(xù)向K9F1208發(fā)送4個(gè)地址數(shù)據(jù),發(fā)送完后讀取K9F1208的R/B引腳的狀態(tài),直到K9F1208不忙(表示地址數(shù)據(jù)已接收完畢);K9F1208開始讀取該地址所指的扇區(qū),并向數(shù)據(jù)總線發(fā)送一個(gè)扇區(qū)的數(shù)據(jù),此時(shí)讀取K9F1208的數(shù)據(jù)總線,直到整頁(yè)結(jié)束。
圖7是寫入K9F1208某一扇區(qū)或一頁(yè)的數(shù)據(jù)流程圖。首先向K9F1208發(fā)送頁(yè)編程的命令字0x80,使得K9F1208的命令寄存器接收到命令字;然后取得要寫入扇區(qū)的地址,連續(xù)向K9F1208發(fā)送4個(gè)地址數(shù)據(jù),發(fā)送完后讀取K9F1208的R/B引腳的狀態(tài),直到K9F1208不忙(表示地址數(shù)據(jù)已接收完畢);
K9F1208準(zhǔn)備從數(shù)據(jù)總線接收一個(gè)扇區(qū)的數(shù)據(jù),此時(shí)向K9F1208的數(shù)據(jù)總線發(fā)送一個(gè)扇區(qū)的數(shù)據(jù),讓K9F1208接收數(shù)據(jù),并存到相應(yīng)的頁(yè)或扇區(qū)中;待發(fā)送的數(shù)據(jù)結(jié)束后,向K9F1208發(fā)送0x10 命令,使得K9F1208結(jié)束頁(yè)編程的操作;最后向K9F1208發(fā)送查詢狀態(tài)的命令字0x70,K9F1208接收到命令字后,就會(huì)向數(shù)據(jù)總線發(fā)送一個(gè)字節(jié)的數(shù)據(jù),這時(shí)讀取K9F1208的數(shù)據(jù)總線,若收到字節(jié)0x00,則表示操作成功,若收到字節(jié)0x01,則表示操作失敗。
結(jié) 語(yǔ)
本文介紹了Samsung公司K9F1208芯片特點(diǎn),并在此基礎(chǔ)上設(shè)計(jì)了基于uPSD3234A的驅(qū)動(dòng)設(shè)計(jì)。該方法對(duì)其他相關(guān)SoC中實(shí)現(xiàn)NAND Flash的控制方法設(shè)計(jì)有直接的參考意義,可廣泛應(yīng)用于需要大存儲(chǔ)容量的低端設(shè)備中。
編輯:jq
-
芯片
+關(guān)注
關(guān)注
459文章
52192瀏覽量
436258 -
鎖存器
+關(guān)注
關(guān)注
8文章
922瀏覽量
42122 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4371瀏覽量
64204
發(fā)布評(píng)論請(qǐng)先 登錄
兆易創(chuàng)新推出GD5F1GM9系列高速Q(mào)SPI NAND Flash

兆易創(chuàng)新推出GD5F1GM9系列高速Q(mào)SPI NAND Flash
【半導(dǎo)體存儲(chǔ)】關(guān)于NAND Flash的一些小知識(shí)
國(guó)產(chǎn)安路FPGA SD NAND FLASH 初步描述
DM368 NAND Flash啟動(dòng)揭秘

打開NAND Flash接口規(guī)范
NAND Flash與其他類型存儲(chǔ)器的區(qū)別
NAND閃存是什么意思
K210使用創(chuàng)世NAND flash完成火災(zāi)檢測(cè)
NAND Flash的擦寫次數(shù)介紹
NAND Flash和NOR Flash哪個(gè)更好
NAND Flash與NOR Flash:壞塊管理需求的差異解析

江波龍自研芯片進(jìn)展,2D NAND Flash/主控芯片”以小帶大”

【GD32F303紅楓派開發(fā)板使用手冊(cè)】第二十講 SPI-SPI NAND FLASH讀寫實(shí)驗(yàn)

評(píng)論