打印
[USB接口]

USB Hid通信 端点只能采用 中断方式吗?能设置为别的方式吗?

[复制链接]
4206|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qbasicljx|  楼主 | 2014-3-12 09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 qbasicljx 于 2014-3-12 09:31 编辑

   中断方式的最大延迟时间是多少?
/******************** Descriptor of Custom HID endpoints ******************/
    /* 27 */
    0x07,          /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */

    0x81,          /* bEndpointAddress: Endpoint Address (IN) */
    0x03,          /* bmAttributes: Interrupt endpoint */                //这个我能改为其他通信方式吗?我看虚拟虚拟串口的例程,这个是 bluk 方式的,改了还是hid通信吗,windows能识别吗
    0x02,          /* wMaxPacketSize: 2 Bytes max */
    0x00,
    0x20,          /* bInterval: Polling Interval (32 ms) */               //这一项我能改为 0 或者 1 吗?
    /* 34 */
            
    0x07,        /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,        /* bDescriptorType: */
                        /*        Endpoint descriptor type */
    0x01,        /* bEndpointAddress: */
                        /*        Endpoint Address (OUT) */
    0x03,        /* bmAttributes: Interrupt endpoint */                //这个我能改为其他通信方式吗?我看虚拟虚拟串口的例程,这个是 bluk 方式的,改了还是hid通信吗,windows能识别吗  
    0x02,        /* wMaxPacketSize: 2 Bytes max  */
    0x00,
    0x20,        /* bInterval: Polling Interval (32 ms) */                    //这一项我能改为 0 或者 1 吗?
    /* 41 */


相关帖子

沙发
soso| | 2014-3-12 14:04 | 只看该作者
端点可以用0控制。
看USB2.0规范手册得知,端点0是控制类传输,不用端点描述,WINDOWS可为HID可以安装驱动,以报告格式收发数据


uint8 USB_DeviceDescriptor[18]=//设备描述符
{
        //bLength        1字节-描术符的长度(18字节)
        0x12,
        //bDescriptorType        1字节-描术符类型(设备描术类)
        0x01,
        //bcdUSB        2字节-设备所使用USB协议版本(USB1.1 PS:低位先行)
        0x10,
        0x01,
        //bDeviceClass        1字节-类代码
        0x00,
        //bDeviceSubClass        1字节-子类代码
        0x00,
        //bDeviceProtocol        1字节-设备所使用协议
        0x00,
        //bMaxPackeSize0        1字节-端点0最大包长(16字节)
        0x10,
        //idVender        2字节-厂商ID(PS:低位先行)
        0x12,
        0x34,
        //idProduct        2字节-产品ID(PS:低位先行)
        0x01,
        0x00,
        //bcdDevice 2字节-设备版本号(PS:低位先行)
        0x01,
        0x00,
        //iManufacturer        1字节-厂家字符串索引
        0x01,
        //iProduct        1字节-产品字符串索引
        0x02,
        //iSeriaNumber        1字节-序列号字符串索引
        0x03,
        //bNumConfigurations        1字节-可用的配置数
        0x01
};

