我正在尝试了解数据包级别的 USB 协议。我特别感兴趣的是 USB 如何在出现错误时处理批量传输的重传。供参考:
https://www.beyondlogic.org/usbnutshell/usb3.shtml https://www.beyondlogic.org/usbnutshell/usb4.shtml#Bulk
我们先讨论从外设到主机的正常传输:主机向外设发送 IN 令牌。外设以数据包响应。然后主机发送一个ACK。由于 ACK,外设知道主机已正确接收数据,并且下一个 IN 令牌将由外设以新数据包进行应答。
现在考虑一下出了什么问题。假设数据包已损坏。因此主机丢弃该数据包并且不发送ACK。当外设收到下一个 IN 令牌时,它只是再次发送前一个数据包。这是正确的吗?
现在考虑更棘手的情况,数据包正确到达主机,但主机发送的 ACK 被损坏。因此主机正确接收到了数据,但外设并不知道,因为没有正确接收到ACK。据我所知,主机绝不会重新传输 ACK。
我相信主机发送的下一个 IN 令牌会通过重传数据包来应答。但是,主机如何判断是同一个数据包呢?我在任何地方都找不到解释。
是否与数据包有两个PID值(DATA0和DATA1)有关?
你的第一个问题的答案是肯定的;设备只有收到 ACK 数据包才认为批量 IN 数据包已成功发送。
对于你的第二个问题,你猜对了:数据切换位在 0 和 1 之间切换,所以如果主机连续两次收到相同的数据包,它可以告诉第二个应该被忽略,因为它会具有与之前相同的数据切换值。
有关详细信息,请参阅 USB 2.0 规范中的第 8.6 节“数据切换同步和重试”。
USB3.x增加了链路级重试,可以重试数据包头或事务包(ACK\NRDY\ERDY)。