4

我在使用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 必须首先发送供应商特定的命令)但无济于事。

4

3 回答 3

2

它现在有效!

当然,我现在感觉“像一袋锤子一样聪明” 如果我仔细阅读第 18 节,我会注意到关于在 Vusb 和接地之间添加一个 220nF 电容器的行。在 pin18 和地之间添加了一个 470nF 的电容,这就是它所需要的......现在可靠的传输。

只是另一个案例"I forgot to read the fine print"

于 2008-10-31T02:48:44.773 回答
1

建议使用高端的 USB 总线分析仪LecroyEllisys并且有点贵。Total Phase是低端的一个例子。
如果您负担得起,使用总线分析器将帮助您编写固件和 PC 端软件。使用分析仪,您可以确定您的 PC 端的问题(您读取的数据在总线上,但您在软件中看不到它)或固件实现中的问题(您在总线上看不到数据) .

从您的描述中很难理解问题是什么,我不知道错误 -5 是什么意思,如果您可以为此发布定义名称,我可能会更有帮助。
一般来说,以最大数据包大小的倍数从/向设备传输数据是一种很好的做法。我还建议您仔细阅读USB 规范中的相关部分 5.5.3(用于控制传输)和 5.8.3 用于批量传输

基于提供的第二个日志的附加评论

usb 堆栈返回的真正错误在您的日志中及其:
vendor_class_request(): request failed: status: 0xc0000001, urb-status: 0xc000000c

Windows Driver kit usb.h 中定义的 URB(usb 请求块)状态为:
usb.h:#define USBD_STATUS_BUFFER_OVERRUN ((USBD_STATUS)0xC000000CL)

我在这里找到了关于这个错误的一个很好的解释。

请忽略这是 WinDriver 定义的错误,它只是从 Windows 重新定义的错误,并且关于它通常意味着什么的解释是正确的。

是一个为什么会发生的示例,但是这种行为还有更多潜在的原因。

于 2008-10-28T15:30:06.360 回答
0

我没有分析器(至少“还”),但我确实安装了 DebugView 以查看驱动程序在做什么,并带有以下输出跟踪。显示的第一次传输(特定于供应商的传输)成功,而第二次传输失败。从调用返回一个返回码“-5”,表示“I/O 错误”(不是特别有用)。

00002674 315.26220703 LIBUSB-DRIVER - vendor_class_request(): type: vendor
00002675 315.26223755 LIBUSB-DRIVER - vendor_class_request(): recipient: device
00002676 315.26223755 LIBUSB-DRIVER - vendor_class_request(): request: 0x04
00002677 315.26223755 LIBUSB-DRIVER - vendor_class_request(): value : 0x0000
00002678 315.26223755 LIBUSB-DRIVER - vendor_class_request(): index: 0x0000
00002679 315.26223755 LIBUSB-DRIVER - vendor_class_request(): size: 8 00002680 315.26226807 LIBUSB-DRIVER - vendor_class_request(): direction: in
00002681 315.26226807 LIBUSB-DRIVER - vendor_class_request() :超时:100
00002682 315.26617432 LIBUSB-DRIVER - vendor_class_request(): 8 bytes transmitted 00002683 315.26721191
00002684 315.26721191
00002685 315.26721191 LIBUSB-DRIVER - vendor_class_request(): type: vendor
00002686 315.26721191 LIBUSB-DRIVER - vendor_class_request(): recipient: device
00002687 315.26724243 LIBUSB-DRIVER - vendor_class_request (): request: 0x04
00002688 315.26724243 LIBUSB-DRIVER - vendor_class_request(): value: 0x0000
00002689 315.26724243 LIBUSB-DRIVER - vendor_class_request(): index: 0x0000
00002690 315.26724243 LIBUSB-DRIVER - vendor_class_request(): size: 8 00002691 315.26724243 LIBUSB-DRIVER - vendor_class_request():方向:在
00002692 315.26727295 LIBUSB-DRIVER - vendor_class_request(): timeout: 100
00002693 315.27017212 LIBUSB-DRIVER - vendor_class_request(): request failed: status: 0xc0000001, urb-status: 0xc000000c
00002694 315.27407837 [3684] LIBUSB_DLL: error: usb_control_msg: sending control message failed , win 错误:连接到系统的设备无法正常工作。
00002695 315.27407837 [3684]
00002696 315.27511597
00002697 315.27514648 LIBUSB-驱动程序-release_interface():接口0

于 2008-10-30T02:04:20.290 回答