打印
[STM32F1]

碰到一个问题:STM32 USB EP1 EP2通讯OK EP3不行?

[复制链接]
1756|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
EP1 2 3 分别用了三个interface0 1 2  枚举成功了,电脑识别到设备
EP1 EP2通讯OK   EP3不行?  现像就是EP3送到电脑的数据非我发送的数据,(电脑能收到数据)
感觉就像数据溢出一样, 缓冲区 可以到1K 没超啊

typedef struct
{
  uint8_t   num;            /*!< Endpoint number
                                This parameter must be a number between Min_Data = 1 and Max_Data = 15    */

  uint8_t   is_in;          /*!< Endpoint direction
                                This parameter must be a number between Min_Data = 0 and Max_Data = 1     */

  uint8_t   is_stall;       /*!< Endpoint stall condition
                                This parameter must be a number between Min_Data = 0 and Max_Data = 1     */

  uint8_t   type;           /*!< Endpoint type
                                 This parameter can be any value of @ref USB_EP_Type                      */

  uint16_t  pmaadress;      /*!< PMA Address
                                 This parameter can be any value between Min_addr = 0 and Max_addr = 1K   */

  uint16_t  pmaaddr0;       /*!< PMA Address0
                                 This parameter can be any value between Min_addr = 0 and Max_addr = 1K   */

  uint16_t  pmaaddr1;        /*!< PMA Address1
                                 This parameter can be any value between Min_addr = 0 and Max_addr = 1K   */

  uint8_t   doublebuffer;    /*!< Double buffer enable
                                 This parameter can be 0 or 1                                             */

  uint16_t  tx_fifo_num;    /*!< This parameter is not required by USB Device FS peripheral, it is used
                                 only by USB OTG FS peripheral   
                                 This parameter is added to ensure compatibility across USB peripherals   */

  uint32_t  maxpacket;      /*!< Endpoint Max packet size
                                 This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */

  uint8_t   *xfer_buff;     /*!< Pointer to transfer buffer                                               */

  uint32_t  xfer_len;       /*!< Current transfer length                                                  */

  uint32_t  xfer_count;     /*!< Partial transfer length in case of multi packet transfer                 */

} USB_EPTypeDef;


USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev)
{
  /* Init USB Ip. */
  /* Link the driver to the stack. */
  hpcd_USB_FS.pData = pdev;
  pdev->pData = &hpcd_USB_FS;

  hpcd_USB_FS.Instance = USB;
  hpcd_USB_FS.Init.dev_endpoints = 8;
  hpcd_USB_FS.Init.speed = PCD_SPEED_FULL;
  hpcd_USB_FS.Init.ep0_mps = DEP0CTL_MPS_8;
  hpcd_USB_FS.Init.low_power_enable = DISABLE;
  hpcd_USB_FS.Init.lpm_enable = DISABLE;
  hpcd_USB_FS.Init.battery_charging_enable = DISABLE;
  if (HAL_PCD_Init(&hpcd_USB_FS) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 ,   PCD_SNG_BUF, 0x18);              //???这里不太明白为什么要从0x18 开始 手册上看了无结果
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 ,   PCD_SNG_BUF, 0x58);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x01,    PCD_SNG_BUF, 0x98);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81,   PCD_SNG_BUF, 0xD8);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x02,   PCD_SNG_BUF, 0x118);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x82,   PCD_SNG_BUF, 0x158);

  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x03,   PCD_SNG_BUF, 0x198);           //EP3
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x83,   PCD_SNG_BUF, 0x1D8);

  return USBD_OK;
}

uint8_t USBD_EP3_HID_SendReport     (USBD_HandleTypeDef  *pdev,
                                        uint8_t *report,
                                        uint16_t len)
{   
    USBD_CUSTOM_HID_HandleTypeDef     *hhid = (USBD_CUSTOM_HID_HandleTypeDef*)pdev->pClassData;

    if (pdev->dev_state == USBD_STATE_CONFIGURED )
    {
        static u32 iOut;
        iOut = 0xffff;
        while(hhid->state3 != CUSTOM_HID_IDLE && iOut);  //等待发送完成
        {
            iOut--;
        }
        if(hhid->state3 == CUSTOM_HID_IDLE)
        {
            hhid->state3 = CUSTOM_HID_BUSY;
            USBD_LL_Transmit (pdev,
                              0X83,
                              report,
                              len);
        }
    }
    return USBD_OK;
}



865555b0d0a6771570.png (65.62 KB )

865555b0d0a6771570.png
沙发
eydj2008|  楼主 | 2018-5-30 12:31 | 只看该作者
OK 了 结下贴    主要问题    pmaadress <= 512B   
1K是误导

使用特权

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

本版积分规则

个人签名:http://yonyon.taobao.com  步进电机 细分驱动开发板 编程技术交流交流QQ群A:121960

103

主题

3188

帖子

17

粉丝