第一步,使用 usb_host_transfer_alloc() 函数创建准备数据的结构体,函数原型如下:
esp_err_tusb_host_transfer_alloc(size_t data_buffer_size, int num_isoc_packets, usb_transfer_t **transfer)
第一个参数是数据大小;第二个是 ISO 数据包的个数,如果不用音频视频这里为0;第三个是数据结构体。
第二步,填写usb_transfer_t对应的结构体;
第三步,发送。可以使用 usb_host_transfer_submit_control 和 usb_host_transfer_submit。
需要特别注意的是,如果你使用 usb_host_transfer_submit_control 发送 Setup数据,那么它的 Size计算上比较特别。例如,我要发送下面 05 83 00 00 00 00 作为有效数据,那么 esp_err_tusb_host_transfer_alloc给的size_t 参数必须是 8+6,而发送的缓冲区中是 21 09 05 03 01 00 06 00 05 83 00 00 00 00。
此外,如果使用 usb_host_transfer_submit(这个功能是对非0的端点发送数据),esp_err_tusb_host_transfer_alloc就无需考虑这么多,要发送多少直接作为参数即可。
参考:
1. https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1/esp32s3/api-reference/peripherals/usb_host.html