0

你好吗?希望你们一切都好=)

我使用 V.10.1 版本固件包开发了我的应用程序。有人要求我更新固件以使用 V1.11.1 固件包。当我升级时,一些事情搞砸了,包括 CustomHID。

这是正在发生的事情:

在 CUSTOM_HID_OutEvent_FS 函数中,我的设备使用

USBD_CUSTOM_HID_SendReport。这与 V1.10.1 完美配合。现在我升级了,我的整个 USB 通讯在第一次发送 ACK 后就搞砸了。在第一次发送包后,我的应用程序无法通过 USB 接收发送数据。如果我删除 ACK 发送,我可以连续接收数据。

更新后我注意到:

PCB 和 USB LL 库已更改。经过大量调试后,我注意到这个特定的函数搞砸了:PCD_EP_ISR_Handler。

此功能从 V1.10.1 更新到 V1.11.1。我研究了这个函数和 USB 代码流,发现了一个让我的 USB 通信恢复工作的变化。这是 EP_ISR_Handler 函数的最后几行:

        if ((ep->type == EP_TYPE_BULK) && ((wEPVal & USB_EP_KIND) == 0U))
        {
          /* multi-packet on the NON control IN endpoint */
          TxByteNbre = (uint16_t)PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);

          if (ep->xfer_len > TxByteNbre)
          {
            ep->xfer_len -= TxByteNbre;
          }
          else
          {
            ep->xfer_len = 0U;
          }

          /* Zero Length Packet? */
          if (ep->xfer_len == 0U)
          {
            /* TX COMPLETE */
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
            hpcd->DataInStageCallback(hpcd, ep->num);
#else
            HAL_PCD_DataInStageCallback(hpcd, ep->num);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
          }
          else
          {
            /* Transfer is not yet Done */
            ep->xfer_buff += TxByteNbre;
            ep->xfer_count += TxByteNbre;
            (void)USB_EPStartXfer(hpcd->Instance, ep);
          }
        }
        /* Double Buffer Iso/bulk IN (bulk transfer Len > Ep_Mps) */
        else
        {
          (void)HAL_PCD_EP_DB_Transmit(hpcd, ep, wEPVal);
        }
      }

使我的 USB 通信恢复工作的原因是在上面的代码片段的最后几行中将 HAL_PCD_EP_DB_Transmit 更改为 HAL_PCD_EP_Transmit。

老实说,我远非 USB 专家,我不知道此功能更改对 USB 流的确切影响是什么。我所知道的是,我不应该修改 ST 驱动程序以使我的应用程序正常工作。

按照 ST youtube 频道上提供的教程,我的自定义 HID 已经开始工作了。我正在使用完全按照教程中描述的 64 字节包接收/发送的 USB 设置。

我已经尝试过的事情:

-> 仅使用 CUSTOM Hid 创建了 V1.11.1 项目。有同样的行为。

-> 尝试使用 V1.11.0。有同样的行为。

所有这些都解释了,有人可以给我一个提示我该怎么做吗?我需要将固件包更新到最新版本。

4

0 回答 0