新唐MCU技术
直播中

池鹄展

7年用户 922经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

关于M451BSP\\SampleCode\\StdDriver\\USBD_HID_Transfer\\的疑问

在...M451BSPSampleCodeStdDriverUSBD_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为中断输出。
    这和描述符定义的有明显的矛盾。所以在此就教于明白人。   

回帖(1)

王晗

2023-8-29 14:27:01
descriptors.c中EP_NUM是USB host的,hid_transfer.c的端点是M451的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分