FPGA之SD卡基础知识(1)

开发板要用到SD卡,所以先来学习一下基本知识。

参考pdf:ZYNQ小系统板之嵌入式SDK开发指南

SD卡

SD卡,即Secure Digital Card,是在MMC卡(Multimedia Card)上发展而来,主要增加了两个特色:更高的安全性和更快的读写速度。

SD卡和MMC卡的大小都是32mm×24mm,但两者厚度不同,分别为2.1mm与1.4mm。略厚的SD卡可以容纳更大容量的存贮单元,同时,SD卡比MMC卡触电引脚要多,且在侧面多了一个写保护开关。

SD卡与MMC卡保持着向上兼容,即,MMC卡可以被新的SD设备存取,兼容性则却决于应用软件,但SD卡却不可以被MMC设备存取。

标准SD卡外,还有Micro SD卡(原名TF卡),是一种极细小的快闪存储器卡,是由 SanDisk(闪

迪)公司发明,主要用于移动手机。MicroSD 卡插入适配器(Adapter)可以转换成 SD 卡,其操作
时序和 SD卡是一样的。

类别

SD卡从存储容量上分为3个等级,分别为:SD卡,SDHC卡(Secure Digital High Capacity)和SDXC卡(SD eXtended Capacity)。

速度等级

不同协议规范的SD卡有着不同速度等级的表示方法。

SD1.0协议规范中,使用“X”表示不同的速度等级。

SD2.0协议规范中,使用SpeedClass表示不同的速度等级。划分为普通卡(Class2、Class4、Class6)和高速卡(Class10)。

SD3.0协议规范中,使用UHS(Ultra High Speed)表示不同的速度等级。划分为UHS速度等级1和3。

接口及引脚

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

在SDIO模式下,共用到CLK、CMD、DAT[3:0]六根信号线;

在SPI模式下,共用到CS(SDIO_DA[3])CLK(SDIO_CLK)MISO(SDIO_DAT[0])MOSI(SDIO_CMD)四根信号线。

MicroSD 卡接口定义以及各引脚功能说明如下图所示。

工作频率

标准SD卡2.0版本中,工作时钟频率可以达到50MHz

在SDIO模式下,采用4位数据位宽,理论上可以达到200Mbps(50M×4bit)的传输速率;

在SPI模式下采用1位数据位宽,理论上可以达到50Mbps的传输速率。

因此,SD卡在SDIO模式下的传输速率更快,同时其操作时序也更复杂。

ZYNQ内部集成了两个SD卡控制器,并且Xilinx SDK的standalone已经移植好了FATFS(SDK软件中叫做xilffs)文件系统

因此在SDK中添加xilffs库后,就可以在程序中使用FATFS中的API函数来操作SD卡。

SD卡控制器

SD/SDIO Controller

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控制器采用读和写通道各自双缓冲FIFIO的机制提高吞吐带宽。

黑猫带你学eMMC协议第1篇:全网最全emmc协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)-CSDN博客

SD控制器读写通道采用独立的512字节深度的双缓冲FIFO执行读和写操作。

在写操作时,处理器向其中一个FIFO写数据,将另一个FIFO的数据写到SD总线;

在读操作时,SD总线上的数据向其中一个FIFO写数据,处理器将数据从另一个FIFO读出数据。

SD卡控制器通过双缓冲机制以保证最大带宽。

FATFS文件系统

FATFS是一个完全开源免费的FAT文件系统模块,用C语言编写。方便移植到嵌入式处理器中。

在Xilinx SDK中添加xilffs库后,就可以在程序中使用FATFS中的API函数来操作SD卡。

FATFS的特点为:

1. 结构清晰,代码量少,文件系统和IO底层分开

2. 支持最多10个逻辑盘符和两级文件夹

3. 支持FAT12/FAT16和FAT32文件系统

4. 支持长文件名称

FATFS模块的层次结构如下图所示。

应用层:只需调用FATFS模块提供给用户的一系列应用接口函数,如f_open, f_read, f_write, f_close等。无需了解FATFS的内部结构和FAT协议。

中间层:实现了FAT文件读/写协议。FATFS模块提供的是ff.s, ff.h

底层接口:包括存储媒介读/写接口(disk I/O)和供给文件创建修改时间的实时时钟。

FATFS源码及API函数的介绍:FatFs - Generic FAT Filesystem Module

ZYNQ实现SD卡读写

zynq7系列,TF卡

1. 新建IP时,zynq选择SD卡,并且选择CD与WP信号。

2. 在SDK中,先关闭system.mss,再添加FATFS库,否则可能导致FATFS库添加失败。

3. 右键_bsp,选择Board Support Package Setting,勾选xilffs。在standalone中点击xilffs,看到use_lfn的默认设置为false,即不使能。use_lfn用于设置是否使能长文件名以及文件名的小写字母,可以设置为true。

之后,在_bsp --> ps_cortexa9_0 --> libsrc下,会有FATFS的库函数。

4. 在main.c中添加代码

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

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

const char src_str[30] = "www.openedv.com"; //定义文本内容
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;
}

 

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA的设计开发中,使用SD卡作为外部存储设备是很常见的。SD卡是一种方便、经济且实用的选择,特别适用于那些需要存储大量数据的系统。SD卡有不同的存储容量级别,包括SD卡、SDHC卡(高容量安全数字卡)和SDXC卡(容量扩大化的安全存储卡)\[2\]。SD卡具有体积小、传输速度快、支持热插拨等特点,它是在MMC(多媒体卡)的基础上发展而来,增加了更高的安全性和更快的读写速度\[3\]。在FPGA中使用SD卡,可以通过相应的协议规范和命令来进行存储操作\[1\]\[3\]。 #### 引用[.reference_title] - *1* [提高面试技能——FPGASD卡的应用](https://blog.csdn.net/2301_78484069/article/details/131588195)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [学习笔记——基于FPGASD卡学习(1)](https://blog.csdn.net/qq_43489868/article/details/125659658)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SD卡相关应用](https://blog.csdn.net/gemengxia/article/details/115492703)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值