首先说明下我自己遇到的几个问题:
(1)Block Design:sd卡在vivado驱动的过程中进行管脚分配,一定要主意好自己的板子的串口和sd卡对应的引脚,并分配好对应bank的电平。如下:
(2)再就是在sdk中添加fatfs文件系统的过程:
添加好对应的文件系统后,在自己的对应的工程文件添加main.c文件,进行程序验证就可,因为sd卡的文本读写实验并没用到pl端,因此只需要运行ps端即可。
程序如下(运行效果两个都可以):
#include "stdio.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "ff.h"
#include "sleep.h"#define FILE_NAME "YYH.txt"char DATA_WRITE[100] = "Hello the beautiful world!";
//http://elm-chan.org/fsw/ff/doc/read.html fatfs文件系统的函数指南FATFS fs;//结构体void sd_mount()
{//判断返回值FRESULT status;//挂载sd卡逻辑磁盘(注册文件对象)//此时如果挂载失败则需要格式化sd卡再重新挂载status = f_mount(&fs, "", 1);BYTE work[FF_MAX_SS];if(status != FR_OK){printf("sd卡挂载未成功,不是fat格式,需要格式化");f_mkfs("", FM_FAT32 , 0, work, sizeof work);//重新对sd卡进行挂载f_mount(&fs, "", 1);}
}void sd_write_data(char DATA_WRITE[],u32 wr_lenth)
{FIL fil; /* File object */UINT bw;//打开(创建)文件 _mode是需要创建(覆盖),可读也可写f_open(&fil,FILE_NAME, FA_CREATE_ALWAYS | FA_READ | FA_WRITE);//移动读写指针,确定写入数据的位置f_lseek(&fil,0);//写入数据f_write(&fil,DATA_WRITE,wr_lenth,&bw);//关闭文件f_close(&fil);}void sd_read_data(char DATA_READ[],u32 rd_lenth)
{FIL fil; /* File object */UINT br;//打开(创建)文件 此时_mode是需要可读就可以f_open(&fil,FILE_NAME,FA_READ);//移动读写指针,确定写入数据的位置f_lseek(&fil,0);//读出数据f_read(&fil,DATA_READ,rd_lenth,&br);//关闭文件f_close(&fil);}int main()
{u32 len = 0;char data_read[100] = ""; //初始化//挂载sd卡逻辑磁盘(注册文件对象) 如果挂载失败则需要格式化sd卡再重新挂载sd_mount();//f_mount(&fs, "", 1);//向sd卡中写入数据len = strlen(DATA_WRITE);sd_write_data(DATA_WRITE,len);//从sd卡中读出数据sd_read_data(data_read,len);//比较写入和读出的数据是否一致if(strcmp(DATA_WRITE,data_read) == 0){printf("DATA_WRITE is equal to data_read.");printf("\n\r");printf("SD card test is success.");printf("\n\r");}else{printf("DATA_WRITE is not equal to data_read.");printf("\n\r");printf("SD card test is fail.");printf("\n\r");}return 0;
}
#include "stdio.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "ff.h"
#include "sleep.h"#define FILE_NAME "YYH.txt"char DATA_WRITE[100] = "Hello the beautiful world!";
//http://elm-chan.org/fsw/ff/doc/read.html fatfs文件系统的函数指南
FATFS fs;void sd_mount()
{//判断返回值FRESULT status;//挂载sd卡逻辑磁盘(注册文件对象)//此时如果挂载失败则需要格式化sd卡再重新挂载status = f_mount(&fs, "", 1);BYTE work[FF_MAX_SS];if(status!=FR_OK){printf("sd卡挂载未成功,不是fat格式,需要格式化");f_mkfs("", FM_FAT32 , 0, work, sizeof work);//重新对sd卡进行挂载f_mount(&fs, "", 1);}
}void sd_write_data(char DATA_WRITE[],u32 wr_lenth)
{FIL fil; /* File object */UINT bw;//打开(创建)文件 _mode是需要创建(覆盖),可读也可写f_open(&fil,FILE_NAME, FA_CREATE_ALWAYS | FA_READ | FA_WRITE);//移动读写指针,确定写入数据的位置f_lseek(&fil,0);//写入数据f_write(&fil,DATA_WRITE,wr_lenth,&bw);//关闭文件f_close(&fil);}void sd_read_data(char DATA_READ[],u32 rd_lenth)
{FIL fil; /* File object */UINT br;//打开(创建)文件 此时_mode是需要可读就可以f_open(&fil,FILE_NAME,FA_READ);//移动读写指针,确定写入数据的位置f_lseek(&fil,0);//读出数据f_read(&fil,DATA_READ,rd_lenth,&br);//关闭文件f_close(&fil);}int main()
{u32 len;char data_read[100] = ""; //初始化//fs = malloc(sizeof (FATFS)); /* 动态分配内存 *///挂载sd卡逻辑磁盘(注册文件对象) 如果挂载失败则需要格式化sd卡再重新挂载sd_mount();//向sd卡中写入数据len = strlen(DATA_WRITE);sd_write_data(DATA_WRITE,len);//从sd卡中读出数据sd_read_data(data_read,len);//比较写入和读出的数据是否一致if(strcmp(DATA_WRITE,data_read) == 0){printf("DATA_WRITE is equal to data_read.");printf("SD card test is success.");printf("/n/r");}else{printf("DATA_WRITE is equal to data_read.");printf("SD card test is fail.");printf("/n/r");}return 0;
}
运行结果对应如下:
参考链接如下:
ZYNQ-使用SD卡读写文本数据_zynq读写txt文件-CSDN博客
Xilinx ZYNQ学习笔记(一)——使用PS读写SD卡_zynq sd卡读写-CSDN博客
ZYNQ实验——SD卡读写TXT文本_zynq如何读写txt文件-CSDN博客
fatfs文件系统函数参考:http://elm-chan.org/fsw/ff/doc/mkfs.html