You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Infineon FX3设备上的LIBUSB_ERROR_PIPE错误?

解决Infineon FX3控制传输LIBUSB_ERROR_PIPE错误的排查方向

LIBUSB_ERROR_PIPE本质是设备返回了STALL,说明你的控制请求不被设备认可,或者参数、逻辑存在问题,按以下方向排查:

  • 核对控制请求参数与固件逻辑匹配
    你怀疑前三个参数有问题是对的,必须和FX3固件里的控制请求处理完全对应:

    • bmRequestType(0x40):这是主机到设备的厂商自定义请求,确认固件是否支持该方向的厂商请求
    • bRequest(十进制42,即0x2A):固件里有没有注册这个请求的处理函数?如果固件没实现该请求,设备直接返回STALL
    • wValue(0x1234)、wIndex(0):这两个参数的值是否符合固件对该请求的要求,比如某些请求要求wValue是特定范围,或wIndex指定接口号?
  • 修复设备打开逻辑的漏洞
    你的代码里打开设备失败后仍继续执行后续操作,可能导致使用无效句柄:

    • 当cyusb_open(VENDORID, PRODUCTID)返回值不等于1时,直接终止流程并关闭设备,避免后续无效操作
    • 调用cyusb_gethandle(0)后,增加句柄有效性检查,确保拿到的是可用的设备句柄
  • 确认数据长度匹配
    你指定发送长度为2字节,要确保:

    • 传入的data数组实际长度至少为2字节,避免越界或数据不全
    • 固件中对应请求的接收缓冲区能容纳2字节数据,长度不匹配也会触发STALL
  • 固件端的关键检查

    • 查看FX3固件中的控制请求回调(比如CyUsbEndPoint0SetupCallback),确认是否正确处理了bRequest=42的请求,有没有遗漏响应逻辑
    • 固件处理完控制请求后,必须调用CyUsbControlTransferDataAck或完成数据传输的收尾操作,否则设备会保持STALL状态

修正后的代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:45:47