基于Zynq FPGA对雷龙SD NAND的测试

2024-01-05 18:17:51 雷龙发展

文章目录

一、SD NAND特征

1.1 SD卡简介

1.2 SD卡Block图

二、SD卡样片

三、Zynq测试平台搭建

3.1 测试流程

3.2 SOC搭建

四、软件搭建

五、测试结果

六、总结

一、SD NAND特征

1.1 SD卡简介

  雷龙的SD NAND有很多型号,在测试中使用的是CSNP4GCR01-AWM与CSNP32GCR01-AOW。芯片是基于NAND FLASH和 SD控制器实现的SD卡。具有强大的坏块管理和纠错功能,并且在意外掉电的情况下同样能保证数据的安全。

  其特点如下:


接口支持SD2.0 2线或4线;

电压支持:2.7V-3.6V;

默认模式:可变时钟速率0 - 25MHz,高达12.5 MB/s的接口速度(使用4条并行数据线)

高速模式:可变时钟速率0 - 50MHz,高达25 MB/s的接口速度(使用4条并行数据线)

工作温度:-40°C ~ +85°C

存储温度:-55°C ~ +125°C

待机电流小于250uA

修正内存字段错误;

内容保护机制——符合SDMI最高安全标准

SDNAND密码保护(CMD42 - LOCK_UNLOCK)

采用机械开关的写保护功能

内置写保护功能(永久和临时)

应用程序特定命令

舒适擦除机制

  该SD卡支持SDIO读写和SPI读写,最高读写速度可达25MB/s,实际读写速度要结合MCU和接口情况实测获得。通常在简单嵌入式系统并对读写速度要求不高的情况下,会使用SPI协议进行读写。但不管使用SDIO还是SPI都需要符合相关的协议规范,才能建立相应的文件系统;


1.2 SD卡Block图

SD卡Block图

 该SD卡封装为LGA-8;引脚分配与定义如下;在这里插入图片描述:

SD卡封装为LGA-8引脚分配与定义


二、SD卡样片

  与样片同时寄来的还有转接板,转接板将LGA-8封装的芯片转接至SD卡封装,这样只需将转接板插入SD卡卡槽即可使用。

在这里插入图片描述:

CS创世SD NAND转接板

三、Zynq测试平台搭建

  •   测试平台为 Xilinx 的Zynq 7020 FPGA芯片;

  •   板卡:Digilent Zybo Z7

  •   Vivado版本:2018.3

  •   文件系统:FATFS

  •   SD卡接口:SD2.0


3.1 测试流程

  本次测试主要针对4G和32G两个不同容量的SD卡,在Zynq FPGA上搭建SD卡读写回路,从而对SD卡读写速度进行测试,并检验读写一致性;

测试流程:

  进入测试程序前,首先会对SD卡初始化并初始化建立FATFS文件系统,随后进入测试SD卡测试程序,在测试程序中,会写入一定大小的文件,然后对写入文件的时间进行测量,得到写入时间;然后再将写入的文件读出,测量获得读出时间,并将读出数据与写入数据相比较,检测是否读写出错。

  通过写入时间、读出时间可计算得到写入速度、读出速度;将以上过程重复100次并打印报告。

在Zynq FPGA上搭建SD卡读写回路

3.2 SOC搭建

  硬件搭建框图如下,我们在本次系统中使用PS端的SDIO接口来驱动SD NAND芯片,并通过UART向PC打印报告;

  PL端的硬件搭建也很简单,只需一个Timer定时器来做时间测量;

SD NAND(SD卡)PL端的硬件搭建

我们直接使用Zybo板卡文件创建一个工程,工程会将Zybo具有的硬件资源配置好;

Zybo板卡文件创建

首先点击setting->IP->Repository->+;添加Timer IP核的路径,Timer IP核会在工程中给出;

SOC搭建

 点击Create Block Design创建BD工程

Create Block Design创建BD工程

 在创建的过程中添加Zynq 内核;

SD NAND添加Zynq 内核

       由于我们使用了板卡文件,所以内核IP是配置好的,我们只需稍作修改即可,如果是其他板卡,则需要自行配置DDR等配置;

  双击内核IP,点击Clock Configuration->PL Fabric Clocks,将FCLK_CLK0的时钟频率修改为100Mhz

  双击内核IP,点击Clock Configuration->PL Fabric Clocks,将FCLK_CLK0的时钟频率修改为100Mhz

 添加TimerA IP;

 添加TimerA IP

