USB大包数据数据传输问题分析
2025-03-27
7
0
经常做WINUSB或者LIBUSB驱动开发的同学可以知道,这些设备一般的输入输出端点为bulk传输,对于高速设备,它们的最大包大小一般为512字节。
如本会手中使用WCH569芯片(该芯片本身支持USB3.0,不过本人这里让其工作在USB2.0高速下),使用沁恒自带的示例CH372Device,下载固件后,其有多达7对输入输出端点,并且示例代码实现了IN和OUT端点的收发回环。
Number of open Pipes : 0x0E (14 pipes to data endpoints)
Pipe[0] : EndpointID=1 Direction=IN ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[1] : EndpointID=1 Direction=OUT ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[2] : EndpointID=2 Direction=IN ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[3] : EndpointID=2 Direction=OUT ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[4] : EndpointID=3 Direction=IN ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[5] : EndpointID=3 Direction=OUT ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[6] : EndpointID=4 Direction=IN ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[7] : EndpointID=4 Direction=OUT ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[8] : EndpointID=5 Direction=IN ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[9] : EndpointID=5 Direction=OUT ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[10] : EndpointID=6 Direction=IN ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[11] : EndpointID=6 Direction=OUT ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[12] : EndpointID=7 Direction=IN ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
Pipe[13] : EndpointID=7 Direction=OUT ScheduleOffset=0 Type=Bulk wMaxPacketSize=0x200 bInterval=0
对于Windows上位机,对其安装winusb驱动,应用通讯使用LIBUSB实现。
CLibUsb usb;
if (!usb.CreateUsbDevice(0x1000, 0x2d04))
{
printf("CreateUsbDevice err\n");
usb.UsbClose();
return;
}
usb.SelectInterface(0x00);
UCHAR buff[1024];
for(UCHAR i=0;;i++)
{
INT rtn;
memset(buff, i, sizeof(buff));
if (usb.SendData(0x01, buff, sizeof(buff), &rtn))
{
printf("send=%d\n", rtn);
}
if (usb.RecvData(0x81, buff, sizeof(buff), &rtn))
{
printf("RecvData=%d\n", rtn);
}
}
但在实际测试过程中,第一包数据都无法发送正常。
使用总线分析仪抓包可知:
数据有大量的NAK,是由于设备端无法接收导致。
而将每次发送的数据和接收大小改为512字节之后,可以看到发送512字节,接收512字节。
这里的原因是IN和OUT端点是同步引起的。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936