当前位置:网站首页 > 数据科学与大数据 > 正文

jtag 读取flash 数据(fpga flash读写)



一、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 "https://www.51969.com/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 device

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

TimerA_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_time=0;

uint32 speed = 0;

uint32 test_time = 0;

uint32 w_t=0;

uint32 r_t=0;

float wsum = 0;

float rsum = 0;

TCHAR *Path = "0:/";

for(int i=0;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_t+=take_time;

xil_printf("-------------------------------- ");

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

speed = PACK_LEN*(/((float)(take_time)));

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

wsum = wsum+speed;

xil_printf(txt);

xil_printf("-------------------------------- ");

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_t+=take_time;

xil_printf("-------------------------------- ");

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

speed = PACK_LEN*(/((float)(take_time)));

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

rsum = rsum+speed;

xil_printf(txt);

xil_printf("-------------------------------- ");

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! ",test_time+1);

test_time++;

if(test_time==100)

{

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);

xil_printf(txt);

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);

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

参考阅读

  


大家都在找:

SD NAND:智能手表用sd nand

到此这篇jtag 读取flash 数据(fpga flash读写)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 数据库基础知识思维导图(数据库基础知识思维导图怎么画)2025-01-29 09:18:09
  • 大数据课程思政案例(大数据时代思政教育)2025-01-29 09:18:09
  • uchar是什么类型(uchar是什么类型数据)2025-01-29 09:18:09
  • 学术数据库没有购买也能免费检索的有(中国学术期刊全文数据库的检索方式有哪些)2025-01-29 09:18:09
  • 数据库 入门(数据库入门书籍推荐)2025-01-29 09:18:09
  • orecal数据库常用命令(oralcal数据库)2025-01-29 09:18:09
  • 大数据技术是学什么的(计算机大数据技术是学什么的)2025-01-29 09:18:09
  • 大数据培训班一般多少钱一个小时(大数据培训班需要多少钱)2025-01-29 09:18:09
  • spss数据分析如何做(spss数据分析做曲线分析)2025-01-29 09:18:09
  • 密码查询数据(查询密码管理是什么)2025-01-29 09:18:09
  • 全屏图片