在使用CYUSB3014(EZ-USB FX3)通过USB 2.0接口通信时,CyAPI.lib的关键函数调用流程如下:
CCyUSBDevice 类初始化
创建对象实例,自动枚举连接的USB设备:
CCyUSBDevice *USBDevice = new CCyUSBDevice();遍历设备并匹配VID/PID
通过设备索引、VID(0x04B4)、PID(默认0x00F3)识别FX3:
if (USBDevice->Open(0)) { // 0表示第一个设备
if (USBDevice->VendorID == 0x04B4 && USBDevice->ProductID == 0x00F3) {
// 设备匹配成功
}
}获取Bulk端点
根据固件配置获取IN/OUT端点(例如端点1为Bulk OUT,端点6为Bulk IN):
CCyBulkEndPoint *BulkOutEP = USBDevice->BulkOutEndPt;
CCyBulkEndPoint *BulkInEP = USBDevice->BulkInEndPt;
// 设置传输参数(USB2.0下MaxPktSize通常为512)
BulkOutEP->SetXferSize(512);
BulkInEP->SetTimeOut(1000); // 超时1秒写数据(Host→FX3)
使用XferData同步发送数据:
UCHAR buffer[512];
LONG length = 512;
if (BulkOutEP->XferData(buffer, length)) {
// 发送成功
}读数据(FX3→Host)
同步读取数据:
UCHAR readBuffer[512];
LONG readLen = 512;
if (BulkInEP->XferData(readBuffer, readLen)) {
// 读取成功,readLen为实际接收字节数
}启动异步传输
使用BeginDataXfer + WaitForXfer + FinishDataXfer组合:
UCHAR asyncBuffer[4096];
OVERLAPPED ovl = {0};
ovl.hEvent = CreateEvent(NULL, false, false, NULL);
// 启动异步传输
BulkInEP->BeginDataXfer(asyncBuffer, 4096, &ovl);
// 等待传输完成
if (BulkInEP->WaitForXfer(&ovl, 1000)) {
LONG bytesRead = 4096;
if (BulkInEP->FinishDataXfer(asyncBuffer, bytesRead, &ovl)) {
// 处理数据
}
}
CloseHandle(ovl.hEvent);USBDevice->Close();
delete USBDevice;驱动安装
确保已安装Cypress CyUSB3.sys驱动,否则设备无法被识别。
USB2.0模式限制
错误处理
检查所有API返回值,并调用GetLastError()或GetError()(CyAPI内部)诊断问题。
完整示例代码可参考Cypress SDK中的CyAPITest工程。开发者需根据固件的端点配置调整代码。
举报
更多回帖