打印
[STM32F1]

STM32F105 通过CubeMx创建USB HID始终无法识别

[复制链接]
527|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 ReuterkLL 于 2021-1-25 10:22 编辑

STM32F105 通过CubeMx创建USB HID始终无法识别

这两天拿一个现成的板子想测试一下USB功能,但是通过最新版的CubeMx创建的项目文件,下载之后始终无法被windows识别(unkown device)。
F105的USB和CAN等接口可以共存,所以在验证过程中把两种组合都测试了一遍,涛声依旧,无法识别。

即使将debug级别调整为3,想输出上电期间的任何消息,没有任何错误消息从调试usart端口输出。说明运行似乎还特正常。

除了USB功能之外,在主循环内的代码无误(这里将CAN已经去掉)。USART工作无误。
cubemx内将USB直接设置为device,然后PA10(作为OTG的ID)自动忽略。
系统始终通过MX自动设置,看起来也是没有问题。

甚至使用仿真器进入到USB上电枚举过程,也可以在运行。但是,这些似乎都无效。总之一句话:不认。
这里USB_EN为L时,则板子作为device连接到主机(PC),为高时,则USB的DP为悬空,主机认为没有设备连接。

问题:还有什么需要考虑的吗?需要修改MX自动生成的HID(不是自定义的)的代码?
板子某宝上的



  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SPI1_Init();
  MX_USART2_UART_Init();
  MX_USB_DEVICE_Init();

HAL_GPIO_WritePin(GPIOC, USB_EN_Pin, GPIO_PIN_RESET);

  while (1)
  {
          HAL_Delay(1000);
          HAL_GPIO_TogglePin(GPIOC,LED_1_Pin);
  }

使用特权

评论回复
沙发
ReuterkLL|  楼主 | 2021-1-25 12:02 | 只看该作者







相互矛盾的说明书和MDK仿真器内的寄存器定义,不知道该相信哪一个了。


使用特权

评论回复
板凳
sonicll| | 2021-1-25 14:12 | 只看该作者
本帖最后由 sonicll 于 2021-1-25 14:16 编辑

先确定你USB的时钟是不是48MHz,如果时钟没问题,那就打断点看看枚举过程在哪一步没通过,比如看看有没有正确收到主机的get_descriptor请求。
还有你手册看错了,F105是Connectivity line系列的,你RCC部分需要看第8章而不是第7章

还有,你DP线上的上拉电阻控制,这个上拉电阻只有使用F103的USB时,才需要外置的上拉电阻,如果是F105,107的OTG_FS,芯片内部已经集成上拉电阻了,外部电路是不需要额外上拉的

使用特权

评论回复
地板
香水城| | 2021-1-25 15:06 | 只看该作者
STM32F1系列又分互联型和非互联型,简单点记,F105/107就是属于互联型【connectivity line],其它为非互联型。

所以你这样对应的手册部分要基于互联型章节。


这里系统时钟源一定要使用HSE。其它方面楼上提醒了,基本上用CubeMx配置下来还是很容易识别的。

使用特权

评论回复
5
ReuterkLL|  楼主 | 2021-1-25 17:08 | 只看该作者
本帖最后由 ReuterkLL 于 2021-1-25 17:13 编辑
sonicll 发表于 2021-1-25 14:12
先确定你USB的时钟是不是48MHz,如果时钟没问题,那就打断点看看枚举过程在哪一步没通过,比如看看有没有正 ...

3楼说的没错!F105的寄存器说明应该看RM的第八章!在所有的配置里,一直用了外部HSE(代码中也查看了)。另外,之前测试了UART,配置了相关的波特率,工作没有问题,所以从侧面看时钟配置应该没有什么问题。

不过,这里无论是使用外部的三极管,还是内部的SDIS控制DP上的上拉,结果还是有问题。
USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_SDIS

完全靠内部的SDIS,则几乎看不到windows的反应;用外部三极管似乎还可以看到一个USB 外设有问题的提示;
无论是在用SDIS控制DP上拉,还是三极管,
USB device init中,调用(USBD_Start(&hUsbDeviceFS) != USBD_OK),都可以看到约2次中断;
void OTG_FS_IRQHandler(void)
{
  HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS);
}


跟到下面的代码:

第一次中断进入处理代码:
——————————————————————————————————————
...
    /* Handle Enumeration done Interrupt */
    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE))
    {
      (void)USB_ActivateSetup(hpcd->Instance);
      hpcd->Init.speed = USB_GetDevSpeed(hpcd->Instance);

      /* Set USB Turnaround time */
      (void)USB_SetTurnaroundTime(hpcd->Instance,
                                  HAL_RCC_GetHCLKFreq(),
                                  (uint8_t)hpcd->Init.speed);

#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
      hpcd->ResetCallback(hpcd);
#else
      HAL_PCD_ResetCallback(hpcd);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */

      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE);
    }

...

第二次中断进入后,就跳到处理Suspend后同时处理Reset Interrupt,然后就没有然后了。
如果是全靠SDIS,则windows至此没有任何提示,没有发现任何多出的HID设备;
如果用外部三极管,则还可以看到“无法识别的USB设备”;
——————————————————————————————————————
...
    /* Handle Suspend Interrupt */
    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP))
    {
      if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_SUSPSTS) == USB_OTG_DSTS_SUSPSTS)
      {
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
        hpcd->SuspendCallback(hpcd);
#else
        HAL_PCD_SuspendCallback(hpcd);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
      }
      __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_USBSUSP);
    }
——————————————————————————————————————
    /* Handle Reset Interrupt */
    if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_USBRST))
    {
      USBx_DEVICE->DCTL &= ~USB_OTG_DCTL_RWUSIG;

——————————————————————————————————————

不知道还有哪些需要留意或者更改的?






使用特权

评论回复
6
ReuterkLL|  楼主 | 2021-1-29 17:38 | 只看该作者
今天拿到(花了银子从某宝)又拿了一块板子,这次是407。
先用Mx试了一下HID,可以触发,并且在硬件管理系统内查看到。
虽然是在other devices内罗列出的unknown device,但是VID/PID都可以被系统读取。

使用特权

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

本版积分规则

9

主题

31

帖子

0

粉丝