请选择 进入手机版 | 继续访问电脑版
 专注集成电路FPGA应用生态推广
 微信公众号
米联客
米联客uisrc 首页 Xilinx课程 19版ZYNQ 2-ZYNQ入门 查看内容
1

S02-CH14 TF/SD卡/EMMC读写实验

摘要: 软件版本:VIVADO2017.4操作系统:WIN10 64bit硬件平台:适用米联客 ZYNQ系列开发板米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!14.1 概述 本课程利用ZYNQ 自带的SDIO接口,并且利用SDK ...

软件版本:VIVADO2017.4

操作系统:WIN10 64bit

硬件平台:适用米联客 ZYNQ系列开发板

米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!

14.1 概述

       本课程利用ZYNQ 自带的SDIO接口,并且利用SDK自带的系统库函数,分别实现TF卡和板载EMMC的读写测试。

14.3 FPGA BD工程

Step1:新建一个名为为Miz_sys的工程。

Step2:创建一个BD文件,并命名为system,添加并且配置好ZYNQ IP。读者需要根据自己的硬件类型配置好输入时钟频率、内存型号、串口,连接时钟等。新手不清楚这些内容个,请参考“CH01 HelloWold/DDR/网口测试及固化”这一节课。

确保SDIO接口,设置正确,SD_0是TF卡,SD_1是EMMC,对于MZ7XA-7010mini没有EMMC

14.4 SD/TF卡读写程序


#include <stdio.h>

#include "xparameters.h"

#include "xsdps.h"

#include "xil_printf.h"

#include "ff.h"


static FATFS SD_Dev; // File System instance

char *SD_Path = "0:/";  //  string pointer to the logical drive number

static char FileName[32] = "test.txt"; // name of the log


u8 WR_Buf[1024] __attribute__ ((aligned(32))); // Buffer should be word aligned (multiple of 4)

u8 RD_Buf[1024] __attribute__ ((aligned(32))); // Buffer should be word aligned (multiple of 4)



int SD_init()

{

FRESULT result;

//-----------------------mount dev-----------------------------------------------

result = f_mount(&SD_Dev,SD_Path, 0);

if (result != 0) {

return XST_FAILURE;

}

return XST_SUCCESS;

}


int SD_read(char *FileName,u8 *DestinationAddress,u32 ByteLength)

{

FIL file;

FRESULT result;

UINT BytesRd;


result = f_open(&file,FileName,FA_READ);

if(result)

{

return XST_FAILURE;

}


result = f_lseek(&file, 0);

if(result)

{

return XST_FAILURE;

}


result = f_read(&file, (void*)DestinationAddress,ByteLength,&BytesRd);

if(result)

{

return XST_FAILURE;

}


result = f_close(&file);

if(result)

{

return XST_FAILURE;

}

return XST_SUCCESS;

}



int SD_write(char *FileName,u8 *SourceAddress,u32 ByteLength)

{

FIL file;

FRESULT result;

UINT BytesWr;


result = f_open(&file,FileName,FA_CREATE_ALWAYS | FA_WRITE);

if(result)

{

return XST_FAILURE;

}


result = f_lseek(&file, 0);

if(result)

{

return XST_FAILURE;

}


result = f_write(&file,(void*) SourceAddress,ByteLength,&BytesWr);

if(result)

{

return XST_FAILURE;

}


result = f_close(&file);

if(result){

return XST_FAILURE;

}


return XST_SUCCESS;

}





int main()

{


int i;

FRESULT result;

u8 SD_ERROR=0;

u32 Buffer_size=1024;


SD_init();


for(i=0;i<Buffer_size;i++)

{

WR_Buf[i]=i;

}

//-----------------------write test data to file-----------------------------------

result=SD_write(FileName, WR_Buf, Buffer_size);

if (result!=0)

{

return XST_FAILURE;

}

xil_printf("SD CARD  written Successfully\r\n");


//-----------------------read test data ------------------------------------------

result=SD_read(FileName, RD_Buf, Buffer_size);

if (result!=0)

{

return XST_FAILURE;

}

xil_printf("SD CARD Data read Successfully\r\n");


//-----------------------check data-----------------------------------------------

for(i=0; i<Buffer_size;i++)

{


if(WR_Buf[i]!=RD_Buf[i])

{

SD_ERROR=1;

break;

}

}


if(SD_ERROR)

xil_printf("SD CARD  Data checked Error\r\n");

else

xil_printf("SD CARD Data checked Successfully\r\n");



    return 0;

}

      以上函数中,实现了创建一个text.txt的文件,并且打开,只有往里面写0~1023~共计1024个数据,之后再读这个文件,读出1024个数据,最后对比数据内容是否和写入的一致。

