Zynq PS端外设(二)SD卡控制器

1. SD卡

SD卡共有9个引脚线,可工作在SDIO模式或者SPI模式。

  • SDIO模式:用到CLK、CMD、DAT[3:0]六根信号线;
  • SPI模式:用到CS(SDIO_DAT[3])、CLK(SDIO_CLK)、MISO(SDIO_DAT[0])、MOSI(SDIO_CMD)四根信号线
  • SD卡分类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. Micro SD卡

Micro SD卡,又称为TF卡,体积更小,其操作时序和SD卡一样。
标准SD卡2.0版本中,工作时钟频率可以达到50MHz,在SDIO模式下采用4位数据位宽,理论上可以达到200Mbps(50MHz x 4bit)的传输速率;在SPI模式下采用1位数据位宽,理论上可以达到50Mbps的传输速率。

在这里插入图片描述

在这里插入图片描述

3. Zynq的SD卡控制器

Zynq内部集成了两个SD卡控制器,并且Xilinx SDK 的standalone 已经移植好了FATFS文件系统(SDK 软件中叫做xilffs),因此在SDK中添加xilffs 库后,就可以在程序中使用FATFS 中的API函数来操作SD卡。

  • FATFS文件系统:FATFS是一个完全开源免费的 FA T 文件系统模块,专门为小型的嵌入式系统而设计;支持 FAT12/FAT16 和 FAT32 文件系统。
  • FATFS 模块提供的是 ff.c 和 ff.h
    FATFS开源地址
  • 系统配置
system
	-> SD0 		// MIO40..MIO45
	-> SD0.CD	// MIO10(参考硬件原理图) SD.CD信号是TF卡检测信号,用于标志开发板是否连接了TF卡。
	# Bank1的IO电压为1.8V

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. SDK开发

  1. 添加FATFS库
    注意:先关闭 system.mss 的界面,再添加 FATFS库,否则有可能导致 FATFS 库添加失败。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

use _lfn 用于设置是否使能长文件名以及文件名的小写字母,这里将 use _lfn 设置为 true

在这里插入图片描述

添加完成后,libsrc 一栏下会多出FATFS的库函数。

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

#define FILE_NAME "abcd.txt"                //定义文件名

const char src_str[30] = "1234ABCD"; //定义文本内容
static FATFS fatfs;                         //文件系统

//初始化文件系统
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()
{
    FRESULT status;
    //初始化文件系统(挂载SD卡,如果挂载不成功,则格式化SD卡)
    status = platform_init_fs();
    if(status){
        xil_printf("ERROR: f_mount 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;         //文件对象
    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;
}

//main函数
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卡写数据
    sd_write_data(FILE_NAME,(u32)src_str,len);
    //SD卡读数据
    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. 在使用任何其它文件系统函数之前,必须先对 TF卡进行挂载,通过sd_mount()函数实现挂载TF卡
  2. 通过 sd_write_data() 函数和 sd_read_data() 函数对TF卡中的txt文本进行写入和读出
  • 写入文本之前,先通过 f_open() 函数打开一个文件名为“abcd.txt ”的文件,如果不存在,则在TF卡中创建该文件。
  • 随后通过 f_lseek 函数移动已打开文件对象的读写指针,为 0 则代表移动到文件的开头位置。
  • 接下来通过 f_write 函数向打开的文件中写入数据,写完之后则通过 f_close 函数关闭该文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值