硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2277|回复: 25
收起左侧

STM32F1使用ThreadX+USBX复合设备失败

  [复制链接]

3

主题

24

回帖

33

积分

新手上路

积分
33
发表于 2021-7-29 15:04:47 | 显示全部楼层 |阅读模式
0. 开发环境:ThreadX版本6.16 USBX版本6.16 MDK 5.34
1. 问题描述
之前在V7开发板上成功移植了ThreadX+USBX复合设备(CDC ACM+HID)正常工作且非常稳定  尝试在STM32F105RBT6上进行同样的操作  移植ThreadX时一切正常 但是到USBX时遇到一些问题 单独使用USB CDC或者HID是可以正常工作的 一旦把CDC和HID结合起来就会出现异常
现象是插上USB 设备管理器有虚拟串口和鼠标出现 但是给虚拟串口发送数据时提示串口异常 鼠标也是不能正常工作  然后持续大约50s USB自动断开连接 再过20s重新连接 此时提示设备连接失败 设备描述符请求失败
我推测是105的端点只有4个 H7有9个 端点数量不够导致异常 但是不知道该如何解决
有没有对USBX比较熟悉的前辈 指导一下?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-7-29 15:47:19 | 显示全部楼层
端点问题,看下你的端点分配就行了。贴出来看下
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-7-29 17:39:05 | 显示全部楼层
端点分配.png
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-7-29 17:39:35 | 显示全部楼层
void MX_USB_Device_Init(void)
{
  /* USER CODE BEGIN USB_Device_Init_PreTreatment_0 */
  /* USER CODE END USB_Device_Init_PreTreatment_0 */

  /* Enable the USB voltage level detector */
//  HAL_PWREx_EnableUSBVoltageDetector();

  /* USB_OTG_HS init function */
  MX_USB_OTG_FS_PCD_Init();

  /* USER CODE BEGIN USB_Device_Init_PreTreatment_1 */

  /* Set Rx FIFO */
  HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x200);

  /* Set Tx FIFO 0 */
  HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x10);

  /* Set Tx FIFO 2 */
  HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 0x10);

  /* Set Tx FIFO 3 */
  HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 3, 0x80);

  /* Set Tx FIFO 4 */
  HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 4, 0x20);
  /* USER CODE END USB_Device_Init_PreTreatment_1 */

  /* initialize the device controller driver*/
  ux_dcd_stm32_initialize((ULONG)USB_OTG_FS, (ULONG)&hpcd_USB_OTG_FS);

  /* Start the USB device*/
  HAL_PCD_Start(&hpcd_USB_OTG_FS);

  /* USER CODE BEGIN USB_Device_Init_PostTreatment */
  /* USER CODE END USB_Device_Init_PostTreatment */
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-7-30 09:06:59 | 显示全部楼层
arilink_tao 发表于 2021-7-29 17:39
void MX_USB_Device_Init(void)
{
  /* USER CODE BEGIN USB_Device_Init_PreTreatment_0 */

我查了下,是这样的。
1、1个控制端点,3个通用端点。
2、 共计1.25KB的FIFO空间,所有收发端点公用的一个空间。
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-7-30 14:57:48 | 显示全部楼层
我看数据手册上说的是1个控制端点 3个IN端点 3个OUT端点  按照当前的使用情况  CDC 2个IN 1个OUT  HID一个 IN 一共3个IN 1个OUT 是够用的
我把USBD_HID_EPIN_ADDR设置为0x81 USBD_CDCACM_EPINCMD_ADDR设置为0x82 USBD_CDCACM_EPIN_ADDR设置为0x83 USBD_CDCACM_EPOUT_ADDR设置为0x01后USB不再掉线了 但是数据收发不正确
推测是数据收发部分跟端点地址也有绑定 但是还未找到
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-7-30 15:07:51 | 显示全部楼层
stm32ep.png
字面意思是说有1个控制端点 3个In和3个Out 端点  但是CubeMX生成的代码 hpcd_USB_OTG_FS.Init.dev_endpoints = 4;
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-7-30 15:21:23 | 显示全部楼层
这也太难顶了吧  CubeMX生成USB驱动  F103的芯片 USB端点数量都有8个 到F105上只有4个了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-7-31 08:43:50 | 显示全部楼层
arilink_tao 发表于 2021-7-30 15:21
这也太难顶了吧  CubeMX生成USB驱动  F103的芯片 USB端点数量都有8个 到F105上只有4个了

F103那是个特色设置,仅支持Device
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-7-31 08:46:10 | 显示全部楼层
arilink_tao 发表于 2021-7-30 14:57
我看数据手册上说的是1个控制端点 3个IN端点 3个OUT端点  按照当前的使用情况  CDC 2个IN 1个OUT  HID一个  ...

你的HID仅用了一个IN吗,正常HID是一个1个IN,一个OUT,输入输出都得用。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-7-31 08:59:46 | 显示全部楼层
arilink_tao 发表于 2021-7-30 15:07
字面意思是说有1个控制端点 3个In和3个Out 端点  但是CubeMX生成的代码 hpcd_USB_OTG_FS.Init.dev_endpoi ...

从代码来看应该是端点0也在计算内


  for (i = 0U; i < cfg.dev_endpoints; i++)
  {
    if ((USBx_OUTEP(i)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA)
    {
      if (i == 0U)
      {
        USBx_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_SNAK;
      }
      else
      {
        USBx_OUTEP(i)->DOEPCTL = USB_OTG_DOEPCTL_EPDIS | USB_OTG_DOEPCTL_SNAK;
      }
    }
    else
    {
      USBx_OUTEP(i)->DOEPCTL = 0U;
    }

    USBx_OUTEP(i)->DOEPTSIZ = 0U;
    USBx_OUTEP(i)->DOEPINT  = 0xFB7FU;
  }
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-7-31 09:19:00 | 显示全部楼层
eric2013 发表于 2021-7-31 08:46
你的HID仅用了一个IN吗,正常HID是一个1个IN,一个OUT,输入输出都得用。

是的 当前只需要把数据给电脑   还在尝试在105上跑CDC+HID  不行的话就砍掉CDC 在HID上加上OUT端点
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-7-31 09:19:51 | 显示全部楼层
eric2013 发表于 2021-7-31 08:59
从代码来看应该是端点0也在计算内

我也确认了 包含端点0一共4个  用户可用的只有3个 这也太坑了
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-7-31 09:29:43 | 显示全部楼层
奇怪的是  105上单独跑CDC都不行   我还想尝试把CDC的端点去掉一个
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-7-31 10:59:10 | 显示全部楼层
我把代码上传到百度网盘了 感兴趣的各位大佬指点一下 链接:https://pan.baidu.com/s/1Bb_5dG4sZkOaHl1gLS8zxg
提取码:al4c
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-8-2 15:59:09 | 显示全部楼层
eric2013 发表于 2021-7-31 08:59
从代码来看应该是端点0也在计算内

我通过Debug发现官方CDC例程里VCOM收到数据后通过串口3DMA将数据发送出去,我之前是没有把串口3的DMA打开的 这也就是之前无法正常工作的原因   但是打开DMA后 又有新的问题出现,当我使用串口助手向VCOM发送数据的数据累积到一定量(大概260字节)后 VCOM就会崩掉 但是系统没有卡死  我找了一圈也没有发现问题所在,老大能帮忙看一下吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-8-3 08:43:47 | 显示全部楼层
arilink_tao 发表于 2021-8-2 15:59
我通过Debug发现官方CDC例程里VCOM收到数据后通过串口3DMA将数据发送出去,我之前是没有把串口3的DMA打开 ...

串口先简单的查询方式实现。方便查找问题。
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-8-3 09:19:31 | 显示全部楼层
eric2013 发表于 2021-8-3 08:43
串口先简单的查询方式实现。方便查找问题。

问题应该跟串口无关,现在的现象是串口助手给虚拟串口发送数据超过一定量就会故障,反过来虚拟串口向外发就没问题  串口只起一个回显的功能
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-8-3 14:29:23 | 显示全部楼层
eric2013 发表于 2021-8-3 08:43
串口先简单的查询方式实现。方便查找问题。

VCOM收到数据后通过串口转发出的代码被我屏蔽掉了  问题依然存在,感觉就是ux_device_class_cdc_acm_read的问题,但是又不知道怎么解决
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-8-4 09:11:41 | 显示全部楼层
arilink_tao 发表于 2021-8-3 14:29
VCOM收到数据后通过串口转发出的代码被我屏蔽掉了  问题依然存在,感觉就是ux_device_class_cdc_acm_read ...

剩下就是USBX的相关问题了。
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-8-4 09:32:58 | 显示全部楼层
eric2013 发表于 2021-8-4 09:11
剩下就是USBX的相关问题了。

我在Github上反馈了问题,不过没有一点回应,这就很尴尬  不知道该怎么解决
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-8-5 08:45:03 | 显示全部楼层
arilink_tao 发表于 2021-8-4 09:32
我在Github上反馈了问题,不过没有一点回应,这就很尴尬  不知道该怎么解决

等待他们回复了。
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-8-12 10:37:25 | 显示全部楼层
问题上周已经解决了 谢谢老大
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-8-14 10:48:37 | 显示全部楼层
arilink_tao 发表于 2021-8-12 10:37
问题上周已经解决了 谢谢老大

是什么原因导致的。
回复

使用道具 举报

3

主题

24

回帖

33

积分

新手上路

积分
33
 楼主| 发表于 2021-8-17 09:55:31 | 显示全部楼层
eric2013 发表于 2021-8-14 10:48
是什么原因导致的。

USB的fifo设置有问题  f105的只有1.25K  fifo在HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x10);填入的数值要*4才是实际的大小 这点之前没注意
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2021-8-18 09:10:25 | 显示全部楼层
arilink_tao 发表于 2021-8-17 09:55
USB的fifo设置有问题  f105的只有1.25K  fifo在HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x10);填入的 ...

谢谢告知最终原因。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 22:10 , Processed in 0.468689 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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