基于ZYNQ的SD卡的访问

参考文献

[1].V3学院

项目简述

现在FPGA板卡上面常用的存储设备是SD卡,也经常将BOOT文件下载到SD卡中启动。那么这篇文章我们将讲解使用API函数来进行SD卡的读写,当然使用纯FPGA写Verilog也是可以读写SD卡,遵循SPI协议,后面的文章我们会进行相应的介绍,这篇文章先来讲解简单的C语言访问SD卡。

工程描述:ZYNQ利用FAT文件系统对SD卡些一张图片。

本次实验所用到的软硬件环境如下:
1、VIVADO 2019.1
2、米联客MZ7015FA开发板

FAT文件架构简述

本片博客我们将利用开源的FAT文件系统架构,介绍及维护这个系统的网址如下:FAT。打开这个网址,我们便可以看到如下信息:
在这里插入图片描述
点开每一个函数都有详细的参数说明及例子:
在这里插入图片描述
在这里插入图片描述
同学们可以主要通过上面的例子进行相应的学习,了解每个函数的功能。这里注意上面的介绍非常详细,尤其是示例工程。

那么学习到这里的同学或许会问,我们明白了上面函数的作用,那么我们如何将上面的系统框架引用到ZYNQ中呢?因为我们直接写相应的FAT中的函数,ZYNQ肯定不会识别的,这里我们将给出详细的操作步骤。
首先右击相应工程的bsp文件,选择Board Support Package Setting
在这里插入图片描述
然后点击相应的xilffs
在这里插入图片描述
然后重新生成相应的bsp文件即可。接下来我们对常用的函数进行简单的介绍:

//挂载的函数
   
   //The f_mount fucntion registers/unregisters filesystem object to the FatFs module.
FRESULT f_mount (
  FATFS*       fs,    /* [IN] Filesystem object */
  const TCHAR* path,  /* [IN] Logical drive number */
  BYTE         opt    /* [IN] Initialization option */
);

//The f_open function opens a file.
FRESULT f_open (
  FIL* fp,           /* [OUT] Pointer to the file object structure */
  const TCHAR* path, /* [IN] File name */
  BYTE mode          /* [IN] Mode flags */
);

//The f_write writes data to a file.
FRESULT f_write (
  FIL* fp,          /* [IN] Pointer to the file object structure */
  const void* buff, /* [IN] Pointer to the data to be written */
  UINT btw,         /* [IN] Number of bytes to write */
  UINT* bw          /* [OUT] Pointer to the variable to return number of bytes written */
);

//The f_read function reads data from a file.
FRESULT f_read (
  FIL* fp,     /* [IN] File object */
  void* buff,  /* [OUT] Buffer to store read data */
  UINT btr,    /* [IN] Number of bytes to read */
  UINT* br     /* [OUT] Number of bytes read */
);


//The f_sync function flushes the cached information of a writing file.
FRESULT f_sync (
  FIL* fp     /* [IN] File object */
);

//The f_close function closes an open file.
FRESULT f_close (
  FIL* fp     /* [IN] Pointer to the file object */
);

这里需要特别注意f_sync函数,是将
至于上面函数中每个参数的作用,同学们可以打开博客中上面的连接进行学习,上面的介绍非常详细。

bmp图像数据格式

bmp图像主要由下面结构组成:
1、文件头结构
2、信息头结构
3、颜色表
4、像素数据
对于bmp格式的24位真彩图,上面的颜色表信息为空,因为24位不需要颜色表的映射。至于每个结构里面具体的信息,我们给出相应的头文件,可以学习上面的注释。

### 实现 Zynq 平台通过 SD 接口读取图片文件 要在 Zynq 平台上通过 SD 接口成功读取图片文件,需完成以下几个方面的配置和编程: #### 配置硬件资源 在 Vivado 中创建并打开工程后,进入 Block Design 页面。由于实验涉及从 SD 读取数据,需要启用 `SD0` 接口功能。双击 `ZYNQ7 Processing System` 打开其设置界面,并找到与 SD 相关的选项,将其使能[^1]。 #### 软件环境准备 为了简化开发流程,Xilinx 提供了针对 SD 的驱动支持以及 FAT 文件系统的移植工作。这意味着无需手动编写底层驱动代码即可实现对 SD的操作。只需引入 `xilffs.h` 头文件及相关库文件至项目中,便可利用 FATFS 模块提供的 API 完成文件访问任务[^2]。 以下是基于 Xilinx SDK 开发环境下的一段典型 C/C++ 示例代码用于演示如何加载存储于 SD 上的图像文件: ```c #include "xparameters.h" #include "xil_io.h" #include "ff.h" #define DRIVE_NUMBER 0 // 设定为第一个逻辑盘符 (通常是 '0:') int main(){ FRESULT res; FIL fil; /* File object */ UINT br, bw; // 初始化FatFs模块 if(f_mount(&fs, "", 0)){ printf("Mount failed.\n"); return -1; } // 打开指定路径下的jpg文件 res = f_open(&fil,"/myimage.jpg", FA_READ); if(res != FR_OK){ printf("Failed to open file [%d]\n",res); return -1; } // 假设已分配足够的缓冲区空间来保存整个图像内容 unsigned char *buffer = malloc(IMAGE_SIZE); // 将文件全部内容复制到内存缓存区内 res=f_read(&fil, buffer, IMAGE_SIZE,&br); if((res!=FR_OK)||(br!=IMAGE_SIZE)){ free(buffer); f_close(&fil); return -1; } // 此处可以加入进一步处理该图像数据的相关算法... // 关闭当前正在使用的句柄对象 f_close(&fil); return 0; } ``` 上述源码片段展示了标准流程:初始化 FatFs 系统;尝试打开目标 JPG 图像文件;验证操作状态无误后再执行实际的数据传输动作;最后记得释放所占用的一切软硬件资源。 如果遇到持续性的错误提示或者根本无法正常识别介质,则可能是物理连接存在问题或者是某些参数设定不当所致[^3]。此时建议重新核查电路板布局是否正确匹配官方文档说明的要求,同时确认 BIOS 或其他启动脚本里有关外部储存器的支持状况也处于激活状态之下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值