VIVADO 7.ZYNQ读取SD卡

环境:VIVADO 2018.2.

SD卡文件系统格式FAT32.

1.PS IP配置

勾选SD0,MIO根据子的开发板配置好,WP(写保护)不要勾选。此处,生成bit流和导出步骤省略。

VIVADO 7.ZYNQ读取SD卡_第1张图片

2.建立SDK工程

1>新建一个空的sdk工程,右键bsp工程->Board Support Package Setting。

VIVADO 7.ZYNQ读取SD卡_第2张图片

2>勾选xilffs。

VIVADO 7.ZYNQ读取SD卡_第3张图片

这里有个属性需要注意,use_lfn,使能长文件名的支持,一开始默认false。

VIVADO 7.ZYNQ读取SD卡_第4张图片

我遇到了这个问题,结果如下。读取“yolo2tiny_weight0_6_10.bin”这个文件失败,在将use_lfn选为true后,正确读取。

VIVADO 7.ZYNQ读取SD卡_第5张图片

3.代码

/*
 * 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+1000));//当直接指定len时没有写出,需要指定较大的长度才会写出,原因未知

    char dest_str[33];//len<=33
    SD_Init();
    SD_Transfer_read(FILE,(u32)dest_str,(len+1));

    xil_printf("%s\r\n",dest_str);
    print("SD write and read over!\r\n");

    cleanup_platform();
    return 0;
}

参考:https://blog.csdn.net/baidu_37503452/article/details/86704591

你可能感兴趣的:(vivado,sdk)