自定义USB类通信 使用STM32F401CCU6做usb host遇到问题

蔚蓝 2022-06-22 15:18:12 编辑

1.设备是自己定义的,可以在电脑上识别成功和通信了,以下是电脑数据截图;
150451134345

2.先计划打算用STM32F401CCU6做usb host实现通信 替代电脑;USB的通信采用Cubemx配置,因为是自定义的类,和ST官方给的5个参考大类有不同的地方,需要自己封装实现,其实也就是自定义USB类 0xFF 然后采用批量数据传输。以下是STM32的配置和log,
我个人觉得和ST给的HID类通信很像,然后是在HID的程序基础上做的修改。
3.具体修改如下,解析获取到的USB描述符,拿到对应的输入 输出端点 0x83、0x04,然后申请管道空间,打开管道,之后注册批量数据接收,等待数据接收;
STM32F401 USB HOST程序配置1:
151440855766
STM32F401 USB HOST程序配置2:
151618506967
串口数据log:
150736791871

4.从机也没有显示连接,主机也没接收到数据,不懂是哪里设置不对。如有知道的老哥,请指导下调试方向。

USB中文网 2022-06-22 15:35:50 编辑

看你最后2张图,打印wwwwww和jjjjj那里,显示已经USBH_LL_GetLastXferSize函数已经返回成功了,并且后面的串口日志显示已经收到数据的长度为2。

你报后面的串口日志没有截出来,看着是收到数据了

蔚蓝 2022-06-22 15:37:21 编辑

带字母jjjjjj标识的才是真正接收成功的 前面的是我特意看程序有没有运行

USB中文网 2022-06-22 15:54:06 编辑

wwww最后一行到底是什么字母,我以为是jjjjj

还有一种可能就是设备端根据就没有发数据。得确保你的设备有发数据


另外你说的接收数据时返回,USBH_URB_NOTREADY.

 case USBH_URB_NOTREADY:
            // The original USB Host code re-submits the request when it receives a NAK, resulting in about 80% MCU load
            // With our patch, NOTREADY is returned, which allows to re-submit the request in the next frame.
            if (phost->Timer != hci_acl_in_timer){
                status = usbh_bluetooth_start_acl_in_transfer(phost, usb);
                btstack_assert(status == USBH_OK);
            }
            break;
蔚蓝 2022-06-22 15:54:47 编辑

按照群主给的提示 我试下主机发送数据,现在发送成功了。但是如果设备原来不带电,直接接主机给设备供电,设备不会提示设备已连接,这个时候主机发送数据设备也收不到,然后我无意中复位了下STM32F401CCU6(此时设备已带电),然后设备重新打印设备连接,也能接收到主机的数据了,但是设备发送的数据主机还是没接收到。
下图是主机发送到设备的数据:
155402873417
下图是主机端的log
155442826222

USB中文网 2022-06-22 16:03:19 编辑

也就是说主机可以发送数据到设备,但是设备数据到主机,主机收时会出现NAK?也即主机收不到数据。如果是NAK的话,就是设备数据没有准备好。可能要查设备是否真的有在发数据。

typedef enum {
  USBH_URB_IDLE = 0,
  USBH_URB_DONE,
  USBH_URB_NOTREADY,
  USBH_URB_NYET,  
  USBH_URB_ERROR,
  USBH_URB_STALL
}USBH_URBStateTypeDef;
蔚蓝 2022-06-29 09:40:10 编辑

问题已解决,可以使用STM32F401CCU6做usb host与自定义的USB设备类通信。
解决的方法是要根据自定义的USB设备类通信格式自定义接收缓冲区,才可以正常接收,
之前我是直接参考使用了HID的数据结构体导致只能发送,不能接收。
093737213437

094006168145