依次点击上方的自动设计,完成SOC搭建;

SOC搭建

 点击BD设计,并创建顶层文件

SD NAND的SOC搭建

生成比特流文件;

SD NAND的SOC搭建 比特流文件

       在生成比特流文件后,将其导入SDK;

  点击Export->Export Hardware,导出硬件;然后点击Launch SDK打开SDK进行软件设计;

Export->Export Hardware,导出硬件Launch SDK打开SDK进行软件设计

四、软件搭建

  在SDK中新建一个空白工程;

  点击file -> new -> Application project;

SD NAND软件搭建

在新建的过程中创建一个main.c文件,并在里面编写测试程序如下:

  在每次读写开始前,通过TimerA0_start()函数开始计时,在读写结束后可以通过TimerA0_stop()结束计时,从而测得消耗时间。

  相应的Timer驱动函数在user/TimerA_user.c中定义;

  1. #include "xparameters.h"    /* SDK generated parameters */

  2. #include "xsdps.h"        /* SD device driver */

  3. #include "xil_printf.h"

  4. #include "ff.h"

  5. #include "xil_cache.h"

  6. #include "xplatform_info.h"

  7. #include "time.h"

  8. #include "../user/headfile.h"


  9. #define    PACK_LEN       32764


  10. static FIL fil;        /* File object */

  11. static FATFS fatfs;


  12. static char FileName[32] = "Test.txt";

  13. static char *SD_File;


  14. char DestinationAddress[PACK_LEN] ;


  15. char txt[1024];

  16. char test_buffer[PACK_LEN];


  17. void TimerA0_init()

  18. {

  19.     TimerA_reset(TimerA0);//reset timerA device

  20.     TimerA_Set_Clock_Division(TimerA0,100);//divide clock as 100000000/100 = 1Mhz

  21.     TimerA_Stop_Counter(TimerA0);//stop timerA

  22. }


  23. void TimerA0_start()

  24. {

  25.     TimerA_SetAs_CONTINUS_Mode(TimerA0);

  26. }


  27. void TimerA0_stop()

  28. {

  29.     TimerA_Stop_Counter(TimerA0);

  30. }





  31. uint32 SDCard_test()

  32. {

  33.     uint8 Res;

  34.     uint32 NumBytesRead;

  35.     uint32 NumBytesWritten;

  36.     uint32 BuffCnt;

  37.     uint8 work[FF_MAX_SS];

  38.     uint32 take_time=0;

  39.     uint32 speed = 0;

  40.     uint32 test_time = 0;

  41.     uint32 w_t=0;

  42.     uint32 r_t=0;

  43.     float wsum = 0;

  44.     float rsum = 0;



  45.     TCHAR *Path = "0:/";


  46.     for(int i=0;i<PACK_LEN;i++)

  47.     {

  48.         test_buffer[i] = 'a';

  49.     }


  50.     Res = f_mount(&fatfs, Path, 0);


  51.     if (Res != FR_OK) {

  52.         return XST_FAILURE;

  53.     }


  54.     Res = f_mkfs(Path, FM_FAT32, 0, work, sizeof work);

  55.     if (Res != FR_OK) {

  56.         return XST_FAILURE;

  57.     }


  58.     SD_File = (char *)FileName;


  59.     Res = f_open(&fil, SD_File, FA_CREATE_ALWAYS | FA_WRITE | FA_READ);

  60.     if (Res) {

  61.         return XST_FAILURE;

  62.     }


  63.     Res = f_lseek(&fil, 0);

  64.     if (Res) {

  65.         return XST_FAILURE;

  66.     }


  67.     while(1)

  68.     {

  69.         TimerA_reset(TimerA0);

  70.         TimerA0_start();

  71.         Res = f_write(&fil, (const void*)test_buffer, PACK_LEN,

  72.                 &NumBytesWritten);

  73.         TimerA0_stop();

  74.         take_time = TimerA_Read_Counter_Register(TimerA0);

  75.         w_t+=take_time;

  76.         xil_printf("-------------------------------- ");

  77.         xil_printf("take time:%d us ",take_time);

  78.         speed = PACK_LEN*(1000000/((float)(take_time)));

  79.         sprintf(txt,"write speed:%.2f MB/s ",(float)(speed)/1024/1024);

  80.         wsum = wsum+speed;

  81.         xil_printf(txt);

  82.         xil_printf("-------------------------------- ");

  83.         if (Res) {

  84.             return XST_FAILURE;

  85.         }


  86.         Res = f_lseek(&fil, 0);

  87.         if (Res) {

  88.             return XST_FAILURE;

  89.         }


  90.         TimerA_reset(TimerA0);

  91.         TimerA0_start();

  92.         Res = f_read(&fil, (void*)DestinationAddress, PACK_LEN,

  93.                 &NumBytesRead);

  94.         TimerA0_stop();

  95.         take_time = TimerA_Read_Counter_Register(TimerA0);

  96.         r_t+=take_time;

  97.         xil_printf("-------------------------------- ");

  98.         xil_printf("take time:%d us ",take_time);

  99.         speed = PACK_LEN*(1000000/((float)(take_time)));

  100.         sprintf(txt,"read speed:%.2f MB/s ",(float)(speed)/1024/1024);

  101.         rsum = rsum+speed;

  102.         xil_printf(txt);

  103.         xil_printf("-------------------------------- ");

  104.         if (Res) {

  105.             return XST_FAILURE;

  106.         }



  107.         for(BuffCnt = 0; BuffCnt < PACK_LEN; BuffCnt++){

  108.             if(test_buffer[BuffCnt] != DestinationAddress[BuffCnt]){

  109.                 xil_printf("%dno",BuffCnt);

  110.                 return XST_FAILURE;

  111.             }

  112.         }

  113.         xil_printf("test num:%d data check right! ",test_time+1);

  114.         test_time++;

  115.         if(test_time==100)

  116.         {

  117.             sprintf(txt,"Total write: %.2f KB,Take time:%.2f ms, Write speed:%.2f MB/s ",PACK_LEN*100/1024.0,w_t/100.0/1000.0,wsum/100/1024/1024);

  118.             xil_printf(txt);

  119.             sprintf(txt,"Total read: %.2f KB,Take time:%.2f ms, Read speed:%.2f MB/s ",PACK_LEN*100/1024.0,r_t/100.0/1000.0,rsum/100/1024/1024);

  120.             xil_printf(txt);

  121.             Res = f_close(&fil);

  122.             if (Res) {

  123.                 return XST_FAILURE;

  124.             }

  125.             return 0;

  126.         }

  127.     }


  128. }


  129. int main(void)

  130. {

  131.     TimerA0_init();


  132.     SDCard_test();

  133.     xil_printf("finish");

  134.     return 0;

  135. }

