0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

深圳市雷龙发展有限公司 2023-12-22 17:45 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

文章目录

一、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图

get?code=M2U4NTY5ODk0YTZkMjFkOWI3MWVlZmU4OTM3M2VjNTcsMTcwMzIzNzI1Mzg3NQ==

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

get?code=YmQxZTRmYjU0ZGI5OTNhOTVlZDQzOWYxNDQwMmUyM2EsMTcwMzIzNzI1Mzg3NQ==

二、SD卡样片

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

在这里插入图片描述:

get?code=ZmQ3NzUyZGU3MDdmZmExNTQ4ODkyN2U0NzEzNmNjMDEsMTcwMzIzNzI1Mzg3NQ==

三、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次并打印报告。

get?code=NGM4YzJlOGY1ZTdmODFjZjQxMDFjNDkxNGFjYjA2NDcsMTcwMzIzNzI1Mzg3NQ==

3.2 SOC搭建

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

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

get?code=NTNhNTBkNzkxMzE2MGRhMGNkYTczNjFkYTVjMGUxZjgsMTcwMzIzNzI1Mzg3NQ==

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

get?code=MzY0MWQ4ZjBlNTY2NWUxNTA4OGIwOWExM2RjYTg5YTMsMTcwMzIzNzI1Mzg3Ng==

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

get?code=Yjk1ZDk5ZGJiNWMyMmIyZjdiMDE4YmU0MWE2N2FiNGMsMTcwMzIzNzI1Mzg3Ng==

 点击Create Block Design创建BD工程

get?code=YmNmZGY0OGY4YTBlYTkwZjE0ODE3NzI2ZjUzYWM3ODEsMTcwMzIzNzI1Mzg3Ng==

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

get?code=ZjkzYzQ0YjM4OTJmMjcxMGZkMTJhYWE0MDMyNDY0NzcsMTcwMzIzNzI1Mzg3Ng==

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

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

get?code=NTg0ZjhkMjEwOGMxZmI1NTMwY2E4Njc5NTM0MDZiYmYsMTcwMzIzNzI1Mzg3Ng==

 添加TimerA IP;

get?code=NGJlZTQ3NjFkZTExMDc1NjI0OGZlY2U2YTE3MjllNGEsMTcwMzIzNzI1Mzg3Ng==

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

get?code=NDQ5MzRhMDljYjk1YTA4OTlkZGM5MjkxMDRiMmEyNzQsMTcwMzIzNzI1Mzg3Ng==

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

get?code=YWVkNzhjMzJjYjUzZTNhNTNiYTUzZTU5MjdjNjljMmQsMTcwMzIzNzI1Mzg3Ng==

生成比特流文件;

get?code=ODVjNDU5NDdjYWEyNzEwZTFiNmJlNmYzYWM0ZDcwZWIsMTcwMzIzNzI1Mzg3Ng==

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

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

get?code=M2Y0YmE2NjhiODE4NjUwMzA5NjBlM2M5MTlhOGEwNzcsMTcwMzIzNzI1Mzg3Ng==get?code=YzQyM2RjMWY1ZjZkYWJkMDQzMmI0NzQ2MDdiYjYzOTAsMTcwMzIzNzI1Mzg3Ng==

四、软件搭建

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

  点击file -> new -> Application project;

get?code=OTFiMjQxZmRmOTZiY2ZhMjRjYzA3MTUwNjM4ZDkzMzQsMTcwMzIzNzI1Mzg3Ng==

在新建的过程中创建一个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
  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("--------------------------------\n");
  77. xil_printf("take time:%d us\n",take_time);
  78. speed = PACK_LEN*(1000000/((float)(take_time)));
  79. sprintf(txt,"write speed:%.2f MB/s\n",(float)(speed)/1024/1024);
  80. wsum = wsum+speed;
  81. xil_printf(txt);
  82. xil_printf("--------------------------------\n");
  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("--------------------------------\n");
  98. xil_printf("take time:%d us\n",take_time);
  99. speed = PACK_LEN*(1000000/((float)(take_time)));
  100. sprintf(txt,"read speed:%.2f MB/s\n",(float)(speed)/1024/1024);
  101. rsum = rsum+speed;
  102. xil_printf(txt);
  103. xil_printf("--------------------------------\n");
  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!\n",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\n",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\n",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型号具有更高的读写速度;

get?code=YmIxMzU2YjU2MDJjMWVmYzViMmVmYzczNjlmNmU5ODYsMTcwMzIzNzI1Mzg3Ng==get?code=NGNlMzk5Zjc5NTEzYWM5MzM4N2QxZGNmNWRkMjEzNjYsMTcwMzIzNzI1Mzg3Ng==get?code=NjJmYWI2MDE4YTFhYWY3YmY2ZjY0MjA2Yzc5MWIyYmUsMTcwMzIzNzI1Mzg3Ng==

