硬汉嵌入式论坛

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

stm32u5开发板 usbx调试

[复制链接]

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2023-9-25 15:10:42 | 显示全部楼层 |阅读模式
本帖最后由 海淀谢尔顿 于 2023-9-25 15:22 编辑

平台:STM32U575qii-EV板
模块:USBX,ThreadX
目的:stm32u575芯片作为usb device和PC实现双向通信,device为HID Custom类
已经遇到如下问题:
1. 初始化完成后,可正常枚举设备信息,也可正常上报数据,但是第二帧上报的数据如果超过5s,就进入suspend模式,无法唤醒
    --因为项目还需要用到CDC-ACM,使能CDC-ACM模块后,该问题解决,应该是CDC一直在工作,不会让总线休眠;
2. host(PC)通过bus Hound可以向device发送数据,但是只能发送一帧,第二次再发送bus Hound底部显示running,无法complete,一定时间后,device就停止工作了
    --目前查着代码,主机向从机发送数据,通过中断接收,中断的处理部分如下:
   
        之后在running的状态下,不会进入到这个中断标志位的处理,而是周期性进入下图中的中断标志位的处理(NAK)
        
        数据接收在如下的callback中处理
        

    请教各位大佬,这个host向device发送数据,只能发送一帧的问题有经历过的么,求指教,感激不尽~

figure01

figure01

figure02

figure02

figure03

figure03
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2023-9-25 15:28:06 | 显示全部楼层
1、Host向Device一次发送多少字节。
2、注意端点FIFO大小配置,这个非常重要。
2、运行模拟鼠标或键盘的例子是否正常,实在不行,可以用这个例子修改描述为自定义HID类测试。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-9-25 15:35:14 | 显示全部楼层
eric2013 发表于 2023-9-25 15:28
1、Host向Device一次发送多少字节。
2、注意端点FIFO大小配置,这个非常重要。
2、运行模拟鼠标或键盘的 ...

1. Host向Device双向的通信字节配置都是64字节,端点1
2. HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x0200);
    HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40);
    HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x40);
3. 鼠标的例子运行过了,配置的就是Custom HID类,然后将report描述符使用鼠标的,可以正常控制鼠标,并且发送间隔不会使总线休眠;目前report的描述符是复用的我们之前项目的描述符,一个input一个output。
我也对比过我这个工程,以及单纯的鼠标demo,有差异的地方主要就是描述符的部分。其他的接口几乎一样
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2023-9-25 16:11:28 | 显示全部楼层
海淀谢尔顿 发表于 2023-9-25 15:35
1. Host向Device双向的通信字节配置都是64字节,端点1
2. HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x020 ...

这两个都加大一倍试试。
    HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40);
    HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x40);
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-9-25 16:39:40 | 显示全部楼层
eric2013 发表于 2023-9-25 16:11
这两个都加大一倍试试。
    HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40);
    HAL_PCDEx_SetTxFi ...

谢谢大佬

刚调试中找到部分原因了
/**
  * @brief  USBD_Custom_HID_SetReport
  *         This function is invoked when the host sends a HID SET_REPORT
  *         to the application over Endpoint OUT (Set Report).
  * @param  hid_instance: Pointer to the hid class instance.
  * @retval none
  */
VOID USBD_Custom_HID_SetReport(struct UX_SLAVE_CLASS_HID_STRUCT *hid_instance)
{
  /* USER CODE BEGIN USBD_Custom_HID_SetReport */   
   
    ux_device_class_hid_receiver_event_get(hid_instance, &usb_hid_event_rec);
    memcpy(hid_receive_buff, usb_hid_event_rec.ux_device_class_hid_received_event_data,
           usb_hid_event_rec.ux_device_class_hid_received_event_length);
   
    ux_device_class_hid_receiver_event_free(hid_instance);
  /* USER CODE END USBD_Custom_HID_SetReport */

  return;
}
在这个接收的callback函数中,接收完一次数据,需要将slave的hid事件释放,才能进入到下一次的传输。

但是又有新问题出现,传输10次后,就又是这样了,一直卡在running的状态,估计和FIFO相关了。一步一个坎呀
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-9-25 17:15:57 | 显示全部楼层
eric2013 发表于 2023-9-25 16:11
这两个都加大一倍试试。
    HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40);
    HAL_PCDEx_SetTxFi ...

