我在使用LIB-USB
. USB 设备基于 PIC18F4550,具有单个控制端点。PC 前端是用 MSVC 编写的,使用 Lib-Usb 1.12。
在 PC 端,程序首先设置配置,声明接口,然后发送(和接收)控制消息(特定于供应商),所有这些都成功。在传输了看似随机的 # 个字节后(100 到 2000 之间的任意位置),传输停止,并从 usb_control_msg 调用返回错误 rc=-5 。
在 PC 端,调用如下所示:
ret = usb_set_configuration(udev, 1);
ret = usb_claim_interface(udev, 0);
ret = usb_control_msg(udev, USB_TYPE_VENDOR|USB_RECIP_DEVICE, CMD_RESET, 0, 0, buffer, 0, 100);
ret = usb_control_msg(udev, 0xC0, GET_FIFO_DATA, 0, 0, buffer, 8, 100);
最后一个调用,实际上是从 USB 设备获取数据,连续运行了很多次,但总是在以这种方式传输随机数量的字节(总共 100 到 2000 个)后终止。将管道更改为 EP1 会执行相同的操作,但最终会出现相同的错误。
在 USB 设备 (PIC) 端,描述符非常简单,只有 EP0 管道,如下所示:
Device
db 0x12, DEVICE ; bLength, bDescriptorType
db 0x10, 0x01 ; bcdUSB (low byte), bcdUSB (high byte)
db 0x00, 0x00 ; bDeviceClass, bDeviceSubClass
db 0x00, MAX_PACKET_SIZE ; bDeviceProtocol, bMaxPacketSize
db 0xD8, 0x04 ; idVendor (low byte), idVendor (high byte)
db 0x01, 0x00 ; idProduct (low byte), idProduct (high byte)
db 0x00, 0x00 ; bcdDevice (low byte), bcdDevice (high byte)
db 0x01, 0x02 ; iManufacturer, iProduct
db 0x00, NUM_CONFIGURATIONS ; iSerialNumber (none), bNumConfigurations
Configuration1
db 0x09, CONFIGURATION ; bLength, bDescriptorType
db 0x12, 0x00 ; wTotalLength (low byte), wTotalLength (high byte)
db NUM_INTERFACES, 0x01 ; bNumInterfaces, bConfigurationValue
db 0x00, 0xA0 ; iConfiguration (none), bmAttributes
db 0x32, 0x09 ; bMaxPower (100 mA), bLength (Interface1 descriptor starts here)
db INTERFACE, 0x00 ; bDescriptorType, bInterfaceNumber
db 0x00, 0x00 ; bAlternateSetting, bNumEndpoints (excluding EP0)
db 0xFF, 0x00 ; bInterfaceClass (vendor specific class code), bInterfaceSubClass
db 0xFF, 0x00 ; bInterfaceProtocol (vendor specific protocol used), iInterface (none)
实际的框架是 Bradley Minch 的汇编语言框架。
如果有人在我很想听之前遇到过此类问题,因为我已经尝试了几乎所有方法来解决它,包括使用不同的管道(EP1,结果相同),之前检查 PIC 上的 UOWN 位写入管道,与 PC 主机握手(在写入数据之前,PC 必须首先发送供应商特定的命令)但无济于事。