ZYNQ学习之旅--PS_SDCARD(PS读写SD卡)

简介

SD 卡的英文全称是 Secure Digital Card,即安全数字卡(又叫安全数码卡),是在 MMC (MultimediaCard,多媒体卡)的基础上发展而来,主要增加了两个特色:更高的安全性和更快的读写速度。SD 卡和 MMC卡的长度和宽度都是 32mm x 24mm,不同的是,SD 卡的厚度为 2.1mm,而 MMC 卡的厚度为 1.4mm,SD卡比 MMC 卡略厚,以容纳更大容量的存贮单元,同时 SD 卡比 MMC 卡触点引脚要多,且在侧面多了一个写保护开关。SD 卡与 MMC 卡保持着向上兼容,也就是说,MMC 卡可以被新的 SD 设备存取,兼容性则取决于应用软件,但 SD 卡却不可以被 MMC 设备存取。SD 卡和 MMC 卡可通过卡片上面的标注进行区分,如下图左侧图片上面标注为“MultiMediaCard”字母样式的为 MMC 卡,右侧图片上面标注为“SD”字母样式的为 SD 卡。
在这里插入图片描述
上图中右侧图片的 SD 卡实际上为 SDHC 卡,SD 卡从存储容量上分为 3 个级别,分别为:SD 卡、SDHC卡(Secure Digital High Capacity,高容量安全数字卡)和 SDXC 卡(SD eXtended Capacity,容量扩大化的安全存储卡)。SD 卡在 MMC 卡的基础上发展而来,使用 FAT12/FAT16 文件系统,SD 卡采用 SD1.0 协议规范,该协议规定了 SD 卡的最大存储容量为 2GB;SDHC 卡是大容量存储 SD 卡,使用 FAT32 文件系统,SDHC 卡采用 SD2.0 协议规范,该协议规定了 SDHC 卡的存储容量范围为 2GB 至 32GB;SDXC 卡是新提出的标准,不同于 SD 卡和 SDHC 卡使用的 FAT 文件系统,SDXC 卡使用 exFAT 文件系统,即扩展 FAT 文件系统。SDXC 卡采用 SD3.0 协议规范,该协议规定了 SDXC 卡的存储容量范围为 32GB 至 2TB(2048GB),一般用于中高端单反相机和高清摄像机。
下表为不同类型的 SD 卡采用的协议规范、容量等级及支持的文件系统。
在这里插入图片描述
不同协议规范的 SD 卡有着不同速度等级的表示方法。在 SD1.0 协议规范中(现在用的较少),使用
“X”表示不同的速度等级;在 SD2.0 协议规范中,使用 SpeedClass 表示不同的速度等级;SD3.0 协议规范使用 UHS (Ultra High Speed)表示不同的速度等级。SD2.0 规范中对 SD 卡的速度等级划分为普通卡(Class2、Class4、Class6)和高速卡(Class10);SD3.0 规范对 SD 卡的速度等级划分为 UHS 速度等级 1 和 3。

FAT文件系统

FATFS 是一个完全开源免费的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准 C
语言编写,所以具有良好的硬件平台独立性,可以很方便的移植到各种嵌入式处理器中。Xilinx SDK 的
standalone 已经移植好了 FATFS 文件系统,因此在 SDK 中添加 xilffs 库后,就可以在程序中使用 FATFS 中
的 API 函数来操作 SD 卡。
FATFS 的特点如下:
1、 结构清晰,代码量少,文件系统和 IO 底层分开,特别适合新手入门学习;
2、 支持最多 10 个逻辑盘符和两级文件夹;
3、 支持 FAT12/FAT16 和 FAT32 文件系统;
4、 支持长文件名称。
FATFS 的这些特点,加上开源、免费的原则,使得 FATFS 的应用非常广泛。FATFS 模块的层次结构如
图 所示:
在这里插入图片描述
最顶层是应用层,使用者无需理会 FATFS 的内部结构和复杂的 FAT 协议,只需要调用 FATFS 模块提
供给用户的一系列应用接口函数,如 f_open,f_read,f_write 和 f_close 等,就可以像在 PC 上读/写文件那样简单。
中间层 FATFS 模块,实现了 FAT 文件读/写协议。FATFS 模块提供的是 ff.c 和 ff.h。除非有必要,使
用者一般不用修改,使用时将头文件直接包含进去即可。
FATFS 模块提供的底层接口,它包括存储媒介读/写接口(disk I/O)和供给文件创建修改时间的实时
时钟。关于 FATFS 源码以及 API 函数的介绍,大家可以在:http://elm-chan.org/fsw/ff/00index_e.html

BD设计

在这里插入图片描述
把zynq核里面的sd卡配置好就可以了。

软件设计

#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] = "vest.txt"; // name of the log

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

char s[] = "hello world!";
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*) s,strlen(s),&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*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, strlen(s));
	if (result!=0)
	{
		return XST_FAILURE;
	}
	xil_printf("SD CARD  written Successfully\r\n");

//-----------------------read test data ------------------------------------------
	result=SD_read(FileName, RD_Buf, strlen(s));
	if (result!=0)
	{
		return XST_FAILURE;
	}
	xil_printf("SD CARD Data read Successfully\r\n");

//-----------------------check data-----------------------------------------------
	for(i=0; i<strlen(s);i++)
	{
		xil_printf("%c\n",RD_Buf[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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值