如何解决Infineon FX3设备上的LIBUSB_ERROR_PIPE错误?
解决Infineon FX3控制传输LIBUSB_ERROR_PIPE错误的排查方向
LIBUSB_ERROR_PIPE本质是设备返回了STALL,说明你的控制请求不被设备认可,或者参数、逻辑存在问题,按以下方向排查:
核对控制请求参数与固件逻辑匹配
你怀疑前三个参数有问题是对的,必须和FX3固件里的控制请求处理完全对应:bmRequestType(0x40):这是主机到设备的厂商自定义请求,确认固件是否支持该方向的厂商请求bRequest(十进制42,即0x2A):固件里有没有注册这个请求的处理函数?如果固件没实现该请求,设备直接返回STALLwValue(0x1234)、wIndex(0):这两个参数的值是否符合固件对该请求的要求,比如某些请求要求wValue是特定范围,或wIndex指定接口号?
修复设备打开逻辑的漏洞
你的代码里打开设备失败后仍继续执行后续操作,可能导致使用无效句柄:- 当
cyusb_open(VENDORID, PRODUCTID)返回值不等于1时,直接终止流程并关闭设备,避免后续无效操作 - 调用
cyusb_gethandle(0)后,增加句柄有效性检查,确保拿到的是可用的设备句柄
- 当
确认数据长度匹配
你指定发送长度为2字节,要确保:- 传入的
data数组实际长度至少为2字节,避免越界或数据不全 - 固件中对应请求的接收缓冲区能容纳2字节数据,长度不匹配也会触发STALL
- 传入的
固件端的关键检查
- 查看FX3固件中的控制请求回调(比如
CyUsbEndPoint0SetupCallback),确认是否正确处理了bRequest=42的请求,有没有遗漏响应逻辑 - 固件处理完控制请求后,必须调用
CyUsbControlTransferDataAck或完成数据传输的收尾操作,否则设备会保持STALL状态
- 查看FX3固件中的控制请求回调(比如
修正后的代码示例
int BulkTransferLoopback::sendControl(uint8_t data[], int length, uint8_t rx[]) { int numdevs = cyusb_open(); if (numdevs <= 0) { printf("No devices found!\n"); return numdevs; } int r = cyusb_open(VENDORID, PRODUCTID); if (r != 1) { printf("Could not open device!\n"); cyusb_close(); return numdevs; } _handle = cyusb_gethandle(0); if (!_handle) { printf("Invalid device handle!\n"); cyusb_close(); return numdevs; } findEndpoints(); if (length < 2) { printf("Data length is insufficient!\n"); cyusb_close(); return numdevs; } int err = libusb_control_transfer(_handle, 0x40, 42, 0x1234, 0, data, 2, 1000); printf("%s\n", libusb_error_name(err)); cyusb_close(); return numdevs; }
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