uint8 USB_ConfigDescriptor[27]=
{
/*-----------------------------------配置描述符-------------------------------*/
//bLength        1字节-该描述符长度(9字节)
0x09,
//bDescriptorType        1字节-描述符类型(配置描述符)
0x02,
//wTotalLength        2字节-配置描述符集合总长度(PS:低位先行)
sizeof(USB_ConfigDescriptor),        //USBD12_bmReqType()函数限定了配置描述符长度最大为0xFF,如需要发送更大,的配置描述符,要改函数
(sizeof(USB_ConfigDescriptor)>>8),
//bNumInterfaces        1字节-该配置所支持的接口数(1接口数)
0x01,
//bConfigurationValue        1字节-该配置的索引(SetConfiguration()请求对应值)
0x01,
//iConfiguration        1字节-描述该配置的字符串的索引值(没字符串)
0x00,
//bmAttributes        1字节-该设备属性(总线供电,不支持远程唤醒)
0x80,
//bMaxPower        1字节-该设备所需的电流(I=N*2mA 50*2=100mA)
0x32,
/*-----------------------------------接口描述符-------------------------------*/
//bLength        1字节-该描述符长度(9字节)
0x09,
//bDescriptorType        1字节-描述符类型(接口描述符)
0x04,
//bInterfaceNumber        1字节-该接口编号(0)
0x00,
//bAlternateSetting        1字节-该接口备用编号(0)
0x00,
//bNumendpoints        1字节-该接口使用的端点数(仅用ENDP0)
0x00,
//bInterfaceClass        1字节-该接口使用的类(HID)
0x03,
//bInterfaceSubClass        1字节-该接口使用子类(非启动接口)
0X00,
//bInterfaceProtocol        1字节-该接口使用的协议
0X00,
//iInterface        1字节-该接口的字符串索引值(没字符串)
0x00,
/*-----------------------------------HID述符----------------------------------*/
//bLength        1字节-该描述符长度(9字节)
0x09,
//bDescriptorType        1字节-描述符类型(HID描述符)
0x21,
//bcdHID        2字节-HID版本(HID1.11 PS:低位先行)
0x11,
0x01,
//bCountyCode        1字节-设备适用的国家代码(ISO)
0x0D,
//bNumDescriptors        1字节-下级描述符的数目(1)
0x01,
//bDescritporType        1字节-下级描述符类型(报告)
0x22,
//bDescrittorLength        1字节-下级描述符长度(PS:低位先行)
sizeof(USB_ReportDescriptor),
(sizeof(USB_ReportDescriptor)>>8)
/*-----------------------------------IN端点描述符-------------------------------*//*        端点0不应有端点描述
//bLength        1字节-该描述符长度(7字节)
0x07,
//bDescriptorType        1字节-描述符类型(端点描述符)
0x05,
//bEndpointAddress        1字节-端点地址(D7=1,IN方向;D0=0,端点0)
0x80,
//bmAttributes        1字节-端点传类型(控传输,端点0仅支持控制传输)
0x00,
//wMaxPackSize        2字节-该端点最大包长(16 PS:低位先行)
0x10,
0x00,
//bInterval        1字节-端点询时间(帧/ms 10ms)
0x0A,
/*-----------------------------------OUT端点描述符-------------------------------
//bLength        1字节-该描述符长度(7字节)
0x07,
//bDescriptorType        1字节-描述符类型(端点描述符)
0x05,
//bEndpointAddress        1字节-端点地址(D7=0,OUT方向;D0=0,端点0)
0x00,
//bmAttributes        1字节-端点传类型(控制传输,端点0仅支持控制传输)
0x00,
//wMaxPackSize        2字节-该端点最大包长(16 PS:低位先行)
0x10,
0x00,
//bInterval        1字节-端点询时间(帧/ms 10ms)
0x0A        */
};

uint8 USB_ReportDescriptor[19]= //报告描述符
{
//USAGE_PAGE (Vendor Defined Page 1)
0x06,0x00,0xFF,
//LOGICAL_MINIMUM (0)
0x15,0x00,
//LOGICAL_MAXIMUM (1)
0x25,0x01,
//REPORT_SIZE (1)
0x75,0x01,
//REPORT_COUNT (32)
0x95,0x20,
//INPUT (Data,Var,Abs,NLin)
0x81,0x12,
//REPORT_COUNT (32)
0x95,0x20,
//REPORT_SIZE (1)
0x75,0x01,
//OUTPUT (Data,Var,Abs,NLin)
0x91,0x12
};

使用特权

评论回复
板凳
与时俱进| | 2014-3-16 19:35 | 只看该作者
中断方式的轮询间隔在端点的bInterval项里定义,最小可以设为1ms。
把HID设备的端点从中断方式改为批量,不能正常工作。批量方式实时性得不到保证。

使用特权

评论回复
地板
qbasicljx|  楼主 | 2014-3-16 22:30 | 只看该作者
我看到stm32的usb虚拟串口例程 断点是工作在批量方式,还以为批量方式 更加及时呢
原来我理解错误了

使用特权

评论回复
5
hchzdh| | 2017-7-26 03:47 | 只看该作者
本帖最后由 hchzdh 于 2017-7-26 03:49 编辑

    HID规范中指出:HID为发送输入报告必须拥有一个中断输入端点。中断IN端点使HID能够在非可预期的时间内向主机发送信息,主机驱动程序将使用中断事务来周期性的轮询设备以获得数据。

    因此,对于设备来说,其发送端点(对于主机来说是输入端点)必须为中断端点,这是由HID的类驱动程序所决定的,主机的类驱动程序不会读取HID接口的其它类型的端点的数据。这样设计也是为了保证数据传输的带宽。
    而对于HID接口的输出端点(对于设备来说是接收端点),可以使用其它的类型,比如批量端点。我曾经在自己开发的USB设备上使用批量端点进行实验,可以正确接收主机发送的数据。

使用特权

评论回复
6
zhs2007| | 2017-7-28 22:21 | 只看该作者
这帖子有年头了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

113

帖子

0

粉丝