我正在使用通用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字节的消息足以满足我的需要,但我不喜欢不理解为什么它不能用于小缓冲区,有一天无论如何我可能还需要它们。
欢迎任何建议或信息。
答案 0 :(得分:4)
有一种称为端点描述符的东西,除其他外,它定义了wMaxPacketSize - 这是主机控制器接口驱动程序用来将大型USB传输细分为更小的数据包。
这与EP0缓冲区大小完全不同 - 但是,总是要求它大于wMaxPacketSize。我的猜测是(尝试发布你的usb_config.h和usb_descriptors.c,如果你使用Microchip USB堆栈),你要么试图使用8字节长的EP0和64字节长的wMaxPacketSize,这会截断传输。 / p>
另外,请注意,在USB 1.1低速时,wMaxPacketSize不能超过8,而在USB 1.1全速时,它不能超过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