5

我正在使用通用 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 字节的消息,这足以满足我的需要,但我不喜欢不理解为什么它不适用于小缓冲区,总有一天我会可能无论如何都需要它们。

欢迎任何建议或信息。

4

1 回答 1

4

有一个叫做端点描述符的东西,其中定义了 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
于 2011-05-06T07:43:49.600 回答