确实是fifo配置影响的
  HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x80);
  HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40);
  HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x40);
使用这样的配置,目前测试数据接收和发送,就没有问题了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2023-9-25 17:30:00 | 显示全部楼层
海淀谢尔顿 发表于 2023-9-25 17:15
确实是fifo配置影响的
  HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x80);
  HAL_PCDEx_SetTxFiFo(&hpcd_ ...

好的,ST的好几个系列都可以这种问题,略坑,在上面耽误很长时间。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-9-25 17:41:18 | 显示全部楼层
eric2013 发表于 2023-9-25 17:30
好的,ST的好几个系列都可以这种问题,略坑,在上面耽误很长时间。

是的,用的比较新的芯片,资料比较少,全靠自己踩坑
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-9-27 14:43:23 | 显示全部楼层
请问下问题1,为了确保总线不休眠就要用到CDC-ACM模块?还有其他的解决方法吗?
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-9-28 09:49:55 | 显示全部楼层
gumenggumeng 发表于 2023-9-27 14:43
请问下问题1,为了确保总线不休眠就要用到CDC-ACM模块?还有其他的解决方法吗?

因为我们要用到CDC-ACM模块,所以就直接这么用了

如果不需要该模块,可以考虑用心跳包避免休眠的情况

我查了几天代码,没有找到从代码上入手去避免休眠,好像是现在最新的芯片低功耗功能的一个问题。问了相关代理的FAE,也是没有说如何避免这个问题
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-9-28 11:04:50 | 显示全部楼层
海淀谢尔顿 发表于 2023-9-28 09:49
因为我们要用到CDC-ACM模块,所以就直接这么用了

如果不需要该模块,可以考虑用心跳包避免休眠的情况
...

嗯嗯 是可以的 我看了下 用了其他的上位机,连接到device后上位机每隔一段时间就向总线广播SOF包,总线不会休眠,跟你说的心跳包是差不多的原理。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-9-28 11:09:21 | 显示全部楼层
海淀谢尔顿 发表于 2023-9-28 09:49
因为我们要用到CDC-ACM模块,所以就直接这么用了

如果不需要该模块,可以考虑用心跳包避免休眠的情况
...

还想请教你一下,Bus Houd 向device发送数据,窗口显示invaild command,请问你有遇到过吗?
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-9-28 11:32:30 | 显示全部楼层
gumenggumeng 发表于 2023-9-28 11:09
还想请教你一下,Bus Houd 向device发送数据,窗口显示invaild command,请问你有遇到过吗?

遇到过,这个问题大概率是初始化的基础配置问题

可以先看看端点的FIFO配置是不是可以的

我这用了ThreadX操作系统,usbx模块有些接口。不知道你那的具体配置是什么
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2023-9-28 11:36:56 | 显示全部楼层
gumenggumeng 发表于 2023-9-28 11:04
嗯嗯 是可以的 我看了下 用了其他的上位机,连接到device后上位机每隔一段时间就向总线广播SOF包,总线不 ...

SOF按理说是主机1ms就要发送一次的,从机如果超过三个SOF信号接收不到会认为主机进入休眠。但是我这遇到的是发送整包数据的间隔超过5s,会进入到suspend模式,这两者之间应该是有差别的。如果你的现象也如此,那就需要在5s内,发送一些特定的数据包,告诉对方现在还在工作,数据里可以包括自己定义的协议内容,不如时间戳啥的,避免休眠。
回复

使用道具 举报

1

主题

10

回帖

13

积分

新手上路

积分
13
发表于 2023-9-28 14:43:23 | 显示全部楼层
海淀谢尔顿 发表于 2023-9-28 11:32
遇到过,这个问题大概率是初始化的基础配置问题

可以先看看端点的FIFO配置是不是可以的

可以加个Q2467335580交流下吗?谢谢!
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
发表于 2024-2-3 21:50:47 | 显示全部楼层
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
发表于 2024-2-3 22:45:04 | 显示全部楼层
hid不像cdc一样能自动组个大数据包。。。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
发表于 2024-2-5 21:48:29 | 显示全部楼层
我这里,HID包是64字节,主机向设备发送是64字节,设备向主机是16字节,收发了9组后,就不响应了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 10:24 , Processed in 0.546131 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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