打印
[应用相关]

HID通信字节限制问题

[复制链接]
7047|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bmwlover02|  楼主 | 2009-4-7 12:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在开发基于HID的自定义传输应用,当前的想法是实现每次64字节的报文传输通路。但是在实现过程中发现,我只能每次写入3个字节到下位机即STM32中,如果写入过多,Windows的hid驱动会提示写入失败,错误代码为31(Device A device attached to the system is not functioning).

下面是我的HID描述符以及USB端口描述符:
部分HID描述符:
const u8 CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
  {    
    0x05, 0xAC,                    // USAGE_PAGE (Vendor Defined Page 1)
    0x09, 0x01,                    // USAGE (Undefined)

    0xa1, 0x01,                    // COLLECTION (Application)

    /* PC to STM32 */        
    0x85, 0x01,            /*     REPORT_ID (1)             */
    0x09, 0x01,            /*     USAGE (LED 1)                 */
    0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */          
    0x26, 0xFF, 0x00,      /*     LOGICAL_MAXIMUM (1)        */           
    0x75, 0x08,            /*     REPORT_SIZE (8)            */        
    0x95, 0x02,            /*     REPORT_COUNT (2)           */       
    0xB1, 0x82,             /*    FEATURE (Data,Var,Abs,Vol) */     

    0x85, 0x01,            /*     REPORT_ID (1)              */
    0x09, 0x01,            /*     USAGE (LED 1)              */
    0x91, 0x82,            /*     OUTPUT (Data,Var,Abs,Vol)  */

....

  }; /* CustomHID_ReportDescriptor */

USB描述符
    /******************** 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 */
    0x40,          /* wMaxPacketSize: 2 Bytes max */
    0x00,
    0x20,          /* bInterval: Polling Interval (32 ms) */
    /* 34 */
        
    0x07,    /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE,    /* bDescriptorType: */
            /*    Endpoint descriptor type */
    0x01,    /* bEndpointAddress: */
            /*    Endpoint Address (OUT) */
    0x03,    /* bmAttributes: Interrupt endpoint */
    0x40,    /* wMaxPacketSize: 2 Bytes max  */
    0x00,
    0x14,    /* bInterval: Polling Interval (20 ms) */
    /* 41 */

其中,将HID报文中的0x95, 0x02,            /*     REPORT_COUNT (2)           */    
改为4以下数字可以通信,改成4以上数字则不能通信,请问有兄弟遇到过雷系情况吗?
沙发
bmwlover02|  楼主 | 2009-4-7 14:32 | 只看该作者

有人遇到过么?都要郁闷死了

rt

使用特权

评论回复
板凳
jeames| | 2009-4-8 08:07 | 只看该作者

你的HID报告描述符写的有问题

为什么你有两个报告标示符都是01?


/* PC to STM32 */        
在这里
    0x85, 0x01,            /*     REPORT_ID (1)             */
    0x09, 0x01,            /*     USAGE (LED 1)                 */
    0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */          
    0x26, 0xFF, 0x00,      /*     LOGICAL_MAXIMUM (1)        */           
    0x75, 0x08,            /*     REPORT_SIZE (8)            */        
    0x95, 0x02,            /*     REPORT_COUNT (2)           */       
    0xB1, 0x82,             /*    FEATURE (Data,Var,Abs,Vol) */     
还有在这里?
    0x85, 0x01,            /*     REPORT_ID (1)              */
    0x09, 0x01,            /*     USAGE (LED 1)              */
    0x91, 0x82,            /*     OUTPUT (Data,Var,Abs,Vol)  */


我是这样写的,能够正常工作,你试试看
    0x85, 0x01,                    // REPORT_ID (0x01)             
    0x09, 0x05,                    // USAGE (User define)                 
    0x15, 0x80,                    // LOGICAL_MINIMUM (-128)
    0x25, 0x7F,                    // LOGICAL_MAXIMUM (127)
    0x35, 0x00,                    // PHYSICAL_MINIMUM(0)
    0x45, 0xFF,                    // PHYSICAL_MAXIMUM(255)
    0x75, 0x08,                    // REPORT_SIZE (8)
    0x95, 0x3F,                    // REPORT_COUNT (64)
    0x91, 0x02,                    // OUTPUT (Data,Var,Abs)

使用特权

评论回复
地板
香水城| | 2009-4-8 08:20 | 只看该作者

报告描述符有问题

3楼说的不是问题,HID允许不同的报告类型使用相同的ID,他的第1个REPORT_ID(1)是FEATURE报告,第2个REPORT_ID(1)是OUTPUT报告,所以没有问题。

问题在于这里:
    0x75, 0x08,        /*     REPORT_SIZE (8)            */        
    0x95, 0x02,        /*     REPORT_COUNT (2)           */     
这2行不但描述了第1个REPORT_ID(1)为FEATURE的报告,还描述了第2个REPORT_ID(1)为OUTPUT的报告,所以虽然只有一个REPORT_COUNT(2),但整个报告共有4个字节。

剩下的事情就是要检查上下位机的其它程序部分,是否允许超过4个字节的数据,可能数据缓冲区太小了。

