打印
[STM32F2]

使用STM32_USB-Host-Device_Lib_V2.1.0库,增加新的IN_EP2端点不能用

[复制链接]
5326|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abc2001|  楼主 | 2014-7-31 09:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 abc2001 于 2014-7-31 10:00 编辑

现在在用STM32_USB-Host-Device_Lib_V2.1.0调试HID键鼠,用2个接口描述符(不能在报告描述符增加ID的方法),请大家帮忙看看,谢谢!
接口1描述是键盘,接口2描述是鼠标,现在枚举已经成本,PC也已经识别出



现在情况是这样的,HID_IN_EP(0X81),和HID_OUT_EP(0X01)可以正常工作,但HID_IN_EP2现在无法将数据发出,不能工作。
具体对STM32_USB-Host-Device_Lib_V2.1.0库的更改如下:
1. usbd_conf.h:文件中增加需要的端点
#define HID_IN_EP                    0x81
#define HID_OUT_EP                   0x01
#define HID_IN_EP2                   0x82

#define HID_IN_PACKET                4
#define HID_OUT_PACKET               4


2. usb_conf.h:文件中定义了相关端点的FIFO长度
#ifdef USB_OTG_FS_CORE
#define RX_FIFO_FS_SIZE                          128
#define TX0_FIFO_FS_SIZE                          64
#define TX1_FIFO_FS_SIZE                         64//128
#define TX2_FIFO_FS_SIZE                          64//0
#define TX3_FIFO_FS_SIZE                          0

3. USBD_HID_Init函数中增加了对HID_IN_EP2初始化
  /* Open EP IN */
  DCD_EP_Open(pdev,
              HID_IN_EP,
              HID_IN_PACKET,
              USB_OTG_EP_INT);

  /* Open EP OUT */
  DCD_EP_Open(pdev,
              HID_OUT_EP,
              HID_OUT_PACKET,
              USB_OTG_EP_INT);
  /* Open EP IN */
  DCD_EP_Open(pdev,
              HID_IN_EP2,
              HID_IN_PACKET,
              USB_OTG_EP_INT);        
                      // <----- add these lines
  /* Prepare Out endpoint to receive next packet */
  DCD_EP_PrepareRx(pdev,
                   HID_OUT_EP,
                   (uint8_t*)(USB_Rx_Buffer),
                   HID_OUT_PACKET);        

4. USBD_HID_DeInit函数增加了对端点的处理
  /* Close HID EPs */
  DCD_EP_Close (pdev , HID_IN_EP);
  DCD_EP_Close (pdev , HID_OUT_EP);
  DCD_EP_Close (pdev , HID_IN_EP2);

5. 增加了USBD_HID_SendReport_EP2函数,用于发送EP2的数据
uint8_t USBD_HID_SendReport_EP2     (USB_OTG_CORE_HANDLE  *pdev,
                                 uint8_t *report,
                                 uint16_t len)
{
  if (pdev->dev.device_status == USB_OTG_CONFIGURED )
  {
    DCD_EP_Tx (pdev, HID_IN_EP2, report, len);
  }
  return USBD_OK;
}

6. 在应用层,调用USBD_HID_SendReport_EP2发送数据
buf = USBD_HID_GetPos();
  if((buf[1] != 0) ||(buf[2] != 0))
  {
    USBD_HID_SendReport_EP2 (&USB_OTG_dev,
                         buf,
                         4);
现在只要通过USBD_HID_SendReport_EP2发送数据,BUS HOUND收不数据,并出来一些看不懂的信息。




沙发
abc2001|  楼主 | 2014-7-31 11:17 | 只看该作者
有了解的吗?帮忙看一下,是什么原因。谢谢了。

使用特权

评论回复
板凳
香水城| | 2014-7-31 13:08 | 只看该作者
看错误信息,是发生了babble错误,从而把设备端点给Halt住了。

你看看参考手册里关于babble错误的说明呢?

使用特权

评论回复
地板
abc2001|  楼主 | 2014-7-31 14:29 | 只看该作者
香水城版主,我的移植过程,增加的内容是否正确?是否有遗漏的地方?

使用特权

评论回复
5
香水城| | 2014-7-31 15:47 | 只看该作者
调用USBD_HID_SendReport_EP2()后并没有就把数据发送出去了。这个函数只是配置将要用到的传输的长度、包个数、使能端点等,但是都还没有把要传给PC的数据放进TxFIFO。但是这个函数最后做了一件很重要的事:使能了该IN端点对应的TxFIFO空中断。于是在随之而来的TxFIFOEmpty中断中,才把要发送的数据填写到FIFO中。这样,当主机的IN令牌包来了之后就自动把TxFIFO中的数据取走了,如果此次传输成功,会触发该EP的IN-Xfer-Complete中断。

现在Bus Hound没有收到数据,从以上的设备发送过程的分析中,如果主机没有发出IN令牌,自然此次传输无法完成。你查看一下EP2的状态寄存器值,找找线索。

另外,从错误信息看到的Babble信号来说,有可能设备一次发送的数据比这个通道能够一次接收的数据多,或者主机持续收到数据,直到EOF2时刻还没消停。。。

使用特权

评论回复
6
hpyjqy| | 2016-12-7 15:19 | 只看该作者
楼主你好,你还记得您当时是怎么解决这个问题的吗?

使用特权

评论回复
7
幽光360| | 2019-1-5 22:21 | 只看该作者
同问啊,现在是输入端点只有0x81能用,其余的都不行,FIFO都设置了也不行,心好累

使用特权

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

本版积分规则

28

主题

90

帖子

1

粉丝