用STM32的keil那个开发板试了试HID的DEMO,没用任何问题。
现在想用它实现一个USB的键盘,结果发现DEMO里收发的数据只有1字节,在描述符里把那个ReportSize改成8了,但是只要一发送数据,USB设备就reset了。这是什么原因啊?
跟着改
在描述符里把那个ReportSize改成8,发送数据也要1次发8个,否则当然PC会发reset了-收不到期望的8字节数据,发生超时
好像还是不行
按照您说的改了那个REPORT SIZE为8,但是还是不能发送数据,程序中原来发送1字节的地方也都改成了发送8字节。是不是还有什么其他的东西需要改啊?我找了个标准的键盘描述符试了下也不行,郁闷了。
请描述一下你发的是什么数据?
请描述下述操作你发的是什么数据:
1)按下Shift
2)再按下A
3)释放A不释放Shift
4)按下B
5)释放B
6)再释放Shift
我觉得用报告做麻烦,不如用中断端点做...可以参考下圈圈
还没到那呢
我现在就是测试状态,我在程序里设定的是定时发送一个8字节数据,但是一次也发不出来。
键盘的报告是成对的,按键和释放键分别要发送报告
你定时发送一个8字节数据,如果是固定的数值,PC很可能会认为键盘有故障,所以才会Reset你的设备!
那起码应该能看见一个发送的数据吧?
即使认为我有问题也不能根据一个数据包就断定我有问题吧?
现在的问题是一个数据包都发不出来,肯定还什么设置有问题吧?
晕死了已经。
const BYTE USB_DeviceDescriptor[] = {
USB_DEVICE_DESC_SIZE, /* bLength */
USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType */
WBVAL(0x0110), /* 1.10 */ /* bcdUSB */
0x00, /* bDeviceClass */
0x00, /* bDeviceSubClass */
0x00, /* bDeviceProtocol */
USB_MAX_PACKET0, /* bMaxPacketSize0 */
WBVAL(0xC251), /* idVendor */
WBVAL(0x1C01), /* idProduct */
WBVAL(0x0100), /* 1.00 */ /* bcdDevice */
0x04, /* iManufacturer */
0x20, /* iProduct */
0x44, /* iSerialNumber */
0x01 /* bNumConfigurations */
};
const BYTE USB_ConfigDescriptor[] = {
/* Configuration 1 */
USB_CONFIGUARTION_DESC_SIZE, /* bLength */
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
WBVAL( /* wTotalLength */
USB_CONFIGUARTION_DESC_SIZE +
USB_INTERFACE_DESC_SIZE +
HID_DESC_SIZE +
USB_ENDPOINT_DESC_SIZE
),
0x01, /* bNumInterfaces */
0x01, /* bConfigurationValue */
0x00, /* iConfiguration */
USB_CONFIG_BUS_POWERED /*|*/ /* bmAttributes */
USB_CONFIG_POWER_MA(100), /* bMaxPower */
/* Interface 0, Alternate Setting 0, HID Class */
USB_INTERFACE_DESC_SIZE, /* bLength */
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
0x00, /* bInterfaceNumber */
0x00, /* bAlternateSetting */
0x01, /* bNumEndpoints */
USB_DEVICE_CLASS_HUMAN_INTERFACE, /* bInterfaceClass */
HID_SUBCLASS_BOOT, /* bInterfaceSubClass */
HID_PROTOCOL_KEYBOARD, /* bInterfaceProtocol */
0x5E, /* iInterface */
/* HID Class Descriptor */
/* HID_DESC_OFFSET = 0x0012 */
HID_DESC_SIZE, /* bLength */
HID_HID_DESCRIPTOR_TYPE, /* bDescriptorType */
WBVAL(0x0110), /* 1.00 */ /* bcdHID */
0x00, /* bCountryCode */
0x01, /* bNumDescriptors */
HID_REPORT_DESCRIPTOR_TYPE, /* bDescriptorType */
WBVAL(HID_REPORT_DESC_SIZE), /* wDescriptorLength */
/* Endpoint, HID Interrupt In */
USB_ENDPOINT_DESC_SIZE, /* bLength */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
USB_ENDPOINT_IN(1), /* bEndpointAddress */
USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */
WBVAL(0x0010), /* wMaxPacketSize */
0x10 /* 16ms */ /* bInterval */
};
const BYTE HID_ReportDescriptor[] = {
HID_UsagePage(0x01),
HID_Usage(0x06),
HID_Collection(HID_Application),
HID_UsagePage(HID_USAGE_PAGE_KEYBOARD),
HID_UsageMin(0),
HID_UsageMax(101),
HID_LogicalMin(0),
HID_LogicalMax(255),
HID_ReportCount(8),
HID_ReportSize(8),
HID_Input(HID_Data | HID_Variable | HID_Absolute),
HID_EndCollection,
};
各位大侠帮我看看这些描述符是不是有什么问题?
3楼抓到的ConfigDescriptor数据好像不是8楼给出的那样
你再仔细看看。
如果还没到发送数据包就被Reset,多数情况是某个描述符有问题。