【问题标题】:USB HID protocol questionUSB HID 协议问题
【发布时间】:2011-02-13 21:42:54
【问题描述】:

我正在使用通用 HID 接口在 PIC 18F2550 上实现 USB。我已将 HID 配置文件配置设置为输入和输出都有一个 64 字节的消息。

现在它基本上可以工作了。设备向 Windows 注册 OK。我可以在 PC 上的程序中找到它,并且可以向它发送和接收数据。但问题是——从 PC 到 PIC 的消息被截断为 EP0 端点缓冲区的大小。

在我进一步调试之前,我想在这里澄清一下我对 USB 协议的理解,并检查我是否正确。

假设 EP0 输入缓冲区为 8 个字节。我的理解是PC端会发送一个8字节的控制包。其中有要遵循的数据的字节长度。然后它会发送一个 8 字节的数据包序列,PIC 端必须对每个数据包进行确认。

据我了解,PC端通过查看设备描述符中的最大数据包大小字段知道每个数据包的大小,并将相应的消息分成多个数据包。

在我寻找更多时间查看代码之前,任何人都可以确认这基本上是正确的吗?如果 EP0 缓冲区大小为 8 字节,那么 PC 应该因为我上面提到的配置字段而知道这一点并发送多个数据包?

如果我在 PIC 上设置 64 字节的接收缓冲区,那么我会得到 64 字节的消息,这足以满足我的需要,但我不喜欢不理解为什么它不适用于小缓冲区,并且有一天反正我可能会需要它们。

欢迎任何建议或信息。

【问题讨论】:

    标签: usb protocols hid pic


    【解决方案1】:

    有一个叫做端点描述符的东西,其中定义了 wMaxPacketSize - 这是主机控制器接口驱动程序用来将大型 USB 传输细分为更小的数据包的东西。

    这与 EP0 缓冲区大小完全不同 - 但是,它始终需要大于 wMaxPacketSize。我的猜测是(尝试发布您的 usb_config.h 和 usb_descriptors.c,如果您使用 Microchip USB 堆栈),您要么尝试使用 8 字节长的 EP0 和 64 字节长的 wMaxPacketSize,这会截断传输。

    另外,请注意,在 USB 1.1 Low Speed 中,wMaxPacketSize 不能超过 8,而在 USB 1.1 Full Speed 中,它不能超过 64。

    0x07,/*sizeof(USB_EP_DSC)*/
    USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
    HID_EP | _EP_IN,            //EndpointAddress
    _INTERRUPT,                       //Attributes
    DESC_CONFIG_WORD(9),        //size
    0x01,                        //Interval
    
    /* Endpoint Descriptor */
    0x07,/*sizeof(USB_EP_DSC)*/
    USB_DESCRIPTOR_ENDPOINT,    //Endpoint Descriptor
    HID_EP | _EP_OUT,            //EndpointAddress
    _INTERRUPT,                       //Attributes
    DESC_CONFIG_WORD(9),        //size
    0x01                        //Interval
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      • 2011-05-12
      • 2012-11-08
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多