USB HID?

发布: 2009-6-09 19:10 | 作者: kk_9951 | 来源: StmFans思蜕盟 OPELC 自由电子联盟

STM32 usb 与 PC 端 usb 可以传数据,但一次只能传 2byte.
不知如何解决??

使用 ST 提供的 STM32_USB-FS-Device_Lib_V3.0.1 ->  Custom_HID

src.rar
(2009-06-09 19:10:41, Size: 15.4 KB, Downloads: 9)

guoyin (2009-6-11 12:06:43)
改你的报告描述符,wMaxPacketSize: 为你需要的字节数,还需要报告描述符也改为一致!
kk_9951 (2009-6-11 13:42:49)
wMaxPacketSize 改為8.
usb_prop.c
void CustomHID_Reset(void)
{
    :
    :
    :
  SetEPType(ENDP1, EP_INTERRUPT);
  SetEPTxAddr(ENDP1, ENDP1_TXADDR);
  SetEPRxAddr(ENDP1, ENDP1_RXADDR);
  SetEPTxCount(ENDP1, 8);
  SetEPRxCount(ENDP1, 8);
  SetEPRxStatus(ENDP1, EP_RX_VALID);
  SetEPTxStatus(ENDP1, EP_TX_NAK);
}

使用
              UserToPMABufferCopy(Dat, ENDP1_TXADDR, 8);
           SetEPTxCount(ENDP1, 8);  
           SetEPTxValid(ENDP1);
丟不出來?

還有什麼地方沒修改到...

usb_desc.zip
(2009-06-11 13:42:49, Size: 2.51 KB, Downloads: 6)

guoyin (2009-6-11 15:30:00)
[i=s] 本帖最后由 guoyin 于 2009-6-11 15:31 编辑

看了你的报告表述符,描述的是2个字节呀!第一个是报告ID,第二个是LED状态吧!
kk_9951 (2009-6-11 16:58:06)
报告表述符是用ST 提供的 STM32_USB-FS-Device_Lib_V3.0.1 ->  Custom_HID,
小弟看不太懂,所以不知如何修改,同上修改一些地方,还是有问题,大大可否协助指导?

谢谢
guoyin (2009-6-11 17:26:52)
[i=s] 本帖最后由 guoyin 于 2009-6-11 17:27 编辑

实际上你最大字节为8,只能传送7个字节的有效数据,第一个字节是REPORT ID
还有,不知道你要做成什么样子的设备,希望你能说明一下,加我QQ:3548850
guoyin (2009-6-11 18:16:11)
[i=s] 本帖最后由 guoyin 于 2009-6-11 18:17 编辑

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\Vid_0483&Pid_5750
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HID\Vid_0483&Pid_5750
把以上这两个键删除,再试试!附件是我改过的描述符!

usb_desc.rar
(2009-06-11 18:17:13, Size: 2.52 KB, Downloads: 14)

kk_9951 (2009-6-12 10:52:12)
感谢guoyin 的协助,使用您的描述符已经可以传收ID+7byte.
小弟想要修改成 不要ID 只要传收 513 byte , 目前修改您的描述符,可以到256byte 再上去会造成PC 死机 .
可否请您协助如何描述符 可以传收513 byte(不加ID) ?

谢谢  

usb_prop.c
void CustomHID_Reset(void)
{
    :
    :
    :
  SetEPType(ENDP1, EP_INTERRUPT);
  SetEPTxAddr(ENDP1, ENDP1_TXADDR);
  SetEPRxAddr(ENDP1, ENDP1_RXADDR);
  SetEPTxCount(ENDP1, 513);
  SetEPRxCount(ENDP1, 513);
  SetEPRxStatus(ENDP1, EP_RX_VALID);
  SetEPTxStatus(ENDP1, EP_TX_NAK);
}
guoyin (2009-6-12 13:04:47)
STM32的单个端点FIFO最大为512字节!
kk_9951 (2009-6-12 13:52:36)
请教不要ID 要如何描述,把  0x85, 0x01, 移除会有问题,
另外在设备管理器中会显示 USB 人性化接口装置及HID-compliant device ,
可以改显示指定名称吗?
kk_9951 (2009-6-12 13:52:46)
请教不要ID 要如何描述,把  0x85, 0x01, 移除会有问题,
另外在设备管理器中会显示 USB 人性化接口装置及HID-compliant device ,
可以改显示指定名称吗?
kk_9951 (2009-6-12 17:15:21)
0x06, 0x00, 0xFF,      // USAGE_PAGE (Generic Desktop)
      0x09, 0x00,          // USAGE (Undefined)
      0xA1, 0x01,          // COLLECTION (Application)
      
      0x09, 0x01,          // USAGE (Vendor Usage 1)
      0x15, 0x00,          // LOGICAL_MINIMUM (0)
      0x26, 0xFF, 0x00,     // LOGICAL_MAXIMUM (255)
      0x75, 0x08,          // REPORT_SIZE (8)
      0x95, 0xFF,          // REPORT_COUNT (17)
      0x81, 0x02,          // INPUT (Data,Var,Abs)
      
      0x09, 0x02,          // USAGE (Vendor Usage 2)
      0x15, 0x00,          // LOGICAL_MINIMUM (0)
      0x26, 0xFF, 0x00,     // LOGICAL_MAXIMUM (255)
      0x75, 0x08,          // REPORT_SIZE (8)
      0x95, 0xFF,          // REPORT_COUNT (17)
      0x91, 0x02,         // OUTPUT (Data,Var,Abs)
      0xC0              // END_COLLECTION

