jco*_*der 5 usb protocols hid pic
我正在使用通用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字节的消息,这足以满足我的需要,但我不喜欢不理解为什么它不适用于小缓冲区,有一天我会无论如何可能还需要他们.
欢迎任何建议或信息.
有一个称为端点描述符的东西,除其他外,它定义了 wMaxPacketSize - 主机控制器接口驱动程序使用它来将大型 USB 传输细分为较小的数据包。
这与 EP0 缓冲区大小完全不同 - 然而,EP0 缓冲区大小始终需要大于 wMaxPacketSize。我的猜测是(如果您使用 Microchip USB 堆栈,请尝试发布您的 usb_config.h 和 usb_descriptors.c),您要么尝试使用 8 字节长的 EP0 和 64 字节长的 wMaxPacketSize,这会截断传输。
另请注意,在 USB 1.1 低速中,wMaxPacketSize 不能超过 8,在 USB 1.1 全速中,wMaxPacketSize 不能超过 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
Run Code Online (Sandbox Code Playgroud)