前言:
隨著國內市場對芯片的需求日益增加,國產中高端芯片在不斷的占領國內市場甚至在國際市場都有一部分,越來越多的企業開始研究自己的芯片,這個芯片的種類繁多,功能性強大,也有一些芯片占有著很大的市場份額,有著不可取代的地位。
隨著芯片的發展存儲芯片的趨勢也開始不甘落后,有著越來越多的新型的芯片問世,這里就要提起SD NAND芯片了,市面上主流的生產廠家就是雷龍。
SD NAND的簡單介紹:
什么是SD NAND?很簡單顧名思義就是內部集成了SD卡或TF卡(這里有必要說明SD卡和TF卡除了大小不同,引腳不同之外驅動,功能等內容都是一樣的使用SD協議)功能的NAND存儲芯片。
當然,他和主流的存儲芯片不太一樣,它是遵循SD協議的芯片,下圖就是SDNAND的引腳圖。
下圖是SD卡的引腳圖。
仔細觀察就不難發現他們的引腳功能相似,SD NAND芯片在引腳上遵循SD卡的協議, SD NAND可以理解為是一種可以直接焊接在PCB上的SD卡。
常見存儲芯片的類別:
下面就要討論關于常見存儲芯片的主要用途作,和優缺點,在這里會從芯片的功能和實際使用情況來分析,如果只想了解SDNAND可以直接跳轉到“SD NAND存儲芯片”的目錄中。
在這里會以存儲芯片做比較,不和RAM存儲器比較,以比較性能和使用環境,使用協議為主。
EEPROM存儲芯片:
EEPROM存儲芯片在1978年就誕生了,在這之前經過了ROM(只讀存儲器)EPROM(紫外線可擦除存儲器)的演化,雖然現在不能成為主流的存儲芯片,但是在存儲一些簡單的數據上還是可以看到它的身影,在單片機的開發上會對簡單的數據進行存儲。
這里就以AT24C256存儲芯片來舉例,下圖是該芯片的內部結構圖 。
可以看出主要是以IIC進行數據傳輸的(在主流的EEPROM市場中還有一小部分是以SPI作為數據傳輸的),引腳排列較少,價格較為便宜,但是他們的傳輸速度較慢,存儲空間不是很大,但仍有很多的地方見到它的身影比如說主板的BIOS芯片,主要是在數據暫存,掉電保存重要數據等用途。要是和其他種類的存儲芯片比較傳輸速度和存儲空間很顯然EEPROM就有些力不從心了。
NAND類存儲芯片:
NAND Flash全名為Flash Memory,屬于非易失性存儲設備(Non-volatile Memory Device),基于浮柵(Floating Gate)晶體管設計,通過浮柵來鎖存電荷,這NAND存儲芯片指的是使用這個存儲結構的芯片,他們和EEPROM有不同的一點是存儲數據量較大內部集成度較高,記住NAND并不是存儲芯片的一種,而是芯片內部使用存儲單元的結構(統稱為NAND類存儲芯片)。
NAND類存儲芯片經常和FLASH聯系在一起,或者可以說NAND是FLASH的一種,在實際應用中很常見,下圖是SD卡簡單化的內部結構。
SD卡存儲單元是使用的FLASH,FLASH存儲器一般會采用NAND的存儲結構,NAND存儲芯片有很多優點讀寫速度快,存儲密度更高,擦寫速度更快,使用壽命更長。
一般來說NAND存儲芯片的連接通訊接口很多,比如SPI,IIC,多數據并行接口等,這個主要取決于它使用使用什么樣的控制器來對它進行存儲,另外NAND存儲技術在國內已經很成熟了,在市場上使用的較為廣泛,更是在硬件和PCB系統設計中成為了主流選擇。
EMMC存儲芯片:
說到NAND類存儲芯片就要提到EMMC芯片了,雖說EMMC只是NAND類存儲類的一種,但是EMMC芯片在PCB系統設計中卻是一個擁有很強性能的芯片,主要是針對手機平板等微型內嵌存儲芯片,從內部結構就可以看出有著更強大的控制器,有很多的EMMC都是采用NAND存儲結構。
當然強大的傳輸速度需要很強大的處理器進行連接,因此在芯片的接口上就要比普通的存儲芯片復雜很多,下面的這一張圖是EMMC存儲芯片的引腳圖。
從引腳上看Power(供電)就需要兩種不同的電壓,數據傳輸DAT[7:0]端口至少需要8個端口,CMD負責控制,CLK引腳來提供時鐘信號(最快的EMMC時鐘信號可以達到200MHZ),這種存儲器如果用性能一般點的單片機來控制會有點吃力,當然它通常是BGA封裝,所使用的引腳是很多的。
EMMC存儲芯片無論是在傳輸速度上,在存儲容量上,它的的性能都是很強大的,但同時需要很復雜的連接驅動才能使用,所以經常出現在一些較高端的電子產品上使用比如手機,平板,電腦等。
SD NAND存儲芯片:
了解了EEPROM存儲芯片和NAND芯片以及EMMC存儲芯片他們都有各自的有點,比如說現在需要一款芯片是擁有較大的存儲空間和較為簡單的存儲驅動什么樣的芯片適合呢?答案是:SD NAND。
SD NAND有著很好的一點是擁有EEPROM那樣的簡單的外部布局,使無需通過復雜的連接完成存儲功能,還擁有著EMMC的大容量存儲空間,下圖就是雷龍的CSNP4GCR01-AOW(SD NAND)芯片的內部結構圖。
通過結構圖可以看出內部主要是由SD NAND作為存儲,在芯片的輸入輸出接口部分使用的引腳和SD卡使用的是相同的協議,控制原理基本大差不差,下圖是SD卡的內部結構圖,引腳相同,控制也相同。
SD NAND芯片使用的數據傳輸協議相對來說較為簡單(和EMMC比起),存儲空間較大(和EEPROM比起),或者理解為集成了EMMC和EEPROM的優點,但它的傳輸性能遠不如EMMC那么快(這里根據EMMC協議主時鐘最高200MHZ和SD協議主時鐘最高50MHZ來定)。
因此SD NAND更適合用于一些用于并不是很復雜的設備開發中,比如單片機數據存取,簡單的數據保存和一些輕量化的系統,針對一些掌上電腦,手機,平板等高智能化的產品還是覺得EMMC芯片更能符合這一類的環境。
SD卡測試:
下面就來使用XC7Z020芯片對SD卡進行讀寫TXT文本實驗,就是SD卡而不是SD NAND具體原因在SD卡測試下面會說明,具體實驗步驟如下。本次使用的是SD卡。
創建Vivado工程文件,選擇對應的芯片型號和內容
本次實驗使用的是FPGA內部自帶的IP核和對應的硬件串口來實現,所以在IP核的配置中只使用DDR端口和內存端口,IP核其他的多余引腳全部刪除。
上圖是IP核設定的界面這個對應的SD接口,這個接口是開發板硬件連接決定的,本次實驗使用的是SD0,同時還要使能串口外設。
同時不要忘記設定需要的DDR控制器,以便來使用,下一步就要保存生成數據文件。
已經生成好的數據文件要把設定好的導出后,然后就可以進行SDK開發了。
正在啟動的SDK開發平臺。
在SDK開發平臺創建開發工程。
由于本次實驗需要添加FATS文件系統,在SDK開發平臺上沒有默認自帶該庫函數,因此需要手動添加庫文件。
點擊左上角的Modify this BSP's Settings 按鈕,添加庫函數。
選擇上圖中的庫函數,這個庫函數是FAT系統庫函數,里面包含很多的庫函數完全夠本次實驗使用。
繼續把use_lfn這個選項的值改成true,這個選項的作用是使能長文件名,這樣就可以針對長文件名進行操作。
在庫函數下有一個新加入的庫函數這個就是本次實驗使用的庫。
/***************************** Include Files *********************************/
#include "xparameters.h" /* SDK generated parameters */
#include "xsdps.h" /* SD device driver */
#include "xil_printf.h"
#include "ff.h"
#include "xil_cache.h"
#include "xplatform_info.h"
/************************** Function Prototypes ******************************/
int FfsSdPolledExample(void);
/************************** Variable Definitions *****************************/
static FIL fil; /* File object */
static FATFS fatfs;
static char FileName[32] = "Test.txt";
static char *SD_File;
char DestinationAddress[20] ;
const char SourceAddress[20]= "hello mizar !";
#define TEST 7
int main(void)
{
int Status;
xil_printf("SD Polled File System Example Test rn");
Status = FfsSdPolledExample();
if (Status != XST_SUCCESS) {
xil_printf("SD Polled File System Example Test failed rn");
return XST_FAILURE;
}
xil_printf("Successfully ran SD Polled File System Example Test rn");
return XST_SUCCESS;
}
int FfsSdPolledExample(void)
{
FRESULT Res;
UINT NumBytesRead;
UINT NumBytesWritten;
u32 BuffCnt;
BYTE work[FF_MAX_SS];
int FileSize = strlen(SourceAddress);
TCHAR *Path = "0:/";
//初始化文件系統
Res = f_mount(&fatfs, Path, 0);
if (Res != FR_OK) {
return XST_FAILURE;
}
//格式化SD卡
Res = f_mkfs(Path, FM_FAT32, 0, work, sizeof work);
if (Res != FR_OK) {
return XST_FAILURE;
}
//打開一個文件,如果文件不存在,則創建一個文件,該文件的權限為可讀寫
SD_File = (char *)FileName;
Res = f_open(&fil, SD_File, FA_CREATE_ALWAYS | FA_WRITE | FA_READ);
if (Res) {
return XST_FAILURE;
}
//指針指向文件開頭
Res = f_lseek(&fil, 0);
if (Res) {
return XST_FAILURE;
}
//向文件中寫入數據
Res = f_write(&fil, (const void*)SourceAddress, FileSize,
&NumBytesWritten);
if (Res) {
return XST_FAILURE;
}
//指針指向文件開頭
Res = f_lseek(&fil, 0);
if (Res) {
return XST_FAILURE;
}
//從SD卡中的文件讀出數據
Res = f_read(&fil, (void*)DestinationAddress, FileSize,
&NumBytesRead);
if (Res) {
return XST_FAILURE;
}
//比較寫入的數據與讀出的數據是否相同
for(BuffCnt = 0; BuffCnt < FileSize; BuffCnt++){
if(SourceAddress[BuffCnt] != DestinationAddress[BuffCnt]){
return XST_FAILURE;
}
}
//關閉文件
Res = f_close(&fil);
if (Res) {
return XST_FAILURE;
}
return XST_SUCCESS;
}
以上是本次實驗使用到的部分代碼,里面包含了外設,標準的打印函數和SD卡控制器的功能,在程序中先進行格式化SD卡為FAT32格式。
數據上傳到FPGA中創建SD卡內部內容。
提示該信息說明創建完成,這個數據是由串口發送的,下載完成就把SD卡通過讀卡器連接在電腦上就可以查看剛才創建的文件了,
在SD卡下創建好的文件。
或許在這里會有疑問為什么用FPGA對SD卡進行測試而不是SD NAND進行測試呢?答案很簡單就是驅動問題,如果把SD NAND進行和上面SD卡測試相同的實驗會發現最后查看Test文件無法完成,因為SD卡在Windows系統上(包括SD卡的讀卡器)它的驅動很完善有著很強大的能力,但是把SD NAND芯片單獨放到該體統中會顯得有一些缺點,但是就并不能否定SD NAND在其他硬件比如單片機中的優點。
像剛才我說的如果在Windows系統中直接拿SD卡和SD NAND來比較性能就有點太欺負人了,因為在驅動層面有著很大的不同,所以說明SD NAND存儲芯片要想做U盤就需要很完善的驅動才能進行,因此更適合在嵌入式單片機,FPGA內部程序開發等。
總結:
總的來說SD NAND是內部集成了SD卡協議的芯片,有著和SD卡相同的功能,在實際使用的時候使用的正是SD卡的協議,SD NAND可以焊接在線路板上完成一體化設計,建議使用在并不是需要強大性能的處理器上作為系統存儲,因為作為強大系統的存儲使用EMMC較好,SD NAND存儲芯片多數使用在較為輕量化的系統中。
本次實驗使用的是雷龍CSNP32GCR01和CSNP4GCR01芯片進行測試的,建議使用在嵌入式系統開發。
審核編輯 黃宇
-
NAND
+關注
關注
16文章
1682瀏覽量
136155 -
存儲
+關注
關注
13文章
4314瀏覽量
85842 -
SD NAND
+關注
關注
0文章
83瀏覽量
1237
發布評論請先 登錄
相關推薦
評論