micro SD控制——zynq(未完)

文章目录

    • 一、SD基础知识
    • 二、SD卡控制器
    • 三、文件系统(FATFS)
    • 四、 SD卡控制任务:
      • 4.1 txt文本任务:
        • 4.1.1 硬件部分:
        • 4.1.2 软件部分:
          • 1.板级支持包中加入FATFS文件系统
          • 2.C设计

一、SD基础知识

1.SD卡的类型、协议规范、容量等级及支持的文件系统
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

Micro SD卡,是一种极细小的快闪存储器卡,MicroSD 卡插入适配器(Adapter)可以转换成 SD 卡,其操作时序和 SD卡是一样的。
在这里插入图片描述
开发板原理图如下,可知本开发板使用的是SDIO模式的SD卡。
在这里插入图片描述

标准 SD 卡 2.0 版本中,工作时钟频率可以达到 50Mhz。
在 SDIO 模式下采用 4 位数据位宽,理论上可以达到 200Mbps(50Mx4bit)的传输速率;
在 SPI 模式下采用 1 位数据位宽,理论上可以达到 50Mbps 的传输速率。
因此 SD 卡在 SDIO 模式下的传输速率更快,同时其操作时序也更复杂。

二、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 卡控制器,并且 Xilinx SDK 的 standalone 已经移植好了 FATFS(SDK 软件中叫做 xilffs)文件系统,因此在 SDK 中添加 xilffs 库后,就可以在程序中使用 FATFS 中的 API 函数来操作 SD 卡。
在这里插入图片描述
SD 控制器读写通道采用独立的 512 字节深度的双缓冲 FIFO 执行读和写操作
在写操作时,处理器向其中一个 FIFO 写数据,将另一个 FIFO 的数据写到 SD 总线;
在读操作时,SD 总线上的数据向其中一个FIFO 写数据,处理器将数据从另一个 FIFO 读出数据。
SD 卡控制器通过双缓冲机制以保证最大带宽。

三、文件系统(FATFS)

FATFS 是一个完全开源免费的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准 C语言编写,所以具有良好的硬件平台独立性,可以很方便的移植到各种嵌入式处理器中。Xilinx SDK 的standalone 已经移植好了 FATFS 文件系统,因此在 SDK 中添加 xilffs 后,就可以在程序中使用 FATFS 中的 API 函数来操作 SD 卡。

FATFS 的特点如下:
1、 结构清晰,代码量少,文件系统和 IO 底层分开,特别适合新手入门学习;
2、 支持最多 10个逻辑盘符和两级文件夹;
3、 支持 FAT12/FAT16 和 FAT32 文件系统;
4、 支持长文件名称。
在这里插入图片描述

四、 SD卡控制任务:

FATFS文件系统设计参考

4.1 txt文本任务:

通过Xilinx SDK自带的FATFS库,完成对TF卡中TXT文本读写的功能,并将读写测试结果通过串口打印出来。

4.1.1 硬件部分:

UART、SD接口、DDR3存储器
在这里插入图片描述

4.1.2 软件部分:
1.板级支持包中加入FATFS文件系统

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
出现下列bsp则说明添加成功,里面包含各种需要的函数:
在这里插入图片描述

2.C设计

流程:
在这里插入图片描述
代码:

#include "xparameters.h"
#include "xil_printf.h"
#include "ff.h"								//FATFS
#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;}elsexil_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");elsexil_printf("src_str is not equal to dest_str,SD card test failed!\n");return 0;}

结果:运行程序后,SD卡中存在名为ZDYZ的txt文件,且文件中的字符串就是我们自定义的内容。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跟着刘二大人学pytorch(第---12---节课之RNN基础篇)

文章目录 0 前言0.1 课程视频链接:0.2 课件下载地址: 1 Basic RNN1.1 复习DNN和CNN1.2 直观认识RNN1.3 RNN Cell的内部计算方式 2 具体什么是一个RNN?3 使用pytorch构造一个RNN3.1 手动构造一个RNN Cell来实现RNN3.2 直接使用torch中现有的RN…

Java项目之消息队列(手写java模拟实现mq)【七、⽹络通信协议设计、消息队列服务器端实现、客户端实现】✔ ★

