ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能)

之所以写裸机,也就是没有操作系统的实现方法是因为linux系统下的实现方法网上已经有很多了,之前使用的STM32实现的USB MASS STORAGE的例子已经有很多,而且实现过程几乎不用写代码,使用官方工具便可实现,ZYNQ器件的例子网上却没有找到,自己实现后分享给大家,废话少说,开始吧!

一、先从原理开始吧,使用到了USB那就先介绍下USB吧,USB首先分为HOST(主设备)和Device(从设备)两大类,我们常常开发的小设备一般是属于Device类型的,Device设备可以实现很多不同的应用如下图所示:
在这里插入图片描述

具体细节可以在网站:Universal Serial Bus - Device Classes (liquisearch.com)查看,我们今天用到的便是Mass stroage,也就是大容量存储设备协议,详细内容可以看Universal Serial Bus Mass Storage Class,或者看下USB Mass Storage大容量存储的基本知识 - 程序员大本营 (pianshen.com)这篇大佬的博客,因为xilinx官方相关历程已经实现好了相关的协议解析和处理,这里不在赘述。

二、知道了大概的思路后我们就可以开始搭建硬件环境了,我们在Vivado中先实现zynq的配置,配置如下图所示:
在这里插入图片描述

这里给出了最重要的配置页面,我们要根据自己的硬件电路完成最基本的硬件配置,包括 QSPI FLASH USB SD UART完成基本的配置后,综合整个项目,生成BIT流,最后导出硬件完成硬件设计 ,这里对其他配置不做详细介绍,毕竟重点在软件部分(Vitis环境下),如有疑问欢迎交流。

三、完成了硬件导出后,如果不出意外,便可以创建Vitis项目,点击“platform.spr”文件,显示板级支持包界面后,点击“Peripheral Drivers”选项展开驱动历程列表,如下图所示:
在这里插入图片描述

在显示出来的列表中选择USB对用的历程生成Demo,如下图所示:
在这里插入图片描述

点击“import examples”生成Demo项目后,项目主要文件如下图所示:
在这里插入图片描述

这个历程已经实现了MASS STORAGE相关的协议,是用DDR模拟了一块存储卡,将该项目编译下载到硬件连接USB接口到电脑,便可以显示一个模拟U盘设备,这里的U盘容量是可以在代码中修改的,修改宏在xusbps_class_storage.h中的VFLASH_SIZE,在硬件不断电情况下可以实现U盘的基本操作,这里主要需要关注的内容是xusbps_class_storage.h 和xusbps_class_storage.c两个文件,因为USB MASS STORAGE协议解析和相关的存储器读写操作需要在这里实现。

四、从上面步骤来看,实际上我们已经实现了USB虚拟U盘的功能,只是现在的存储设备不是SD卡,最后一部就比较简单了,我们将DDR的读写操作该为SD的读写操作即可,当然在此之前不要忘记初始化SD卡的初始化操作,这里有一个关于速度的问题需要指出,最新版本的官方SD库文件是支持DMA的,最终实现的U盘速度会比较快,之前2019板Vitis的SD库还没有实现相关操作,可能需要自己修改,速度上会有一些影响。这里主要修改的代码在xusbps_class_storage.h 和xusbps_class_storage.c两个文件,相关代码我附在历程文件中,此处不再赘述,如有疑问,欢迎交流!

微信公众号:超级攻城狮

Logo

更多推荐