打印

HID通信字节限制问题

[复制链接]
4243|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bmwlover02|  楼主 | 2009-4-7 14:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在开发基于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以上数字则不能通信,请问有兄弟遇到过类似情况吗?

相关帖子

沙发
lxyppc| | 2009-4-23 15:29 | 只看该作者

你看看你的代码中的SetEPRxCount(ENDP1,...)

你看看你的代码中这句设置的是多少  SetEPRxCount(ENDP1, 64);


并注意这些区间不要有交叠
#define ENDP0_RXADDR        (0x20) /// 保证BTABLE有足够的空间
#define ENDP0_TXADDR        (0x60)

/* EP1  */
/* tx buffer base address */
#define ENDP1_TXADDR        (0x100)
#define ENDP1_RXADDR        (0x140)

使用特权

评论回复
板凳
computer00| | 2009-4-28 10:56 | 只看该作者

其实也没啥拉,买本俺的《圈圈教你玩USB》,里面写得很清

有专门的3章介绍HID设备(如果再加上最后一章的过滤驱动,就有四章了),里面有完整的开发过程、源代码(包括下位机和上位机应用程序)。

使用特权

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

本版积分规则

9

主题

25

帖子

1

粉丝