开发FX2LP在Windows下的数据收发程序,需要结合固件开发、驱动安装和上位机编程。以下是详细步骤和代码借鉴方案:
整体步骤
固件开发(FX2LP的固件程序)
- 使用Cypress SuiteUSB或Keil C51编写固件,配置USB端点(如EP6 OUT、EP8 IN)。
- 固件需初始化USB接口并实现数据传输逻辑(如批量传输或GPIF模式)。
驱动安装
- 安装Cypress官方驱动
cyusb.sys(通过SuiteUSB安装包)。
上位机开发
- LabWindows/CVI方案:通过调用
cyusb.dll的C接口。
- 替代方案(推荐):使用C++/C#/Python + CyAPI库,或Python + PyUSB。
方案1:LabWindows/CVI 实现
所需工具:
- LabWindows/CVI 开发环境
- Cypress SuiteUSB(提取
cyusb.dll和CyAPI.lib)
关键代码示例:
#include
#include
int main()
{
HANDLE hDevice = NULL;
CY_DEVICE_INFO devInfo;
int status;
// 初始化USB库
status = CyOpen();
if (status != CY_SUCCESS) { /* 错误处理 */ }
// 打开设备(根据VID/PID)
status = CyGetDeviceInfo(0x04B4, 0x1004, 0, &devInfo);
if (status != CY_SUCCESS) { /* 错误处理 */ }
status = CyOpenDevice(0, &hDevice);
if (status != CY_SUCCESS) { /* 错误处理 */ }
// 配置端点(示例:EP6 OUT,EP8 IN)
status = CySetEndPointParams(hDevice, 0x06, CY_DIR_OUT, 1024, 0);
status = CySetEndPointParams(hDevice, 0x88, CY_DIR_IN, 1024, 0);
// 发送数据到FPGA(通过EP6)
char txBuffer[64] = "Hello FPGA!";
long bytesWritten;
status = CyBulkWrite(hDevice, 0x06, txBuffer, 64, &bytesWritten, 1000);
// 从FPGA接收数据(通过EP8)
char rxBuffer[64];
long bytesRead;
status = CyBulkRead(hDevice, 0x88, rxBuffer, 64, &bytesRead, 1000);
// 关闭设备
CyCloseDevice(hDevice);
CyClose();
return 0;
}
注意事项:
- 从SuiteUSB安装目录复制
cyusb.dll到LabWindows项目,并在CVI中声明函数(参考cyusb.h)。
- 固件端点需与上位机配置一致(如EP6 OUT对应固件的
EP6输出端点)。
方案2:替代方案(更简单高效)
2.1 C++/C# + CyAPI库
- 优势:Cypress官方库,性能最佳。
- 步骤:
- 安装SuiteUSB,获取
CyAPI.lib和CyAPI.h。
- 在C++项目中使用以下示例代码:
#include "CyAPI.h"
#include
int main()
{
CCyUSBDevice usbDevice;
if (usbDevice.DeviceCount() == 0) return -1;
// 打开第一个设备(需固件VID/PID匹配)
if (!usbDevice.Open(0)) return -1;
// 获取端点(EP6 OUT,EP8 IN)
CCyBulkEndPoint *epOut = (CCyBulkEndPoint*)usbDevice.EndPointOf(0x06);
CCyBulkEndPoint *epIn = (CCyBulkEndPoint*)usbDevice.EndPointOf(0x88);
// 发送数据
char txData[64] = {0xAA, 0xBB, 0xCC};
LONG bytesSent = 64;
epOut->XferData(txData, bytesSent);
// 接收数据
char rxData[64];
LONG bytesRead = 64;
epIn->XferData(rxData, bytesRead);
usbDevice.Close();
return 0;
}
2.2 Python + PyUSB
- 优势:跨平台,开发快速。
- 步骤:
- 安装Python和PyUSB:
pip install pyusb
- 确保Cypress驱动支持libusb(使用Zadig工具替换驱动为WinUSB)。
import usb.core
# 根据VID/PID查找设备
dev = usb.core.find(idVendor=0x04B4, idProduct=0x1004)
if dev is None: raise ValueError("Device not found")
# 配置端点(需匹配固件)
ep_out = dev[0][(0,0)][0x06] # EP6 OUT
ep_in = dev[0][(0,0)][0x88] # EP8 IN
# 发送数据
tx_data = b'x01x02x03x04'
dev.write(ep_out.bEndpointAddress, tx_data)
# 接收数据
rx_data = dev.read(ep_in.bEndpointAddress, 64)
print(rx_data)
关键资源
Cypress SuiteUSB:
固件示例:
- 修改
dscr.a51定义端点描述符,并在fw.c中实现数据传输逻辑。
- 参考固件:
CypressUSBTargetFirmwareFX2LPBulkloop
驱动配置工具:
总结建议
- 快速开发:首选Python + PyUSB,适合原型验证。
- 高性能需求:使用C++ + CyAPI(官方推荐)。
- LabWindows限制:若必须使用LabWindows,需手动封装
cyusb.dll接口,但不如CyAPI稳定。
- 调试技巧:
- 使用
Bus Hound监控USB数据流。
- 先用Cypress Control Panel验证设备连接。
通过上述方案,你可实现FX2LP与FPGA的稳定数据收发。开发时注意端点方向、数据传输大小和超时设置的匹配。