用户可以可以直接复制以上程序到自己的工程使用。

     除此之外,要让自己新建的工程可以正常编译,还要设置BSP库,如下图,右击,选择红色框选选项

勾选xilffs库,以支持SD卡的裸机文件系统支持。

14.5 SD/TF卡读写测试结果

14.6 EMMC 读写程序

#include <stdio.h>

#include "xparameters.h"

#include "xil_exception.h"

#include "xsdps.h"

#include "xil_printf.h"


static XSdPs   ps7_EMMC;

XSdPs_Config * EMMC_Config;

u8 WR_Buf[1024];

u8 RD_Buf[1024];

u8 Emmc_ExtCsd[1024];



int main()

{

u32 i;

s32 Status;

u32 Buffer_size=1024;

u8 SD_ERROR=0;


    EMMC_Config= XSdPs_LookupConfig(XPAR_PS7_SD_1_DEVICE_ID);

    Status = XSdPs_CfgInitialize(&ps7_EMMC, EMMC_Config, EMMC_Config->BaseAddress);

    if (Status != XST_SUCCESS)

    {

         print("EMMC Config failed !\n\r");

         return XST_FAILURE;

    }

    Status=XSdPs_MmcCardInitialize(&ps7_EMMC);

    if (Status != XST_SUCCESS)

    {

         print("EMMC Config failed !\n\r");

         return XST_FAILURE;

    }

    Status=XSdPs_Change_ClkFreq(&ps7_EMMC,50000000);

    Status=XSdPs_Select_Card(&ps7_EMMC);

    Status=XSdPs_SetBlkSize(&ps7_EMMC,XSDPS_BLK_SIZE_512_MASK);

    Status=XSdPs_Get_Mmc_ExtCsd(&ps7_EMMC,Emmc_ExtCsd);


    for(i=0;i<Buffer_size;i++)

    {

     WR_Buf[i]=i;

    }

    Status = XSdPs_WritePolled(&ps7_EMMC, 0x00, 2, WR_Buf);

    Status = XSdPs_ReadPolled(&ps7_EMMC, 0x00, 2, RD_Buf);


    //-----------------------check data-----------------------------------------------

    for(i=0; i<Buffer_size;i++)

     {


     if(WR_Buf[i]!=RD_Buf[i])

     {

     SD_ERROR=1;

     break;

     }

     }


     if(SD_ERROR)

     xil_printf("EMMC  Data checked Error\r\n");

     else

     xil_printf("EMMC  Data checked Successfully\r\n");


    return 0;

}

EMMC 测试程序没有用到文件系统,使用了XILINX SDK库函数实现读写,先往EMMC里面写1024个数据,之后再读出,对比是否有错误。

14.7 测试结果

注意,购买MZ7XA-7010mini的开发板由于没有焊接EMMC所以无法完成此EMMC测试实验。


路过

雷人

握手

鲜花

鸡蛋

说点什么...

已有1条评论

最新评论...

shzhang2019-11-2 17:05引用

请问,我在MZ710FA上按教程测试SD卡读写,软件版本2017.4,f_open返回值3(FR_NOT_READY,/* (3) The physical drive cannot work */),这个错误可能是什么问题引起的呢?

查看全部评论(1)

本文作者
2019-9-6 19:24
  • 6
    粉丝
  • 5459
    阅读
  • 1
    回复

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B
热门评论
排行榜

关注我们:微信订阅号

官方微信公众号

官方微信公众号

客服服务热线:

0519-80699907

常州-总部:常州溧阳市天目云谷3#楼北201B/201C

南京-分部:南京市栖霞区仙林大道181号5幢2220/2221室

邮编:213300 Email:tjy@uisrc.com

Copyright   ©2020-2026 内容版权归©UISRC.COM    ( 苏ICP备19046771号-2 )