因为项目的需求,需要将FPGA端的图像像素数据经过USB2.0协议传输到PC端,因此需要使用python的pyusb库来进行数据的发送和接收。以下纪录在使用pyusb库的方法和所遇到的问题。
在本次的开发过程中,我的FPGA开发板上所使用的是Cypress公司EZ-USB系列的CY7C68013A驱动芯片进行USB数据传输,CY7C68013A是一款含高速USB2.0通信协议及兼容的8051控制芯片,在此芯片中含16KB的内部RAM,不需外加存储器就可以直接运行固件程序。CY7C68013A的内部8051处理器的工作频率可以为48MHz,24MHz,12MHz,在我的FPGA开发板上使用的是24MHz的作为时钟输入。CY7C68013A内部集成了4个FIFO,大小共为4K字节,用户可以通过设置让其工作在Master或Slave模式。CY7C68013A含有一个I2C接口用于连接外部的EEPROM,用户先把写好的固件程序.iic文件下载到EEPROM,CY7C68013A上电启动时会自动读取EEPROM的程序到内部的RAM开始运行。
本次项目中使用到的CY7C68013A芯片配置固件程序使其工作在Slave FIFO异步读写模式,其中设置EP2、EP4的FIFO为数据输出端口,EP6、EP8的FIFO为数据输入端口,每个端口含有两个512字节的FIFO,如果一个512字节的端口被读空或者写满,硬件会自动切换到另一个512字节的FIFO。关于USB硬件的介绍到此结束,如需更改CY7C68013A的工作模式,端口、信号的配置,可以详细了解CY7C68013A的固件程序进行修改。
在此链接下载libusb库。
双击安装,选择对应的usb接口,install ,生成 LibUSB-Win32 文件夹,(一路next就不贴图了)
在LibUSB-Win32 文件夹下的bin目录下,点击inf-wizard安装驱动,生成USB驱动信息,保存在任意目录下。
在设备管理器中选择需要安装的USB接口,选择更新驱动程序,浏览到刚才生成的USB驱动信息的目录,开始更新驱动,完成驱动的安装。
这一步没什么细说的,cmd直接运行
pip install pyusb
新建python工程,导入需要的USB库,代码如下
import usb.util
# find our device
dev = usb.core.find(idVendor=0x04B4,idProduct=0x1004)
print(dev)
# was it found?
if dev is None:
raise ValueError('Device not found')
其中的idVendor=0x04B4,idProduct=0x1004,替换为你刚才安装的usb驱动时的Vender ID和Product ID
运行程序会打印出USB 接口的相关信息。
接着进行USB的读写,贴代码如下
# set the active configuration. With no arguments, the first
# configuration will be the active one
dev.set_configuration()
def rx_loop():
while(True):
try:
data = dev.read(0x86,512,1000) #read(endpoint, size_or_buffer, timeout = None)
print(data)
except Exception as e:
print(e)
def tx_loop():
while(True):
try:
data = dev.write(0x88,0x55,1000) #write(endpoint, data, timeout = None)
print(data)
except Exception as e:
print(e)
上述的读写模块中的read、write函数中的各参数在其后分别进行了备注,请自行修改
分别运行读写模块进行USB 的读写测试。请注意,因为我所使用到的FPGA开发板上的USB的芯片的特性,4个FIFO 的空间容量为512字节,因此在我上位机的读的模块(read)中设置一次读取的长度为512字节,如果小于512字节将导致读取不到数据的问题发生,同样对应写模块(write),也需要写满512字节后,FPGA端才会接收到PC端发送过去的数据。
到此关于使用python的pyusb库进行USB的开发就算时完成了,因为本次项目所用到的都时USB的基础收发功能,所以程序就比较简略,如需进行更加深入的开发,请自行做进一步的开发。