amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 728|回复: 19

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

[复制链接]
发表于 2018-5-29 16:23:25 | 显示全部楼层 |阅读模式
50莫元
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;
}

 楼主| 发表于 2018-5-29 20:27:31 | 显示全部楼层
本坛   玩USB的不多啊!  这个问题  折腾了二天了  有些郁闷 .  感觉就像缓冲区 设置问题,但怎么设都不行,又没超...
发表于 2018-5-29 20:43:43 | 显示全部楼层
感觉像是FIFO分配的问题
 楼主| 发表于 2018-5-30 08:17:33 | 显示全部楼层
nzk123 发表于 2018-5-29 20:43
感觉像是FIFO分配的问题

是啊,  平时最多也就用二个接口  二个端点 就行了, 我突然加多了一个就不行了,  为了适配人家做好的一个上位机, 是接口3
才出来这怪问题   我再换换接口看
照理论,只要正确的丢向缓冲区 就可以发出去了

PMA 我每组64字节   

3.50版本  的发送
/**
* @brief 通过USB发送数据
* @param data 数据存储首地址
* @param dataNum 发送的数据字节数
* @retval 发送的字节数
*/
uint32_t USB_SendData(uint8_t *data,uint32_t dataNum)       
{
//将数据通过USB发送出去
UserToPMABufferCopy(data, ENDP2_TXADDR, dataNum);//拷贝数据到PMA中
SetEPTxCount(ENDP2, REPORT_COUNT); //从端点2发送64字节数据
SetEPTxValid(ENDP2);        //使能端点2的发送状态
return dataNum;
}
 楼主| 发表于 2018-5-30 09:40:35 | 显示全部楼层
OK 了 ,

我反复检查    测试    单缓冲模式 pmaadress 的地址不能超过512B  0X1C0 , 发送最大是0x40




下面这个库中注释的 就不明白了 为啥是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   */





好狗血  中文翻译有误     然而库 又标识1K   我用的 103C8T6 RAM 20K  , 这512B还是那20K内的SRAM

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2018-5-30 10:59:24 | 显示全部楼层
USB HID 被我摸得差不多了,  有问题 可以相互学习.
发表于 2018-5-30 15:12:32 | 显示全部楼层
某些型号的芯片,USB的缓冲区确实有1024字节
USB的缓冲区是一块单独的RAM,只能由USB或者CAN访问,跟普通的那20K RAM不一样
发表于 2018-5-30 22:09:02 来自手机 | 显示全部楼层
本帖最后由 D.lovers 于 2018-5-30 22:14 编辑

用的是野火103ve512k flash.网上找啦好多例程,没有一个能枚举成功,不知道怎么回事!
 楼主| 发表于 2018-5-31 08:09:16 | 显示全部楼层
本帖最后由 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欧电阻。
 楼主| 发表于 2018-5-31 08:15:57 | 显示全部楼层
20061002838 发表于 2018-5-30 15:12
某些型号的芯片,USB的缓冲区确实有1024字节
USB的缓冲区是一块单独的RAM,只能由USB或者CAN访问,跟普通的 ...

我看的是103的 参考手册  
发表于 2018-5-31 13:27:45 | 显示全部楼层
wind2100 发表于 2018-5-31 08:15
我看的是103的 参考手册

103是只有512B RAM
但是USB库是通用的,其他系列也能使用同一个库
F0是1024 RAM,F3有些是512,有些是1024
 楼主| 发表于 2018-6-1 15:10:51 | 显示全部楼层
又发现一个怪问题   上位机 抓包工具 显示发送的EP3端点  INTERFACE 2 ,
然后我收接 就死活 不进EP3 ,中断肯定是打开的.  然而在EP0收到 上位机发下来的数据...!!!
发表于 2018-6-1 15:27:32 | 显示全部楼层
usb的配置描述符、接口描述符、端点描述符都要设置对才行。
发表于 2018-6-1 15:29:47 | 显示全部楼层
wind2100 发表于 2018-6-1 15:10
又发现一个怪问题   上位机 抓包工具 显示发送的EP3端点  INTERFACE 2 ,
然后我收接 就死活 不进EP3 ,中断 ...

说明EP0的配置正确,但是EP3的配置不正确,好好看一下配置描述符、接口描述符、端点描述符。
发表于 2018-6-1 16:44:02 来自手机 | 显示全部楼层
wind2100 发表于 2018-5-31 08:09
1.USB D+  要上拉10K电阻, 如果没有电脑根本不识别  , 这里成功了 电脑会显示找到设备.
2.时钟是48MHZ 你 ...

感谢解惑!野火的板他的历程mass store,没HID.还用一个IO控制D+的!另外已买一个最小系统板,但是再做测试
 楼主| 发表于 2018-6-1 17:11:47 | 显示全部楼层
D.lovers 发表于 2018-6-1 16:44
感谢解惑!野火的板他的历程mass store,没HID.还用一个IO控制D+的!另外已买一个最小系统板,但是再做测 ...

D+ 上面, 就是 要加一个加拉电阻, 用来 重连USB.  所以用MCU的IO来控制
STM32的特性  
我用笙泉的USB MCU 是不需要的.
 楼主| 发表于 2018-6-1 17:16:09 | 显示全部楼层
adee4210 发表于 2018-6-1 15:29
说明EP0的配置正确,但是EP3的配置不正确,好好看一下配置描述符、接口描述符、端点描述符。 ...

感觉不像   EP3 我发往电脑的数据是正确的, 先前是 PMA 设置问题

用EP0 收到了,   EP3的数据 (电脑抓包软件是显示在接口2 端点3), 所以感觉怪.

枚举不成功  电脑是发不了数据的. 你根本无法抓包.
 楼主| 发表于 2018-6-1 17:45:34 | 显示全部楼层
现在就是差一个工具 端点测试工具  ,用来收发的  
我只测试了 向电脑发 所以收就有问题
发表于 2019-8-15 07:39:33 | 显示全部楼层
本帖最后由 undead 于 2019-8-15 07:43 编辑

我调试的时候也发现一样的问题,其他端点1、2、4 OUT端点都可以,唯独端点3 OUT不行,但端点3 IN可以, 但测试官方的VCP,把端点设置为03又可以,也不知道咋回事
发表于 2019-8-17 18:07:30 | 显示全部楼层
结一下楼主的帖子吧。也是折腾了我好几天,还是对PMA理解不透
主要问题出在这句话
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);

问题原因:
实际上官方写这个0x18是经过计算的,只适合最多用到端点2的应用。 PMA区域从0开始保存了端点地址和端点缓冲区地址,每个端点占用了8个字节(OUT描述4字节,IN描述4字节),
但中间未用的端点位置是保留在那里的。当我们使用到端点3的时候,需要占用0,1,2,3共4个端点描述空间,也就是4x8=32字节=0x20,也就是端点0的缓冲区至少要再0x20后面。

解决方案:
为了一劳永逸,预留所有8个端点的空间,8x8=64=0x40字节的端点描述区域,当然对于空间比较紧张的应用,可以根据需要计算。

HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 ,   PCD_SNG_BUF, 0x40);
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-15 14:56

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表