使用特权

评论回复
5
zhang..yb| | 2009-4-8 09:24 | 只看该作者

3楼,能否把你完整的报告描述贴出来?

谢谢!我也卡在这里,搞不定

使用特权

评论回复
6
shockwave| | 2009-4-8 09:45 | 只看该作者

香主说的对。

这方面好像圈圈是砖家。哈哈

使用特权

评论回复
7
computer00| | 2009-4-8 09:53 | 只看该作者

俺做过64字节的完全没问题啊。

参考这两个贴子:
STM32自定义HID设备(64字节):http://blog.**/computer00/123115/message.aspx
如何修改STM32的USB程序:http://blog.**/computer00/143918/message.aspx

使用特权

评论回复
8
computer00| | 2009-4-8 09:56 | 只看该作者

另外,如果你只有一个报告的话,没必要使用报告ID。

但是在应用程序操作HID兼容设备时,需要在前面附加一字节的报告ID,值为0。

如果你声明了报告ID,那么前面这一字节就是你定义的报告ID值了。

使用特权

评论回复
9
jeames| | 2009-4-8 14:19 | 只看该作者

可以,仅供参考


const u8 CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
  {    
    0x06, 0xC0, 0xFF,              // USAGE_PAGE(User define)
    0x09, 0x01,                    // USAGE(User define)
    0xA1, 0x01,                    // COLLECTION (Application)
    0x09, 0x02,                    // USAGE(User define)
    0xA1, 0x00,                    // COLLECTION (Physical)
    // 11 //

    0x85, 0x02,                    // REPORT_ID (0x02)             
    0x09, 0x03,                    // USAGE (User define)                 
    0x15, 0x80,                    // LOGICAL_MINIMUM (-128)
    0x25, 0x7F,                    // LOGICAL_MAXIMUM (127)
    0x35, 0x00,                    // PHYSICAL_MINIMUM(0)
    0x45, 0xFF,                    // PHYSICAL_MAXIMUM(255)
    0x75, 0x08,                    // REPORT_SIZE (8)
    0x95, 0x3F,                    // REPORT_COUNT (64)
    0x81, 0x02,                    // INPUT (Data,Var,Abs)
    // 29 //

    0x85, 0x03,                    // REPORT_ID (0x03)             
    0x09, 0x04,                    // USAGE (User define)                 
    0x15, 0x80,                    // LOGICAL_MINIMUM (-128)
    0x25, 0x7F,                    // LOGICAL_MAXIMUM (127)
    0x35, 0x00,                    // PHYSICAL_MINIMUM(0)
    0x45, 0xFF,                    // PHYSICAL_MAXIMUM(255)
    0x75, 0x08,                    // REPORT_SIZE (8)
    0x95, 0x07,                    // REPORT_COUNT (8)
    0x81, 0x02,                    // INPUT (Data,Var,Abs)
    // 47 //

    0x85, 0x04,                    // REPORT_ID (0x04)             
    0x09, 0x05,                    // USAGE (User define)                 
    0x15, 0x80,                    // LOGICAL_MINIMUM (-128)
    0x25, 0x7F,                    // LOGICAL_MAXIMUM (127)
    0x35, 0x00,                    // PHYSICAL_MINIMUM(0)
    0x45, 0xFF,                    // PHYSICAL_MAXIMUM(255)
    0x75, 0x08,                    // REPORT_SIZE (8)
    0x95, 0x07,                    // REPORT_COUNT (8)
    0x91, 0x02,                    // OUTPUT (Data,Var,Abs)
    // 65 //

    0x85, 0x05,                    // REPORT_ID (0x05)             
    0x09, 0x06,                    // USAGE (User define)                 
    0x15, 0x80,                    // LOGICAL_MINIMUM (-128)
    0x25, 0x7F,                    // LOGICAL_MAXIMUM (127)
    0x35, 0x00,                    // PHYSICAL_MINIMUM(0)
    0x45, 0xFF,                    // PHYSICAL_MAXIMUM(255)
    0x75, 0x08,                    // REPORT_SIZE (8)
    0x95, 0x3F,                    // REPORT_COUNT (64)
    0x91, 0x02,                    // OUTPUT (Data,Var,Abs)
    // 83 //
    0xC0,                      // END_COLLECTION

    0xC0                               // END_COLLECTION
  }; /* CustomHID_ReportDescriptor */

使用特权

评论回复
10
zhang..yb| | 2009-4-8 16:22 | 只看该作者

谢谢

使用特权

评论回复
11
xiaoma2562| | 2013-5-6 11:48 | 只看该作者
mark

使用特权

评论回复
12
拿起书本| | 2013-5-6 15:59 | 只看该作者
最近正在研究这个课题,进来取经来了,有收获

使用特权

评论回复
13
li880wert| | 2013-11-28 12:40 | 只看该作者
是端点 TX和RX 的 地址问题,你增大了一个包到 64字节,但是相应的 端点发送,接收地址没有改

使用特权

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

本版积分规则

9

主题

25

帖子

1

粉丝