您当前的位置: 首页 > 

FPGA硅农

暂无认证

  • 1浏览

    0关注

    282博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ZYNQ裸机读写SD卡

FPGA硅农 发布时间:2020-12-08 10:23:39 ,浏览量:1

实验环境 vivado2017.3 xc7z010clg400-1

1.block design

1.点击create block design,添加zynq ip核 在这里插入图片描述 2.配置zynq ip核 i.因为不涉及PL部分,取消勾选下面两个选项 在这里插入图片描述 ii.勾选SD0和UART1 在这里插入图片描述 iii.bank1电压设置为1.8V(不要选CD,因为我的开发板原理图上没有CD,但是网上其他教程有的勾选了,我勾选后读取SD卡会失败,why??) 在这里插入图片描述

iiii.取消PL端的clk 在这里插入图片描述 iiiii.选择DDR型号 在这里插入图片描述 3.run block automation,validate design,generate output products,create hdl wrapper 4.generate bitstream 5.file->export->export hardware 6.file->launch sdk

2.Xilinx SDK

1.新建一个工程模板 2.右键test_bsp,进行BSP设置 在这里插入图片描述 3.勾选xilffs库,然后点击xilffs进行设置 在这里插入图片描述 4.设置xilffs支持长文件名 在这里插入图片描述 5.复制如下代码到源文件:

/*
 * main.c
 *
 *  Created on: 2016年8月20日
 *      Author: hsp
 *  本文件实现SD写入一段字符串,然后从其中读出并打印到串口。
 *
 */

#include 
#include "platform.h"
#include "xparameters.h"

#include "xil_printf.h"
#include "ff.h"
#include "xdevcfg.h"

static FATFS fatfs;

int SD_Init()
{
    FRESULT rc;

    rc = f_mount(&fatfs,"",0);
    if(rc)
    {
        xil_printf("ERROR : f_mount returned %d\r\n",rc);
        return XST_FAILURE;
    }
    return XST_SUCCESS;
}

int SD_Transfer_read(char *FileName,u32 DestinationAddress,u32 ByteLength)
{
    FIL fil;
    FRESULT rc;
    UINT br;

    rc = f_open(&fil,FileName,FA_READ);
    if(rc)
    {
        xil_printf("ERROR : f_open returned %d\r\n",rc);
        return XST_FAILURE;
    }
    rc = f_lseek(&fil, 0);
    if(rc)
    {
        xil_printf("ERROR : f_lseek returned %d\r\n",rc);
        return XST_FAILURE;
    }
    rc = f_read(&fil, (void*)DestinationAddress,ByteLength,&br);
    if(rc)
    {
        xil_printf("ERROR : f_read returned %d\r\n",rc);
        return XST_FAILURE;
    }
    rc = f_close(&fil);
    if(rc)
    {
        xil_printf(" ERROR : f_close returned %d\r\n", rc);
        return XST_FAILURE;
    }
    return XST_SUCCESS;
}

int SD_Transfer_write(char *FileName,u32 SourceAddress,u32 ByteLength)
{
    FIL fil;
    FRESULT rc;
    UINT bw;

    rc = f_open(&fil,FileName,FA_CREATE_ALWAYS | FA_WRITE);
    if(rc)
    {
        xil_printf("ERROR : f_open returned %d\r\n",rc);
        return XST_FAILURE;
    }
    rc = f_lseek(&fil, 0);
    if(rc)
    {
        xil_printf("ERROR : f_lseek returned %d\r\n",rc);
        return XST_FAILURE;
    }
    rc = f_write(&fil,(void*) SourceAddress,ByteLength,&bw);
    if(rc)
    {
        xil_printf("ERROR : f_write returned %d\r\n", rc);
        return XST_FAILURE;
    }
    rc = f_close(&fil);
    if(rc){
        xil_printf("ERROR : f_close returned %d\r\n",rc);
        return XST_FAILURE;
    }
    return XST_SUCCESS;
}

#define FILE "test.txt"

int main()
{
    init_platform();

    const char src_str[] = "hsp test sd card write and read!";
    u32 len = strlen(src_str);

    SD_Init();
    SD_Transfer_write(FILE,(u32)src_str,(len+1));//当直接指定len时没有写出,需要指定较大的长度才会写出,原因未知

    char dest_str[33];//len            
关注
打赏
1658642721
查看更多评论
0.0366s