通过libusb实现PC与ZYNQ之间的USB通信

1 概述

        libusb是一个免费的跨平台USB库,本文在windows平台下使用libusb库开发上位机程序与ZYNQ的USB接口进行数据收发测试。libusb可以支持WinUSB驱动,因此为ZYNQ的USB接口设备安装WinUSB驱动。

        libusb网址:https://libusb.info/

        windows下开发指南:https://github.com/libusb/libusb/wiki/Windows

libusb库

        在https://libusb.info/可以下载libusb库,目前的最新版本是1.0.23。解压后的目录如下:

通过libusb实现PC与ZYNQ之间的USB通信

        使用VS作为上位机驱动的开发环境,因此需要使用MS32或者MS64文件夹下的dll和lib文件。以及include里的头文件。

ZYNQ裸机程序设计

        PS端的USB接口作为Endpoint Device。设计了3个Endpoint,分别为:

  • Endpoint 0:control endpoint
  • Endpoint 1:BULK endpoint
  • Endpoint 2:interrupt endpoint

        分别对应控制传输、块传输和中断传输。

通过libusb实现PC与ZYNQ之间的USB通信

        USB的PID设为0x0007,PID设为0x0001。

通过libusb实现PC与ZYNQ之间的USB通信

        设计USB设备的字符串描述。

通过libusb实现PC与ZYNQ之间的USB通信

4 上位机测试程序设计 

         PC机作为HOST,调用libusb的API函数设计上位机程序,分别测试电脑与开发板USB接口之间的BULK和interrupt模式传输速率。实现如下功能:

  • PC->ZYNQ BULK模式发送数据
  • PC->ZYNQ->PC BULK模式数据回环
  • PC->ZYNQ interrupt模式发送数据
  • PC->ZYNQ->PC interrupt模式数据回环

5 USB驱动安装

        安装libusb驱动。使用Zadig软件生产使用WinUSB内核的USB驱动,选择Create New Device。

通过libusb实现PC与ZYNQ之间的USB通信

        选择advance mode

通过libusb实现PC与ZYNQ之间的USB通信

        选择提取驱动文件。

通过libusb实现PC与ZYNQ之间的USB通信

        输入设备名称ZYNQ USB DEVICE,VID 0x0007,PID0x0001。

通过libusb实现PC与ZYNQ之间的USB通信

        选择驱动文件提取的存放目录,然后点击Extract Files

通过libusb实现PC与ZYNQ之间的USB通信

        完成后,打开驱动文件所在目录,可以找到生成的驱动文件。

通过libusb实现PC与ZYNQ之间的USB通信

         对于Win10系统,首先要禁用数字签名。将开发板USB口与电脑连接,将程序通过SDK下载到开发板中,此时电脑设备管理器提示发现新的USB设备。选择设备,安装上述目录下已经生成的USB驱动程序。

6 USB传输速率测试 

6.1 BULK模式

6.1.1 PC向ZYNQ单向发送

        8字节包

通过libusb实现PC与ZYNQ之间的USB通信

        64字节包

通过libusb实现PC与ZYNQ之间的USB通信

         256字节包

通过libusb实现PC与ZYNQ之间的USB通信

        1024字节包

通过libusb实现PC与ZYNQ之间的USB通信

        2048字节包

通过libusb实现PC与ZYNQ之间的USB通信

        4096字节包

通过libusb实现PC与ZYNQ之间的USB通信

6.1.2 PC与ZYNQ间数据回环

        实际速率需要将图中的速率乘以2倍

        8字节包

通过libusb实现PC与ZYNQ之间的USB通信

        64字节包

通过libusb实现PC与ZYNQ之间的USB通信

        256字节包

通过libusb实现PC与ZYNQ之间的USB通信

        1024字节包

通过libusb实现PC与ZYNQ之间的USB通信

        2048字节包

通过libusb实现PC与ZYNQ之间的USB通信

        4096字节包

通过libusb实现PC与ZYNQ之间的USB通信

6.2 interrupt模式

6.2.1 PC向ZYNQ单向发送数据

        8字节包

通过libusb实现PC与ZYNQ之间的USB通信

        64字节包

通过libusb实现PC与ZYNQ之间的USB通信

        256字节包

通过libusb实现PC与ZYNQ之间的USB通信

        1024字节包

通过libusb实现PC与ZYNQ之间的USB通信

        2048字节包

通过libusb实现PC与ZYNQ之间的USB通信

        4096字节包

通过libusb实现PC与ZYNQ之间的USB通信

6.2.2 PC与ZYNQ间数据回环

        实际速率需要将图中的速率乘以2倍

        8字节包

通过libusb实现PC与ZYNQ之间的USB通信

        64字节包

通过libusb实现PC与ZYNQ之间的USB通信

        256字节包

通过libusb实现PC与ZYNQ之间的USB通信

        1024字节包

通过libusb实现PC与ZYNQ之间的USB通信

        2048字节包

通过libusb实现PC与ZYNQ之间的USB通信

        4096字节包

通过libusb实现PC与ZYNQ之间的USB通信