NAND
文章目錄
NAND
一、FLASH閃存是什么?
二、SD NAND Flash
三、STM32例程
一、FLASH閃存是什么?
簡(jiǎn)介
FLASH閃存是屬于內(nèi)存器件的一種,“Flash”。閃存則是一種非易失性( Non-Volatile )內(nèi)存,在沒(méi)有電流供應(yīng)的條件下也能夠長(zhǎng)久地保持?jǐn)?shù)據(jù),其存儲(chǔ)特性相當(dāng)于硬盤(pán),這項(xiàng)特性正是閃存得以成為各類(lèi)便攜型數(shù)字設(shè)備的存儲(chǔ)介質(zhì)的基礎(chǔ)。
各類(lèi) DDR 、 SDRAM 或者 RDRAM 都屬于揮發(fā)性內(nèi)存,只要停止電流供應(yīng)內(nèi)存中的數(shù)據(jù)便無(wú)法保持,因此每次電腦開(kāi)機(jī)都需要把數(shù)據(jù)重新載入內(nèi)存。
閃存則是一種非易失性( Non-Volatile )內(nèi)存,在沒(méi)有電流供應(yīng)的條件下也能夠長(zhǎng)久地保持?jǐn)?shù)據(jù),其存儲(chǔ)特性相當(dāng)于硬盤(pán),這項(xiàng)特性正是閃存得以成為各類(lèi)便攜型數(shù)字設(shè)備的存儲(chǔ)介質(zhì)的基礎(chǔ)。
分類(lèi)
NOR和NAND是市場(chǎng)上兩種主要的非易失閃存技術(shù)。
在1984年,東芝公司的發(fā)明人舛岡富士雄首先提出了快速閃存存儲(chǔ)器(此處簡(jiǎn)稱閃存)的概念。與傳統(tǒng)電腦內(nèi)存不同,閃存的特點(diǎn)是NVM,其記錄速度也非???。
Intel是世界上第一個(gè)生產(chǎn)閃存并將其投放市場(chǎng)的公司。1988年,公司推出了一款256K bit閃存芯片。它如同鞋盒一樣大小,并被內(nèi)嵌于一個(gè)錄音機(jī)里。後來(lái),Intel發(fā)明的這類(lèi)閃存被統(tǒng)稱為NOR閃存。它結(jié)合EPROM和EEPROM兩項(xiàng)技術(shù),并擁有一個(gè)SRAM接口。
第二種閃存稱為NAND閃存。它由日立公司于1989年研制,并被認(rèn)為是NOR閃存的理想替代者。NAND閃存的寫(xiě)周期比NOR閃存短90%,它的保存與刪除處理的速度也相對(duì)較快。NAND的存儲(chǔ)單元只有NOR的一半,在更小的存儲(chǔ)空間中NAND獲得了更好的性能。鑒于NAND出色的表現(xiàn),它常常被應(yīng)用于諸如CompactFlash、SmartMedia、 SD、 MMC、 xD、 and PC cards、USB sticks等存儲(chǔ)卡上。
NAND 閃存的存儲(chǔ)單元采用串行結(jié)構(gòu),存儲(chǔ)單元的讀寫(xiě)是以頁(yè)和塊為單位來(lái)進(jìn)行(一頁(yè)包含若干字節(jié),若干頁(yè)則組成儲(chǔ)存塊, NAND 的存儲(chǔ)塊大小為 8 到 32KB ),這種結(jié)構(gòu)最大的優(yōu)點(diǎn)在于容量可以做得很大,超過(guò) 512MB 容量的 NAND 產(chǎn)品相當(dāng)普遍, NAND 閃存的成本較低,有利于大規(guī)模普及。
特點(diǎn)
性能
flash閃存是非易失存儲(chǔ)器,可以對(duì)稱為塊的存儲(chǔ)器單元塊進(jìn)行擦寫(xiě)和再編程。任何flash器件的寫(xiě)入操作只能在空或已擦除的單元內(nèi)進(jìn)行,所以大多數(shù)情況下,在進(jìn)行寫(xiě)入操作之前必須先執(zhí)行擦除。NAND器件執(zhí)行擦除操作是十分簡(jiǎn)單的,而NOR則要求在進(jìn)行擦除前先要將目標(biāo)塊內(nèi)所有的位都寫(xiě)為1。
由于擦除NOR器件時(shí)是以64~128KB的塊進(jìn)行的,執(zhí)行一個(gè)寫(xiě)入/擦除操作的時(shí)間為5s,與此相反,擦除NAND器件是以8~32KB的塊進(jìn)行的,執(zhí)行相同的操作最多只需要4ms。
執(zhí)行擦除時(shí)塊尺寸的不同進(jìn)一步拉大了NOR和NADN之間的性能差距,統(tǒng)計(jì)表明,對(duì)于給定的一套寫(xiě)入操作(尤其是更新小文件時(shí)),更多的擦除操作必須在基于NOR的單元中進(jìn)行。這樣,當(dāng)選擇存儲(chǔ)解決方案時(shí),設(shè)計(jì)師必須權(quán)衡以下的各項(xiàng)因素。
● NOR的讀速度比NAND稍快一些。
● NAND的寫(xiě)入速度比NOR快很多。
● NAND的4ms擦除速度遠(yuǎn)比NOR的5s快。
● 大多數(shù)寫(xiě)入操作需要先進(jìn)行擦除操作。
● NAND的擦除單元更小,相應(yīng)的擦除電路更少。
可靠性
采用flash介質(zhì)時(shí)一個(gè)需要重點(diǎn)考慮的問(wèn)題是可靠性。對(duì)于需要擴(kuò)展MTBF的系統(tǒng)來(lái)說(shuō),Flash是非常合適的存儲(chǔ)方案。可以從壽命(耐用性)、位交換和壞塊處理三個(gè)方面來(lái)比較NOR和NAND的可靠性。
耐用性
在NAND閃存中每個(gè)塊的最大擦寫(xiě)次數(shù)是一百萬(wàn)次,而NOR的擦寫(xiě)次數(shù)是十萬(wàn)次。NAND存儲(chǔ)器除了具有10比1的塊擦除周期優(yōu)勢(shì),典型的NAND塊尺寸要比NOR器件小8倍,每個(gè)NAND存儲(chǔ)器塊在給定的時(shí)間內(nèi)的刪除次數(shù)要少一些。
易于使用
可以非常直接地使用基于NOR的閃存,可以像其他存儲(chǔ)器那樣連接,并可以在上面直接運(yùn)行代碼。
由于需要I/O接口,NAND要復(fù)雜得多。各種NAND器件的存取方法因廠家而異。
在使用NAND器件時(shí),必須先寫(xiě)入驅(qū)動(dòng)程序,才能繼續(xù)執(zhí)行其他操作。向NAND器件寫(xiě)入信息需要相當(dāng)?shù)募记?因?yàn)樵O(shè)計(jì)師絕不能向壞塊寫(xiě)入,這就意味著在NAND器件上自始至終都必須進(jìn)行虛擬映射。
其他作用
驅(qū)動(dòng)還用于對(duì)DiskOnChip產(chǎn)品進(jìn)行仿真和NAND閃存的管理,包括糾錯(cuò)、壞塊處理和損耗平衡。
虛擬化
FLASH閃存是一種內(nèi)存技術(shù),與RAM不同,在斷電時(shí)它仍舊可以保留所存儲(chǔ)的信息。盡管FLASH閃存在執(zhí)行讀寫(xiě)操作時(shí)并不像RAM那樣快,但性能遠(yuǎn)遠(yuǎn)高于典型的硬盤(pán)。更為重要的是,F(xiàn)LASH閃存訪問(wèn)數(shù)據(jù)時(shí)幾乎不存在任何時(shí)間延遲。FLASH閃存技術(shù)非常適合隨機(jī)I/O,而虛擬服務(wù)器環(huán)境中恰恰存在大量的隨機(jī)I/O。
對(duì)FLASH閃存主要的關(guān)注點(diǎn)之一是其執(zhí)行寫(xiě)操作的方式。FLASH閃存可以執(zhí)行的寫(xiě)操作次數(shù)有限,這意味著FLASH閃存廠商需要開(kāi)發(fā)復(fù)雜的控制器技術(shù),對(duì)寫(xiě)入FLASH閃存模塊的方式進(jìn)行管理,確保每個(gè)FLASH閃存單元接收相同的寫(xiě)請(qǐng)求。
目前有三種類(lèi)型的FLASH閃存,耐久性各不相同。單階存儲(chǔ)單元(SLC)FLASH閃存在每個(gè)單元寫(xiě)一位數(shù)據(jù),耐久性最好。多階存儲(chǔ)單元(MLC)FLASH閃存在每個(gè)單元寫(xiě)多位數(shù)據(jù),耐久性排名第二。三階存儲(chǔ)單元(TLC)在每個(gè)單元寫(xiě)三位數(shù)據(jù),耐久性最差。每個(gè)單元寫(xiě)入的數(shù)據(jù)位越多意味著每個(gè)單元的容量越高,每GB的成本越低,同樣意味著平均壽命更短。
SLC是數(shù)據(jù)中心標(biāo)準(zhǔn),但控制器技術(shù)的不斷優(yōu)化使得MLC被大多數(shù)用例所接受。尤其是在采用了某種方式的數(shù)據(jù)保護(hù),比如鏡像或者RAID或者使用了FLASH閃存層時(shí)。
二、SD NAND Flash
我以貼片式TF卡“CSNP32GCR01-AOW”型號(hào)為例介紹
芯片樣子都一樣,這里隨便放一張
概述
CSNP32GCR01-AOW是基于NAND閃存和SD控制器的32Gb密度嵌入式存儲(chǔ)。該產(chǎn)品與原始NAND相比,它有許多優(yōu)點(diǎn),包括嵌入式壞塊管理和更強(qiáng)的嵌入式ECC。即使在異常斷電的情況下,它仍然可以安全地保存數(shù)據(jù)。
特點(diǎn)
接口:標(biāo)準(zhǔn)SD規(guī)范2.0版,帶有1-I/O和4-I/O。
電源:Vcc=2.7V-3.6V
默認(rèn)模式:可變時(shí)鐘頻率0-25 MHz,最高12.5 MB/秒接口速度(使用4條并行數(shù)據(jù)線)
高速模式:可變時(shí)鐘頻率0-50 MHz,最高25 MB/秒接口速度(使用4條并行數(shù)據(jù)線)
工作溫度:-25°C至+85°C
儲(chǔ)存溫度:-40°C至+85°C
備用電流:<250uA
開(kāi)關(guān)功能命令支持高速、電子商務(wù)和未來(lái)功能
內(nèi)存字段錯(cuò)誤的糾正
內(nèi)容保護(hù)機(jī)制-符合SDMI標(biāo)準(zhǔn)的最高安全性。
SD NAND的密碼保護(hù)(CMD42-鎖定和解鎖)
使用機(jī)械開(kāi)關(guān)的寫(xiě)保護(hù)功能
內(nèi)置寫(xiě)保護(hù)功能(永久和臨時(shí))
特定于應(yīng)用程序的命令
3. 引腳分配
4.數(shù)據(jù)傳輸模式
5. SD NAND寄存器
SDNAND接口中定義了六個(gè)寄存器:OCR、CID、CSD、RCA、DSR和SCR。這些信息只能通過(guò)
相應(yīng)的命令。OCR、CID、CSD和SCR寄存器攜帶SDNAND/內(nèi)容特定信息,而RCA、DSR寄存器是存儲(chǔ)實(shí)際配置參數(shù)的配置寄存器(這里選取倆個(gè)寄存器進(jìn)行展示)。
CID register
SCR register
通電圖
通電時(shí)間
Tips: RDAT和RCMD(10K~100 kΩ)是上拉電阻器,當(dāng)SDNAND處于a狀態(tài)時(shí),保護(hù)CMD和DAT線路不受總線浮動(dòng)的影響;在高阻抗模式,即使主機(jī)僅在SD模式下使用SDNAND作為1位模式,主機(jī)也應(yīng)通過(guò)RDAT上拉所有DAT0-3線。它是建議VCC上有2.2uF電容。RCLK參考0~120Ω。
三、STM32例程
1. 初始化
SD_Error SD_Init(void)
{
uint32_t i = 0;
/*!< Initialize SD_SPI */
GPIO_Configuration();
/*!< SD chip select high */
SD_CS_HIGH();
/*!< Send dummy byte 0xFF, 10 times with CS high */
/*!< Rise CS and MOSI for 80 clocks cycles */
for (i = 0; i <= 9; i++)
{
/*!< Send dummy byte 0xFF */
SD_WriteByte(SD_DUMMY_BYTE);
}
//獲取卡的類(lèi)型,最多嘗試10次
i=0;
do
{
/*------------Put SD in SPI mode--------------*/
/*!< SD initialized and set to SPI mode properly */
SD_GoIdleState();
/*Get card type*/
SD_GetCardType();
}while(SD_Type == SD_TYPE_NOT_SD && i++ >10);
//不支持的卡
if(SD_Type == SD_TYPE_NOT_SD)
return SD_RESPONSE_FAILURE;
return SD_GetCardInfo(&SDCardInfo);
}
2. 單數(shù)據(jù)塊測(cè)試
void SD_SingleBlockTest(void)
{
/*------------------- Block Read/Write --------------------------*/
/* Fill the buffer to send */
Fill_Buffer(Buffer_Block_Tx, BLOCK_SIZE, 0x320F);
if (Status == SD_RESPONSE_NO_ERROR)
{
/* Write block of 512 bytes on address 0 */
Status = SD_WriteBlock(Buffer_Block_Tx, 0x00, BLOCK_SIZE);
/* Check if the Transfer is finished */
}
if (Status == SD_RESPONSE_NO_ERROR)
{
/* Read block of 512 bytes from address 0 */
Status = SD_ReadBlock(Buffer_Block_Rx, 0x00, BLOCK_SIZE);
}
/* Check the correctness of written data */
if (Status == SD_RESPONSE_NO_ERROR)
{
TransferStatus1 = Buffercmp(Buffer_Block_Tx, Buffer_Block_Rx, BLOCK_SIZE);
}
if(TransferStatus1 == PASSED)
{
LED2_ON;
printf("Single block 測(cè)試成功!\n");
}
else
{
LED1_ON;
printf("Single block 測(cè)試失敗,請(qǐng)確保SD卡正確接入開(kāi)發(fā)板,或換一張SD卡測(cè)試!\n");
}
}
3. 多數(shù)據(jù)塊測(cè)試
void SD_MultiBlockTest(void)
{
/*--------------- Multiple Block Read/Write ---------------------*/
/* Fill the buffer to send */
Fill_Buffer(Buffer_MultiBlock_Tx, MULTI_BUFFER_SIZE, 0x0);
if (Status == SD_RESPONSE_NO_ERROR)
{
/* Write multiple block of many bytes on address 0 */
Status = SD_WriteMultiBlocks(Buffer_MultiBlock_Tx, 0x00, BLOCK_SIZE, NUMBER_OF_BLOCKS);
/* Check if the Transfer is finished */
}
if (Status == SD_RESPONSE_NO_ERROR)
{
/* Read block of many bytes from address 0 */
Status = SD_ReadMultiBlocks(Buffer_MultiBlock_Rx, 0x00, BLOCK_SIZE, NUMBER_OF_BLOCKS);
/* Check if the Transfer is finished */
}
/* Check the correctness of written data */
if (Status == SD_RESPONSE_NO_ERROR)
{
TransferStatus2 = Buffercmp(Buffer_MultiBlock_Tx, Buffer_MultiBlock_Rx, MULTI_BUFFER_SIZE);
}
if(TransferStatus2 == PASSED)
{
LED2_ON;
printf("Multi block 測(cè)試成功!");
}
else
{
LED1_ON;
printf("Multi block 測(cè)試失敗,請(qǐng)確保SD卡正確接入開(kāi)發(fā)板,或換一張SD卡測(cè)試!");
}
}
4. 狀態(tài)緩沖
TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint32_t BufferLength)
{
while (BufferLength--)
{
if (*pBuffer1 != *pBuffer2)
{
return FAILED;
}
pBuffer1++;
pBuffer2++;
}
return PASSED;
}
void Fill_Buffer(uint8_t *pBuffer, uint32_t BufferLength, uint32_t Offset)
{
uint16_t index = 0;
/* Put in global buffer same values */
for (index = 0; index < BufferLength; index++)
{
pBuffer[index] = index + Offset;
}
}
了解產(chǎn)品更多詳情:官網(wǎng) http://www.longsto.com/