合肥高端网站开发公司,网站建设与建设,中国互联网协会官网,网站登陆界面模板一、SD NAND 特征
1.1 SD 卡简介
雷龙的 SD NAND 有很多型号#xff0c;在测试中使用的是 CSNP4GCR01-AMW 与 CSNP32GCR01-AOW。芯片是基于 NAND FLASH 和 SD 控制器实现的 SD 卡。具有强大的坏块管理和纠错功能#xff0c;并且在意外掉电的情况下同样能保证数据的安全。
…一、SD NAND 特征
1.1 SD 卡简介
雷龙的 SD NAND 有很多型号在测试中使用的是 CSNP4GCR01-AMW 与 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 卡封装为 LGA-8引脚分配与定义如下在这里插入图片描述: 二、SD 卡样片
与样片同时寄来的还有转接板转接板将 LGA-8 封装的芯片转接至 SD 卡封装这样只需将转接板插入 SD 卡卡槽即可使用。
在这里插入图片描述: 三、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 次并打印报告。 3.2 SOC 搭建
硬件搭建框图如下我们在本次系统中使用 PS 端的 SDIO 接口来驱动 SD NAND 芯片并通过 UART 向 PC 打印报告
PL 端的硬件搭建也很简单只需一个 Timer 定时器来做时间测量 我们直接使用 Zybo 板卡文件创建一个工程工程会将 Zybo 具有的硬件资源配置好 首先点击 setting-IP-Repository-添加 Timer IP 核的路径Timer IP 核会在工程中给出 点击 Create Block Design 创建 BD 工程 在创建的过程中添加 Zynq 内核 由于我们使用了板卡文件所以内核 IP 是配置好的我们只需稍作修改即可如果是其他板卡则需要自行配置 DDR 等配置
双击内核 IP点击 Clock Configuration-PL Fabric Clocks将 FCLK_CLK0 的时钟频率修改为 100Mhz
添加 TimerA IP
依次点击上方的自动设计完成 SOC 搭建
点击 BD 设计并创建顶层文件 生成比特流文件 在生成比特流文件后将其导入 SDK
点击 Export-Export Hardware导出硬件然后点击 Launch SDK 打开 SDK 进行软件设计 四、软件搭建
在 SDK 中新建一个空白工程
点击 file - new - Application project; 在新建的过程中创建一个 main.c 文件并在里面编写测试程序如下
在每次读写开始前通过 TimerA0_start() 函数开始计时在读写结束后可以通过 TimerA0_stop() 结束计时从而测得消耗时间。
相应的 Timer 驱动函数在 user/TimerA_user.c 中定义
#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
#include time.h
#include ../user/headfile.h
#define PACK_LEN 32764
static FIL fil; /_ File object _/
static FATFS fatfs;
static char FileName[32] Test.txt;
static char \*SD_File;
char DestinationAddress[PACK_LEN] ;
char txt[1024];
char test_buffer[PACK_LEN];
void TimerA0_init()
{TimerA_reset(TimerA0);//reset timerA deviceTimerA_Set_Clock_Division(TimerA0,100);//divide clock as 100000000/100 1MhzTimerA_Stop_Counter(TimerA0);//stop timerA
}
void TimerA0_start()
{TimerA_SetAs_CONTINUS_Mode(TimerA0);
}
void TimerA0_stop()
{TimerA_Stop_Counter(TimerA0);
}
uint32 SDCard_test()
{uint8 Res;uint32 NumBytesRead;uint32 NumBytesWritten;uint32 BuffCnt;uint8 work[FF_MAX_SS];uint32 take_time0;uint32 speed 0;uint32 test_time 0;uint32 w_t0;uint32 r_t0;float wsum 0;float rsum 0;TCHAR *Path 0:/;for(int i0;iPACK_LEN;i){test_buffer[i] a;}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;}while(1){TimerA_reset(TimerA0);TimerA0_start();Res f_write(fil, (const void*)test_buffer, PACK_LEN,NumBytesWritten);TimerA0_stop();take_time TimerA_Read_Counter_Register(TimerA0);w_ttake_time;xil_printf(--------------------------------\n);xil_printf(take time:%d us\n,take_time);speed PACK_LEN*(1000000/((float)(take_time)));sprintf(txt,write speed:%.2f MB/s\n,(float)(speed)/1024/1024);wsum wsumspeed;xil_printf(txt);xil_printf(--------------------------------\n);if (Res) {return XST_FAILURE;}Res f_lseek(fil, 0);if (Res) {return XST_FAILURE;}TimerA_reset(TimerA0);TimerA0_start();Res f_read(fil, (void*)DestinationAddress, PACK_LEN,NumBytesRead);TimerA0_stop();take_time TimerA_Read_Counter_Register(TimerA0);r_ttake_time;xil_printf(--------------------------------\n);xil_printf(take time:%d us\n,take_time);speed PACK_LEN*(1000000/((float)(take_time)));sprintf(txt,read speed:%.2f MB/s\n,(float)(speed)/1024/1024);rsum rsumspeed;xil_printf(txt);xil_printf(--------------------------------\n);if (Res) {return XST_FAILURE;}for(BuffCnt 0; BuffCnt PACK_LEN; BuffCnt){if(test_buffer[BuffCnt] ! DestinationAddress[BuffCnt]){xil_printf(%dno,BuffCnt);return XST_FAILURE;}}xil_printf(test num:%d data check right!\n,test_time1);test_time;if(test_time100){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);xil_printf(txt);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);xil_printf(txt);Res f_close(fil);if (Res) {return XST_FAILURE;}return 0;}}
}
int main(void)
{TimerA0_init();SDCard_test();xil_printf(finish);return 0;
}五、测试结果
经测试两种型号的芯片读写速度如下图表所示。
其 SD NAND 的读写速度随着读写数据量的增加而增加并且读速率大于写速率这符合 SD 卡的特性
对比两种型号 SD NAND 芯片发现 CSNP32GCR01-AOW 型号具有更高的读写速度
六、总结
本来打算拿这些样片去试试信息安全领域是否有所应用但发现其似乎内置了复位或初始化导致无法提取上电时的不确定值故无法提取该 SD NAND 的物理不可克隆特性所以这方面的测试无法进行
对于芯片正常读写的测试结果还是很让人满意的芯片的价格也很合理。并且 LGA-8 封装更适合无卡槽的嵌入式开发板设计在一定的应用领域有着简化硬件设计、减小硬件面积的功能。
官网体验
最后贴上测试工程的链接还迎复现实验: https://gitee.com/gewenjie_host/sd_-nand_-zynq700_test