STM32
直播中

HTSX

9年用户 732经验值
擅长:可编程逻辑
私信 关注
[问答]

STM32F429 USB HOST HID如何从interrupt OUT发送数据?

1.我用的STM32F429 MCU
2.并通过cubemx生成了 USB HOST HID的鼠标键盘demo
3.调试demo可以正常工作
4.调试 以control传输控制键盘的灯光正常,我使用了这个函数:'USBH_StatusTypeDef USBH_HID_SetReport(USBH_HandleTypeDef phost,uint8_t reportType,uint8_t reportid,uint8_t reportBuff,uint8_t reportLen)'
问题:现在我有一个HID设备,我已经枚举成功,在interface中它有一个interrupt OUT传输,我用同样控制键盘的方法去操作OUT传输数据,现在尝试是不行的,我在HID的文件中没有找到适合interrup OUT的用户函数,请问我需要自已写个interrupt OUT函数吗?谢谢
实验用工具的方式发送传输数据是可行的:

但我用status = USBH_HID_SetReport (phost,2,2,Outreport1.HID_reportBuff,sizeof(UHID_SetOutReport));传输数据,但device并没有收到,




回帖(2)

李林松

2024-3-26 10:54:18
在usb HOST libray中有一个usbh_ioreq.c
ST官方给出了一个函数:USBH_InterruptSendData
枚举完成;直接调用就可以实现,但要注意发送的字节数和初始化的字节数不能溢出,如果report文件大于64byte,可以用for循环多次发送的的方式
/**


  • @brief  USBH_InterruptSendData
  • Sends the data on Interrupt OUT Endpoint


    • @param  phost: Host Handle
    • @param  buff: Buffer pointer from where the data needs to be copied
    • @param  length: Length of the data to be sent
    • @param  pipe_num: Pipe Number
    • @retval USBH Status./USBH_StatusTypeDef USBH_InterruptSendData(USBH_HandleTypeDef phost,uint8_t buff,uint16_t length,uint8_t pipe_num){USBH_LL_SubmitURB(phost,                      / Driver handle    /pipe_num,             / Pipe index       /0U,                   / Direction : OUT   /USBH_EP_INTERRUPT,    / EP type          /USBH_PID_DATA,        / Type Data        /buff,                 / data buffer      /(uint16_t)length,     / data length      */0U);return USBH_OK;}

举报

李华

2024-3-26 18:12:44
要从USB HOST HID的interrupt OUT发送数据,您可以按照以下步骤进行操作:

1. 确认您的HID设备支持interrupt OUT传输方式。您可以参考HID设备的规格书或者文档来确认。

2. 在您的STM32F429 MCU上,使用USB HOST库提供的函数`USBH_CtlReq()`或者`USBH_BulkSendData()`来发送数据。这些函数可以通过interrupt OUT传输方式发送数据。

3. 在HID的驱动文件中,您可以使用`usbh_hid.c`文件中定义的函数`HID_MouseDriver_SendReport()`或者`HID_KeyboardDriver_SendReport()`来发送数据。这些函数可以根据您的需要发送鼠标或键盘报告。

4. 如果您在HID的驱动文件中没有找到适合interrupt OUT传输的用户函数,您可以自己编写一个。您可以参考`usbh_hid.c`文件中定义的函数,根据您的需要进行修改。

注意:在发送数据之前,您需要先打开对应的接口和端点。使用`USBH_OpenPipe()`函数来打开控制传输端点,使用`USBH_OpenPipeEx()`函数来打开interrupt传输端点。

希望能帮助到您!
举报

更多回帖

×
20
完善资料,
赚取积分