⼗⼀. ⽹络通信协议设计 定义 Request / Response /** 表示一个网络通信中的请求对象. 按照自定义协议的格式来展开的*/ public class Request {private int type;private int length;private byte[] payload;public int getType() {return type;}public void setType(int typ…

简单谈谈云服务器私网IP的存在意义及优势

云服务器是基于虚拟化技术的计算资源,可以在云平台上灵活创建和管理。为了满足不同用户的需求,云服务提供商在云服务器上分配了两种类型的IP地址:公网IP和私网IP。其中,私网IP是指在局域网内使用的内部IP地址,无法通过…

机器学习(V)--无监督学习(二)主成分分析

当数据的维度很高时,很多机器学习问题变得相当困难,这种现象被称为维度灾难(curse of dimensionality)。 在很多实际的问题中,虽然训练数据是高维的,但是与学习任务相关也许仅仅是其中的一个低维子空间&am…

环形链表2证明

解法 快慢指针相遇后,其中一个指回头部,然后同步前进 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNod…

【gitcode】idea 在本地拉取和push本地代码到gitcode仓库

【首次使用】 1、idea 拉取代码,很容易这里就不记录了。 2、push代码时,总是弹窗登录输入在gitcode.com登录能成功。但是在idea 怎么都不成功。控制台提示 remote: HTTP Basic: Access denied fatal: Authentication failed for ******* 认证失败 3…

3D ToF赋能小米CyberDog 2提升视觉灵敏度

随着科技的进步,智能机器人越来越多地融入我们的日常生活。其中,CyberDog 2作为一款前沿的四足机器人,凭借其出色的视觉灵敏度和多功能技术配备,受到了广泛的关注。本文将重点探讨CyberDog 2的视觉系统,尤其是其四种不同类型的摄像头如何共同提升其视觉灵敏度,以及激光传…

uniapp实现路由拦截——遇到问题(三)

uniapp路由拦截开发过程中遇到问题 文章目录 uniapp路由拦截开发过程中遇到问题App 无法退出应用监听返回数据结构解决方式模拟原生物理返回键提示不提示,直接退出应用 微信小程序 登录成功返回页面报错效果图不同平台来源页面数据结构解决方式 App 无法退出应用 安…

HP惠普暗影精灵10 OMEN Gaming Laptop 16-wf1xxx原厂Win11系统镜像下载

惠普hp暗影精灵10笔记本电脑16-wf1000TX原装出厂Windows11,恢复开箱状态oem预装系统安装包,带恢复重置还原 适用型号:16-wf1xxx 16-wf1000TX,16-wf1023TX,16-wf1024TX,16-wf1025TX, 16-wf1026TX,16-wf1027TX,16-wf1028TX,16-wf1029TX, 16-wf1030TX,16-…

Autosar诊断-FIM模块功能介绍

文章目录 前言一、FIM模块概述二、FID概念介绍Event ID和DTC之间的关系Event ID与FID之间的关系FIM数据结构三、FiM模块与SW-C模块交互关系四、FIM模块函数调用关系FiM功能模块作用过程前言 Autosar诊断的主体为UDS(Unified Diagnostic Services)协议,即统一的诊断服务,是…

python实战根据excel的文件名称这一列的内容,找到电脑D盘的下所对应的文件位置,要求用程序实现

今天客户需要 根据excel的文件名称这一列的内容,找到电脑D盘的下所对应的文件位置,要求用程序实现 数据样例:记录.xlsx 解决代码: 1、安装必要的库: pip install pandas openpyxl2、编写Python脚本: im…

Modbus为何要转成ProfiNET

Modbus与ProfiNET代表了工业通讯不同阶段的发展,各自具有优缺点。Modbus简单易用,适合小型系统;ProfiNET高效稳定,适用于大型复杂网络。转换Modbus为ProfiNET可提高系统性能和扩展性。实际场景下,升级生产线控制器为Pr…

分享一个 .NET Core 使用选项方式读取配置内容的详细例子

前言 在 .NET Core 中,可以使用选项模式(Options Pattern)来读取和管理应用程序的配置内容。 选项模式通过创建一个 POCO(Plain Old CLR Object)来表示配置选项,并将其注册到依赖注入容器中,方…

弗洛伊德算法——C语言

弗洛伊德算法,是一种用于解决所有顶点对之间最短路径问题的经典算法,该算法通过动态规划的方法计算出从每个顶点到其他所有顶点的最短路径。 弗洛伊德算法的基本思想是逐步考虑每一个顶点作为中间点,更新所有顶点对之间的最短路径。它通过以…

js 前端 Function.prototype.call.call(0[‘toString‘], *, 16)

这个函数将 数组转任意进制 Function.prototype.call.call(0[toString], *, 16)

Oracle--存储结构

总览 一、逻辑存储结构 二、物理存储结构 1.数据文件 2.控制文件 3.日志文件 4.服务器参数文件 5.密码文件 总览 一、逻辑存储结构 数据块是Oracle逻辑存储结构中的最小的逻辑单位,一个数据库块对应一个或者多个物理块,大小由参数DB_BLOCK_SIZE决…

Java语法和基本结构介绍

Java语法和基本结构是Java编程的基础,它决定了Java代码的书写方式和程序的结构。以下是Java语法和基本结构的一些关键点: 1.标识符和关键字:Java中的标识符是用来标识变量、函数、类或其他用户自定义元素的名称。关键字是预留的标识符&#x…

[C++ STL] vector 详解

标题:[C STL] vector 详解 水墨不写bug 目录 一、背景 二、vector简介 三、vector的接口介绍 (1)默认成员函数接口 i,构造函数(constructor) ii,析构函数(destructor&#xff0…

Verilog综合出来的图

Verilog写代码时需要清楚自己综合出来的是组合逻辑、锁存器还是寄存器。 甚至,有时写的代码有误,vivado不能识别出来,这时打开综合后的schematic简单查看一下是否综合出想要的结果。 比如:误将一个always模块重复一遍,…

天翼云认证专家解决方案架构师(理论)

1.某大型互联网公司为了提升应用程序和基础设施的稳定性,计划引入自动化监控工具。以下哪些工具可以满足公司的需求? A.Grafana B.Nagios C.Prometheus D.Jenkins 2.天翼智能边缘云ECX是位于网络边缘位置的云,兼具云和CDN的特性,将计算、存…