赞
踩
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;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。