五、测试结果

  经测试,两种型号的芯片读写速度如下图表所示。

  其SD NAND的读写速度随着读写数据量的增加而增加,并且读速率大于写速率,这符合SD卡的特性;

  对比两种型号SD NAND芯片,发现CSNP32GCR01-AOW型号具有更高的读写速度;

SD NAND的读写速度数据

SD NAND的写入速度数据SD NAND的读出速度数据

六、总结

  本来打算拿这些样片去试试信息安全领域是否有所应用,但发现其似乎内置了复位或初始化,导致无法提取上电时的不确定值,故无法提取该SD NAND的物理不可克隆特性,所以这方面的测试无法进行;

  对于芯片正常读写的测试结果,还是很让人满意的,芯片的价格也很合理。并且LGA-8封装更适合无卡槽的嵌入式开发板设计,在一定的应用领域有着简化硬件设计、减小硬件面积的功能。

  最后贴上测试工程的链接,还迎复现实验: https://gitee.com/gewenjie_host/sd_-nand_-zynq700_test

————————————————

  1. 【本文转载自CSDN,作者:PPRAM

  亲爱的卡友们,欢迎光临雷龙官网,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。

  

  深圳市雷龙发展有限公司联系方式


Tel & Email

Tel:+86 13691982107(priority)+86 17727831243

Email:line@longsto.com

info@longsto.com

Complaint:ceo@longsto.com |+8613923450403

Address: Room 1907, Block B, Zhantao Technology Building, Minzhi Street, Longhua District, Shenzhen City, Guangdong Province, China.

HOME
Product
Technical Q&A
Contact