|
移植的stm32 hid设备 只能在while(1)中发送数据给PC后,PC的上位机bushound才能发送数据给下位机。如果hid设备不发数据给PC,则bushound发送数据时会报错“invalid command”, bushound看不到数据发下去。请问这个是什么原因导致的? 这个问题看几年前就有人提出来,但是一直没人解决。 解决问题的+微15996227589发红包。 报告描述符如下: CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = { /* USER CODE BEGIN 0 */ 0x06, 0xA0, 0xFF, 0x09, 0xA5, 0xA1, 0x01, 0x09, 0xA6, // 输入报表 0x09, 0xA7, 0x15, 0x00, 0x25, 0xFF, 0x75, 0x08, 0x95, 0x40, 0x81, 0x02, // 输出报表 0x09, 0xA9, 0x15, 0x00, 0x25, 0xFF, 0x75, 0x08, 0x95, 0x40, 0x91, 0x02, // 0xC0 、 /* USER CODE END 0 */ 0xC0 /* END_COLLECTION */ }; |
USBX在F407上创建CDC不能正常使用
官网CubeMXmac(m芯片)版本安装包有问题吧,安装后实际是intel版本
请问一下STM32U575VGT6在mx里怎么配置DCMI的DMA setting啊,我点那个页面只有GPDMA1,跳转过去也没有什么DCMI的选项
MX创建的SMT32工程在IDE中build会报错
Cubemx的外部低速时钟已激活但时钟树中HSI无法选择
ai部署
HRTIM中已经设置了两路独立输出,第二路无法设置触发源,提示必须是0
不知道STM32CubeMx2是否有查找功能的选项
使用CUB进行调试或者下载固件时候均出现下面的报错,使用的工具是J-LINK,尝试重新给工具上电,重启IDE,重启电脑,更新配置均是一样问题点,请问这个是为什么呢
STM32H743使用Keil V6(AC6)编译FreeRTOS报错__forceinline未定义及CMSIS-RTOS2配置错误,如何解决?
微信公众号
手机版
移植的stm32 hid设备 只能在while(1)中发送数据给PC后,PC的上位机bushound才能发送数据给下位机。如果hid设备不发数据给PC,则bushound发送数据时会报错“invalid command”, bushound看不到数据发下去。请问这个是什么原因导致的?
这个问题看几年前就有人提出来,但是一直没人解决。
解决问题的+微15996227589发红包。
报告描述符如下:
CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = { / USER CODE BEGIN 0 / 0x06, 0xA0, 0xFF, 0x09, 0xA5, 0xA1, 0x01, 0x09, 0xA6,
// 输入报表 0x09, 0xA7, 0x15, 0x00, 0x25, 0xFF, 0x75, 0x08, 0x95, 0x40, 0x81, 0x02,
// 输出报表 0x09, 0xA9, 0x15, 0x00, 0x25, 0xFF, 0x75, 0x08, 0x95, 0x40, 0x91, 0x02,
// 0xC0 、 / USER CODE END 0 / 0xC0 / END_COLLECTION / };
移植的stm32 hid设备 只能在while(1)中发送数据给PC后,PC的上位机bushound才能发送数据给下位机。如果hid设备不发数据给PC,则bushound发送数据时会报错“invalid command”, bushound看不到数据发下去。请问这个是什么原因导致的?
这个问题看几年前就有人提出来,但是一直没人解决。
解决问题的+微15996227589发红包。
报告描述符如下:
CUSTOM_HID_ReportDesc_FS[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = { / USER CODE BEGIN 0 / 0x06, 0xA0, 0xFF, 0x09, 0xA5, 0xA1, 0x01, 0x09, 0xA6,
// 输入报表 0x09, 0xA7, 0x15, 0x00, 0x25, 0xFF, 0x75, 0x08, 0x95, 0x40, 0x81, 0x02,
// 输出报表 0x09, 0xA9, 0x15, 0x00, 0x25, 0xFF, 0x75, 0x08, 0x95, 0x40, 0x91, 0x02,
// 0xC0 、 / USER CODE END 0 / 0xC0 / END_COLLECTION / };
不懂,问Deepseek
这个问题很典型,根本原因在于HID设备的输出端点(OUT)没有预先准备好接收数据,而主动发送一次输入报告(IN)恰好触发了接收准备。
原理分析
USB HID 的数据传输机制
USBD_HID_SendReport()将数据放入缓冲区,端点从NAK变为就绪,主机才能取走数据。USBD_HID_ReceivePacket()设置接收缓冲区,端点才响应主机的OUT令牌。USBD_CUSTOM_HID_SetReport()回调中处理。 从你的报告描述符看,只有输入/输出报表,没有指明中断OUT端点,因此主机大概率使用 控制传输(SET_REPORT) 下发数据。为什么必须先发送数据才能收到
USBD_CUSTOM_HID_ReceivePacket(),此时输出路径(EP0或OUT端点)处于未就绪状态。主机发送SET_REPORT时,设备会返回STALL,导致上位机报错invalid command。USBD_HID_SendReport()发送一次输入报告后,可能在该函数内部或在发送完成的回调函数(如CUSTOM_HID_OutEvent)中自动调用了接收准备函数(具体取决于你的代码实现)。于是输出端点就绪,后续主机再发数据就能成功。解决方案
在初始化完成后,主动调用一次接收准备函数,让设备始终能响应主机的输出报告。
方法一:调用
USBD_CUSTOM_HID_ReceivePacket(如果使用中断OUT端点)注意
Report_buf需要提前定义,大小与报告描述符中的输出报表长度一致(此处为0x40)。方法二:实现
USBD_CUSTOM_HID_SetReport回调(适用于控制传输)在
usbd_custom_hid_if.c中实现:并将此函数注册到
USBD_CUSTOM_HID_ItfTypeDef结构体的SetReport成员中。如何验证
USBD_CUSTOM_HID_ReceivePacket。如果没有,加上即可解决。USBD_CUSTOM_HID_ReceivePacket中指定的长度一致(此处为64字节)。补充说明
SetReport回调,不需要主动发送任何输入报告。USBD_HID_SendReport被调用后是否顺带调用了接收函数。按上述方法修改后,设备应该可以随时接收PC下发的数据,无需先发送。
[md]可以加您一个联系方式嘛,一起讨论一下技术tabuxxwol这是v,有什么不明白一起探讨一下
ST官方是有相关例程可以作为参考进行移植。
不过,例程里是基于2字节大小的数据进行处理的,看你好像用到64个数据。
这样的话,注意相应端点及report的数据缓冲大小要相应调整,即从2调整到64。
相关的数据处理函数按理也要调整。
我只是个菜鸟,业余玩玩而已