前言:
随着国内市场对芯片的需求日益增加,国产中高端芯片在不断的占领国内市场甚至在国际市场都有一部分,越来越多的企业开始研究自己的芯片,这个芯片的种类繁多,功能性强大,也有一些芯片占有着很大的市场份额,有着不可取代的地位。
随着芯片的发展存储芯片的趋势也开始不甘落后,有着越来越多的新型的芯片问世,这里就要提起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 \r\n");
Status = FfsSdPolledExample();
if (Status != XST_SUCCESS) {
xil_printf("SD Polled File System Example Test failed \r\n");
return XST_FAILURE;
}
xil_printf("Successfully ran SD Polled File System Example Test \r\n");
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;
}
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;
}
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芯片进行测试的,建议使用在嵌入式系统开发。