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

2020-01-04 18:48发布

EP1 2 3 分别用了三个interface0 1 2  枚举成功了,电脑识别到设备
EP1 EP2通讯OK   EP3不行?  现像就是EP3送到电脑的数据非我发送的数据,(电脑能收到数据)
感觉就像数据溢出一样, 缓冲区 可以到1K 没超啊


  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   */


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;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
D.lovers
1楼-- · 2020-01-05 17:27
本帖最后由 D.lovers 于 2018-5-30 22:14 编辑

用的是野火103ve512k flash.网上找啦好多例程,没有一个能枚举成功,不知道怎么回事!
wind2100
2楼-- · 2020-01-05 22:41
本帖最后由 wind2100 于 2018-6-2 07:53 编辑
D.lovers 发表于 2018-5-30 22:09
用的是野火103ve512k flash.网上找啦好多例程,没有一个能枚举成功,不知道怎么回事! ...


1.USB D+  要上拉电阻, 如果没有电脑根本不识别  , 这里成功了 电脑会显示找到设备.
2.时钟是48MHZ 你如果将主时钟配置错了,也是不识别的, 这时电脑会显示无法识别的设备  
3.当然你的描述符 不对 电脑也会显示无法识别的设备  , 这时你就需要USB调试工具了,一包一包 看握手信息    工具:  Device Monitoring Studio/  USBlyzer/ Bus Hound

补充一下:
对于低速设备,DM接了上拉1.5K欧电阻。

对于全速设备,DP接了上拉1.5K欧电阻。

对于高速设备,一接在主机的时候DP接了上拉1.5K欧电阻,后面经过握手协议之后,DP上断开1.5K欧电阻。
wind2100
3楼-- · 2020-01-06 02:26
20061002838 发表于 2018-5-30 15:12
某些型号的芯片,USB的缓冲区确实有1024字节
USB的缓冲区是一块单独的RAM,只能由USB或者CAN访问,跟普通的 ...

我看的是103的 参考手册  
20061002838
4楼-- · 2020-01-06 06:36
wind2100 发表于 2018-5-31 08:15
我看的是103的 参考手册

103是只有512B RAM
但是USB库是通用的,其他系列也能使用同一个库
F0是1024 RAM,F3有些是512,有些是1024
wind2100
5楼-- · 2020-01-06 10:08
 精彩回答 2  元偷偷看……
adee4210
6楼-- · 2020-01-06 13:28
usb的配置描述符、接口描述符、端点描述符都要设置对才行。

一周热门 更多>