zynq读写SD卡

zynq读写SD卡实验
SD卡有三种类型:
    SD:使用SD1.0协议,容量等级小于2GB,支持文件系统为FAT12,FAT16;
    SDHC(高容量安全数字卡):使用SD2.0协议,容量等级为2G到32GB,支持文件系统FAT32;
    SDXC(容量扩大化的安全存储卡):使用SD3.0协议,容量等级为32GB到2TB,支持文件系统为exFAT;
不同协议的SD卡有着不同表示写入速度等级的表示方法。
         SD1.0:使用X表示;
         SD2.0:用CLASS 表示,如CLASS2,后面的数字表示多少MB每秒;
         SD3.0:使用UHS表示,标志1表示10MB每秒。
SD可工作于SDIO模式或者SPI模式,具体可百度
除标准SD卡,还有TF卡(Micro SD),手机用的便是。
        ZYNQ 中的 SD 卡控制器符合 SD2.0 协议规范,接口兼容 eMMC、MMC3.31、SDIO2.0、SD2.0、SPI,支持 SDHC、SDHS 器件。SD 卡控制器支持 SDMA(单操作 DMA)、ADMA1(4K 边界限制 DMA)和ADMA2(在 32 位系统中允许任何位置和任意大小)。ARM 处理器通过 AHB 总线访问 SD 卡控制器,SD控制器采用读和写通道各自双缓冲 FIFO 的机制提高吞吐带宽。
具体操作过程:        

        本次实验在 ZYNQ 嵌入式最小系统的基础上,添加了 SD 卡控制器,用于驱动 TF 卡。需要说明的是,TF 卡连接的是 PS 的 MIO 端口,需要注意的是,TF 卡的引脚连接到 ZYNQ 的 Bank 1 端口(BANK501),Bank 1 的 IO 电压为 1.8V,因此在 MIO 的配置界面将 Bank1 的电压改为“LVCMOS 1.8V”。勾选了 CD 信号,CD 信号用于指示当前开发板有没有连接 TF 卡,这里勾选中 CD 信号,并将引脚分配至 MIO 10。

        在菜单栏中选择 File->New->Application Project,新建一个 SDK 应用工程。
在弹出的界面中工程名命名为 micro_sd_rw,点击“NEXT”,选择“Empty Application”,点击“Finish”按钮完成 SDK 应用工程的创建。
        接下来添加 FATFS 库。右击 micro_sd_rw_bsp,选择“Board Support Package Setting”。在弹出的界面中勾选“xilffs”,勾选后,会在左侧 Overview 的 standalone 一栏出现 xilffs,点击 xilffs。可以看到 use_lfn 的默认设置为
false,即不使能。use_lfn 用于设置是否使能长文件名以及文件名的小写字母,这里将 use_lfn 设置为 true,点击“OK”按钮完成设置。

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

static FATFS fatfs; //文件系统
const char src_str[30] = "time is money"; //定义文本内容
#define    FILE_NAME    "start.txt"          //定义文件名

//初始化文件系统
int platform_init_fs()
{
	FRESULT status;
	TCHAR* path = "0:/";
	BYTE work[FF_MAX_SS]; //工作区域
	//注册一个工作区(挂载分区文件系统),在使用任何其他文件函数之前,必须使用f_mount为每个使用卷分配一个工作区
	status = f_mount(&fatfs, path, 1); //挂载 SD 卡
    if(status != FR_OK)
    {
    	xil_printf("Volume is not FAT formated; formating FAT\r\n");
    	//格式化SD卡
    	status = f_mkfs(path, FM_FAT32,0, work, sizeof work);
    	if (status != FR_OK)
    	{
    	    xil_printf("Unable to format FATfs\r\n");
    	    return -1;
    	}
    	//格式化之后,重新挂载 SD 卡
    	status = f_mount(&fatfs, path, 1);
    	if (status != FR_OK) {
    	xil_printf("Unable to mount FATfs\r\n");
    	return -1;
    	}
    }
    return 0;

}
//挂载 SD(TF)卡
int sd_mount()
{
	int status;
	//初始化文件系统(挂载SD卡,如果挂载不成功,则格式化SD卡)
	status = platform_init_fs();
	if(status)
	{
		xil_printf("error: f_mont returned %d!\n",status);
		return XST_FAILURE;
	}
	return XST_SUCCESS;
}
//SD 卡写数据
int sd_write_data(char *file_name,u32 src_addr,u32 byte_len)
{
	FIL fil;        /* File object */
	UINT bw; //f_write 函数返回已写入的字节数

	//打开一个文件,如果不存在,就创建一个新文件
	f_open(&fil, file_name, FA_CREATE_ALWAYS|FA_WRITE);
	//移动打开的文件对象的文件读/写指针 0:指向文件开头
	f_lseek(&fil,0);
	//写入数据
	f_write (&fil, (void*)src_addr,byte_len,&bw);
	//关闭文件
	f_close(&fil);
	return 0;
}
//SD 卡读数据
int sd_read_data(char *file_name,u32 src_addr,u32 byte_len)
{
 FIL fil; //文件对象
 UINT br; //f_read 函数返回已读出的字节数

 //打开一个只读的文件
 f_open(&fil,file_name,FA_READ);
 //移动打开的文件对象的文件读/写指针 0:指向文件开头
 f_lseek(&fil,0);
 //从 SD 卡中读出数据
 f_read(&fil,(void*)src_addr,byte_len,&br);
 //关闭文件
 f_close(&fil);
 return 0;
}
int main()
{
	int status,len;
	char dest_str[30] = "";
	status = sd_mount(); //挂载 SD 卡
	if(status != XST_SUCCESS)
	{
		xil_printf("Failed to open SD card!\n");
		return 0;
	}
	else
		xil_printf("Success to open SD card!\n");
	len = strlen(src_str); //计算字符串长度
	sd_write_data(FILE_NAME,(u32)src_str,len); //写入数据
	sd_read_data(FILE_NAME,(u32)dest_str,len); //读取数据

	if(strcmp(src_str, dest_str) == 0)
		xil_printf("src_str is equal to dest_str,SD card test success!\n");
	else
		xil_printf("src_str is not equal to dest_str,SD card test failed!\n");

	return 0;
}

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值