某10

懒得写,咕了

STM32 HAL USB端点发送数据异常的解决方法

环境
使用CubeMX生成的CustomHID工程,使用了三个端点进行通信:EP1(IN)模拟键盘,EP2(OUT)接收WINUSB通信,EP2(IN)发送WINUSB通信。
问题
EP1模拟键盘正常,EP2接收上位机软件通信正常,EP2发送数据不正常。表现为上位机接收不到数据,或数据不完整。
问题原因
在usbd_conf.c文件USBD_LL_Init函数中,端点0的PMA地址设置出现了问题。问题出现在语句HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData, 0x00, PCD_SNG_BUF, 0x18);上。
CubeMX默认计算的PMA地址为0x18,只适合最多用到两个端点的应用。
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);其后的配置按需要依次重新计算。
附 例子

  /* USER CODE BEGIN EndPoint_Configuration */
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x40);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x80);
  /* USER CODE END EndPoint_Configuration */
  /* USER CODE BEGIN EndPoint_Configuration_CUSTOM_HID */
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CUSTOM_HID_EPIN_ADDR , PCD_SNG_BUF, 0xC0);
  /* USER CODE END EndPoint_Configuration_CUSTOM_HID */
  /* USER CODE BEGIN EndPoint_Configuration_WINUSB */
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , WINUSB_EPIN_ADDR , PCD_SNG_BUF, 0x100);
  HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , WINUSB_EPOUT_ADDR , PCD_SNG_BUF, 0x140);
  /* USER CODE END EndPoint_Configuration_WINUSB */

参考链接
https://www.amobbs.com/thread-5692754-1-1.html#id=pid10899158

评论卡

已有 6 条评论

  1. rime.he
    rime.he
    2019年10月18日

    楼主我最近也被这个这个卡住了,但我的cube生成的库函数和你完全不一样,可以加个联系方式交流一下吗

    1. 小撸
      小撸
      2019年10月22日

      F0以外的stm32可能需要看看这个:https://community.st.com/s/question/0D50X00009XkeO6SAJ/stm32f4-add-endpoint-to-usb

      1. rime.he
        rime.he
        2019年10月22日

        好的,多谢了,我检查了一下,好像跟F0没什么关系,应该是HAL库的pack版本不一样,话说楼主你这个博客是在哪个平台上弄的?方便加个好友交流一下吗

      2. rime.he
        rime.he
        2019年10月23日

        谢谢楼主,果然是分配的FIFO大小有问题,端口2的问题顺利解决了,多谢了!

        1. 小撸
          小撸
          2019年10月23日

          Telegram:https://t.me/joinchat/MJSzaxBJAxrY2fyjelE9Og

      3. 小撸
        小撸
        2019年10月23日

        Hostker Typecho博客程序