void EP1_OUT_Callback(void)
{
     DataLen = GetEPRxCount(ENDP1);
     PMAToUserBufferCopy(Receive_Buffer, ENDP1_RXADDR, DataLen);     
    SetEPRxValid(ENDP1);
}
        DataLen = 255
        Receive_Buffer 收到的资料与PC传来的位移1byte
        PC[0]=0 , PC[1]=1, PC[2]=2 ….  结果 Receive_Buffer[0] = 1, Receive_Buffer[1] =2, Receive_Buffer[2] = 3 …

关于 0x95, 0xFF  // REPORT_COUNT , 要如何大于255 ?
guoyin (2009-6-12 17:16:34)
0x96, 0x00, 0x02 就是512字节了
guoyin (2009-6-12 17:17:13)
把我改的一个例子给你看看!

Custom_HID.rar
(2009-06-12 17:17:13, Size: 43.9 KB, Downloads: 26)

kk_9951 (2009-6-13 08:19:52)
目前看来STM32 应该没有问题了, 会错误应为PC端 BCB 所使用的HID VCL 组件有问题.

HIDController.v1.0.32.Full.Source.Delphi.BCB.554174.rar
(2009-06-13 08:19:52, Size: 805 KB, Downloads: 30)

kk_9951 (2009-6-17 11:09:25)
使用 guoyin 的描述 , PC端usb 傳送 Data[0]~[255] = 0x00~0xFF, Data[256]~[511] = 0x00~0xFF ,

在STM32 接收到的資料 Receive_Buffer[0]~[251] = 0x01~0xFC , Receive_Buffer[252]~[511] 不對.  



DataLen = GetEPRxCount(ENDP1);
PMAToUserBufferCopy(Receive_Buffer, ENDP1_RXADDR, DataLen);
SetEPRxValid(ENDP1);


test1.JPG


test2.JPG

guoyin (2009-6-17 16:10:31)
兄弟,原因在于STM32的FIFO只有512字节,所以无法满足你的要求!你可以看规格上面写的是16*32的写FIFO,那你只能用中断每次少传一些数据,多次传输。
        0x06, 0xa0, 0xff,                 /*usage page (generic desktop)  */
        0x09,        0x00,                                         /*usage undefined                                                                */       
        0xa1,        0x01,                                                /*collection (application)      */
        0x09,        0x01,                                                /*usage undefined                                                         */
        0x15, 0x00,                                                /*logical minimum(0)                                                */
        0x25,        0xff,                                                /*logical maximum(ffh)                                        */
        0x35, 0x00,                                                /*physical minimum 0                                          */
        0x45, 0xff,                                                /*physical maximum ff(-1d)                         */
        0x75,        0x08,                                                /*report size 8                                                                  */
        0x95, 0x80,                        /*report count 1                                                                 */
        0x81,        0x02,                                                /*input(variable)                                                                */
        0x09,        0x02,                                                /*usage undefined                                                         */
        0x15,        0x00,                                                /*logical minimum 0                                                        */
        0x25,        0xff,                                                /*logical maximum ffh                                                 */
        0x35,        0x00,                                                /*physical minimum 0                                                 */
        0x45,        0xff,                                                /*physical maximum ffh/-1d                  */
        0x75,        0x08,                                                /*report size 8                                                                 */
        0x95,        0x80,                        /*report count 1                                                          */
        0x91,        0x02,                                         /*output (variable)                                                        */
        0xc0
guoyin (2009-6-17 16:14:50)
上面的报告描述符是输入和输出均为128字节!
guoyin (2009-6-17 16:16:32)
上面的报告描述符是输入和输出均为128字节!
blm751 (2009-9-17 13:18:05)
最近在做一个基于STM32 USB HID 的传输装置,有问题请教一下
如果在报告描述符将report count  设置为128,那么每次传输时如果数据不满128个,是不是USB 控制器补足128个再发送?
如果在要传输的一包数据大于128个,是不是要采用report id 做标记,由pc 端程序解析?
谢谢
guoyin (2009-9-17 20:53:17)
超过要分多次传输,不足传实际长度