六、总结

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

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

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1656

    文章

    22298

    浏览量

    630455
  • 测试
    +关注

    关注

    8

    文章

    6040

    浏览量

    130738
  • NAND
    +关注

    关注

    16

    文章

    1748

    浏览量

    140464
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    解锁SD NAND、TF卡、SD卡的应用密码

    在科技飞速发展的今天,数据存储的需求渗透到生活与工作的每一个角落——从手腕上的智能手表,到专业摄影师的相机,再到工厂里的工业路由器,都离不开高效可靠的存储介质。SD NAND、TF卡和SD卡作为其中
    的头像 发表于 11-24 11:04 247次阅读
    解锁<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>、TF卡、<b class='flag-5'>SD</b>卡的应用密码

    一文秒懂XTX SD NAND

    :原理、性能与应用 随着消费电子、工业控制、汽车电子和安防监控等领域对高密度、低成本存储需求的不断攀升,SD NAND闪存因其体积小、集成度高、易于部署的特点,成为SD卡(SD、SDH
    的头像 发表于 10-30 08:38 429次阅读
    一文秒懂XTX <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>

    解锁存储密码:SD NAND、TF卡、SD卡的应用全景

    在数据洪流的时代,存储介质就如同数字世界的基石,支撑着各类设备的正常运转。SD NAND、TF卡和SD卡,虽同属NAND Flash存储介质家族,却因各自独特的“个性”,在不同领域绽放
    的头像 发表于 10-29 14:24 226次阅读

    基于ZYNQ的创世SD NAND卡读写TXT文本实验

    在之前的介绍中,我们介绍了雷龙SDNAND卡的焊接以及用途。由于SDNAND卡具有容量大,操作简单,可插拔等的特点,经常作为大容量的存储介质用来保存数据。本实验我们来使用FPGA雷龙SDNAND
    的头像 发表于 09-22 14:30 331次阅读
    基于<b class='flag-5'>ZYNQ</b>的创世<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>卡读写TXT文本实验

    SD卡—雷龙 SD NAND

    一、SD卡介绍 1.基本介绍 本质:nand flash + 控制芯片 1.SD卡 ,Secure Digital Card,称为安全数字卡(安全数码卡)。SD卡系列主要有三种:
    的头像 发表于 07-21 17:59 3253次阅读
    <b class='flag-5'>SD</b>卡—<b class='flag-5'>雷龙</b> <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>

    【嵌入式开发】SD卡—雷龙 SD NAND

    、R7。 R1响应格式: 2.SD卡操作步骤介绍 SPI模式下 SD卡初始化 SD卡单块数据块读取流程 五、雷龙 SD
    发表于 07-21 17:56

    NAND Flash与SD NAND的存储扇区架构差异

    NAND Flash 和 SD卡(SD NAND)的存储扇区分配表都是用于管理存储设备中扇区的分配信息。它们记录了哪些扇区已被使用、哪些是空闲的,以及文件或数据与扇区的对应关系,以便实
    的头像 发表于 03-13 15:20 1583次阅读
    <b class='flag-5'>NAND</b> Flash与<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>的存储扇区架构差异

    [上手体验]雷龙SD NAND:比TF卡更小更耐用

    前几天,有幸得到了深圳雷龙发展公司送来的SD NAND样品。他们给了两颗32Gbit的SD NAND以及一块转接板,并且已经将
    发表于 03-08 14:28

    CS创世SD NAND【贴片式sd卡】的测试使用说明

    今天收到了来自深圳市雷龙发展有限公司寄来的存储卡,它是一款自带坏块管理的贴片式NAND Flash,适用于嵌入式系统。SD NAND尺寸小巧,支持SPI/
    的头像 发表于 02-17 15:45 761次阅读
    CS创世<b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>【贴片式<b class='flag-5'>sd</b>卡】的<b class='flag-5'>测试</b>使用说明

    CS创世SD NAND【贴片式sd卡】的测试使用说明

      今天收到了来自深圳市雷龙发展有限公司寄来的存储卡,它是一款自带坏块管理的贴片式NAND Flash,适用于嵌入式系统。SD NAND尺寸小巧,支持SPI/
    发表于 02-12 15:05

    雷龙SD NAND测试报告

    本帖最后由 xxkj2010 于 2025-2-8 14:23 编辑 雷龙SD NAND测试报告一次偶然的机会,很幸运得到深圳市雷龙
    发表于 02-08 14:12

    雷龙 SD NAND 简单使用

    前段时间收到了雷龙厂家邮寄的两个 SD NAND 样片,说要发文章的,一直搁置了,今天测试 esp32 的开发板的时候,发现之前的 SD
    发表于 01-31 15:41

    雷龙SD NAND试用

    、CSNP32GCR01-AOW分别为8GB、4GB雷龙二代SD NAND.前者样片帮焊接在转接板上,后者单芯片可以在需要SD NAND的开
    发表于 01-19 13:26

    SD NAND、SPI NAND 和 Raw NAND 的定义与比较

    SD nand,贴片式SD卡,使用起来和SD卡一致,不同的是采用,通常采用LGA-8封装,尺寸为8mm x 6mm x 0.75mm,重点是采用贴片封装,可以直接贴在板卡上,直接解决了
    的头像 发表于 01-15 18:16 1423次阅读
    <b class='flag-5'>SD</b> <b class='flag-5'>NAND</b>、SPI <b class='flag-5'>NAND</b> 和 Raw <b class='flag-5'>NAND</b> 的定义与比较

    SD NAND、SPI NAND 和 Raw NAND 的定义与比较

    SD nand,贴片式SD卡,使用起来和SD卡一致,不同的是采用,通常采用LGA-8封装,尺寸为8mm x 6mm x 0.75mm,重点是采用贴片封装,可以直接贴在板卡上,直接解决了
    发表于 01-15 18:15