在...\M451BSP\SampleCode\StdDriver\USBD_HID_Transfer\范例中
文件 descriptors.c 的
70~79行如下,中文注释是我加的下同
/* I/F descr: HID 接口描述符 */
LEN_INTERFACE, /* bLength 接口描述符的字节数大小 */
DESC_INTERFACE, /* bDescriptorType 接口描述符的类型编号 */
0x00, /* bInterfaceNumber 该接口的编号 */
0x00, /* bAlternateSetting 备用的接口描述符编号 */
0x02, /* bNumEndpoints 该接口使用的端点数,不包括端点0 */
0x03, /* bInterfaceClass 接口类型 */
0x00, /* bInterfaceSubClass 接口子类型 */
0x00, /* bInterfaceProtocol 接口遵循的协议 */
0x00, /* iInterface 描述该接口的字符串索引值 */
注意这个接口只使用了2个端点
92~110行如下:
/* EP Descriptor: interrupt in.端点描述符:中断输入 */
LEN_ENDPOINT, /* bLength 端点描述符字节数大小 7 */
DESC_ENDPOINT, /* bDescriptorType 端点描述符类型编号 0x05 */
(INT_IN_EP_NUM | EP_INPUT), /* bEndpointAddress 端点地址及输入输出属性 0x01|0x80=0x81 */
EP_INT, /* bmAttributes 端点的传输类型属性 0x03 */
/* wMaxPacketSize 端点收、发的最大包大小 64 */
EP2_MAX_PKT_SIZE & 0x00FF,
(EP2_MAX_PKT_SIZE & 0xFF00) >> 8,
HID_DEFAULT_INT_IN_INTERVAL, /* bInterval 主机查询端点的时间间隔 1ms */
/* EP Descriptor: interrupt out. 端点描述符:中断输出 */
LEN_ENDPOINT, /* bLength 端点描述符字节数大小 */
DESC_ENDPOINT, /* bDescriptorType 端点描述符类型编号 */
(INT_OUT_EP_NUM | EP_OUTPUT), /* bEndpointAddress 端点地址及输入输出属性 0x02|0x00=0x02 */
EP_INT, /* bmAttributes 端点的传输类型属性 */
/* wMaxPacketSize 端点收、发的最大包大小*/
EP3_MAX_PKT_SIZE & 0x00FF,
(EP3_MAX_PKT_SIZE & 0xFF00) >> 8,
HID_DEFAULT_INT_IN_INTERVAL /* bInterval 主机查询端点的时间间隔 */
注意:2个端点描述符定义了端点1是中断输入,端点2为中断输出
而在文件hid_transfer.c的端点事件处理中,详见88~144行 这里只抄3段
if(u32IntSts & USBD_INTSTS_EP1)
{
/* Clear event flag */
USBD_CLR_INT_FLAG(USBD_INTSTS_EP1);
// control OUT
USBD_CtrlOut();
}
if(u32IntSts & USBD_INTSTS_EP2)
{
/* Clear event flag */
USBD_CLR_INT_FLAG(USBD_INTSTS_EP2);
// Interrupt IN
EP2_Handler();
}
if(u32IntSts & USBD_INTSTS_EP3)
{
/* Clear event flag */
USBD_CLR_INT_FLAG(USBD_INTSTS_EP3);
// Interrupt OUT
EP3_Handler();
}
显然是认为端点1是控制输出,端点2为中断输入,端点3为中断输出。
这和描述符定义的有明显的矛盾。所以在此就教于明白人。
|