我在使用LIB-USB
的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,结果相同),检查UOWN位写入管道之前的PIC,与PC主机握手(PC必须在写入datsa之前首先发送特定于供应商的命令),但无济于事。
答案 0 :(得分:2)
现在有效!!
当然,我现在感觉“像一袋锤子一样聪明”如果我仔细阅读第18节,我会注意到在Vusb和地面之间增加一个220nF电容的路线。在针脚18和地面之间增加了一个470nF的盖子,这就是它所需要的......现在可靠的转移。
另一个"I forgot to read the fine print"
答案 1 :(得分:1)
将USB总线分析器Lecroy和Ellisys设置为高端并且有点贵是非常明智的。 Total Phase是低端的例子 如果您能负担得起,使用总线分析器将帮助您编写固件和PC端软件。使用分析仪,您可以确定您的PC端是否存在问题(您读取的数据是在总线上,但是您无法在软件中看到它)或固件实现中的问题(您没有在总线上看到数据) 。
从你的描述很难理解是什么问题,我不知道什么是错误-5意味着,如果你可以发布这个定义名称我可能会更有帮助。
通常,在最大数据包大小的乘法中将数据从/向设备传输是一种很好的做法。我还建议您仔细阅读相关章节5.5.3(用于控制转移)和5.8.3用于USB Spec
基于提供的第二个日志的附加评论:
usb堆栈返回的实际错误在你的日志及其中:
vendor_class_request(): request failed: status: 0xc0000001, urb-status: 0xc000000c
在Windows驱动程序工具包usb.h中定义的URB(usb请求块)状态为:
usb.h:#define USBD_STATUS_BUFFER_OVERRUN ((USBD_STATUS)0xC000000CL)
我找到了关于此错误here的一个很好的解释。
请忽略这是WinDriver定义错误的事实,它只是从Windows重新定义错误,并解释它通常意味着什么是正确的。
Here就是为什么它可以发生的一个例子,但这种行为有更多潜在的原因。
答案 2 :(得分:0)
我没有分析器(至少“尚未”)但我确实安装了DebugView以查看驱动程序正在做什么,并使用以下输出跟踪。显示的第一次转移(特定于供应商的转移)成功,而第二次转移死亡。返回代码为“-5”,表示从调用中返回“I / O错误”(不是特别有用)。
00002674 315.26220703 LIBUSB-DRIVER - vendor_class_request():类型:供应商
00002675 315.26223755 LIBUSB-DRIVER - vendor_class_request():收件人:设备
00002676 315.26223755 LIBUSB-DRIVER - vendor_class_request():请求:0x04
00002677 315.26223755 LIBUSB-DRIVER - vendor_class_request():值:0x0000
00002678 315.26223755 LIBUSB-DRIVER - vendor_class_request():index:0x0000
00002679 315.26223755 LIBUSB-DRIVER - vendor_class_request():大小:8 00002680 315.26226807 LIBUSB-DRIVER - vendor_class_request():方向:in
00002681 315.26226807 LIBUSB-DRIVER - vendor_class_request():超时:100
00002682 315.26617432 LIBUSB-DRIVER - vendor_class_request():发送8个字节 00002683 315.26721191
00002684 315.26721191
00002685 315.26721191 LIBUSB-DRIVER - vendor_class_request():类型:供应商
00002686 315.26721191 LIBUSB-DRIVER - vendor_class_request():收件人:设备
00002687 315.26724243 LIBUSB-DRIVER - vendor_class_request():请求:0x04
00002688 315.26724243 LIBUSB-DRIVER - vendor_class_request():值:0x0000
00002689 315.26724243 LIBUSB-DRIVER - vendor_class_request():index:0x0000
00002690 315.26724243 LIBUSB-DRIVER - vendor_class_request():大小:8 00002691 315.26724243 LIBUSB-DRIVER - vendor_class_request():方向:in
00002692 315.26727295 LIBUSB-DRIVER - vendor_class_request():超时:100
00002693 315.27017212 LIBUSB-DRIVER - vendor_class_request():请求失败:状态:0xc0000001,urb-status:0xc000000c
00002694 315.27407837 [3684] LIBUSB_DLL:错误:usb_control_msg:发送控制消息失败,获胜错误:连接到系统的设备无法正常工作。
00002695 315.27407837 [3684]
00002696 315.27511597
00002697 315.27514648 LIBUSB-DRIVER - release_interface():接口0