我正在尝试理解数据包级别的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令牌会通过重传数据包来应答。但是,主机如何判断它是相同的数据包?我在任何地方都找不到解释。
是否与数据包(DATA0和DATA1)有两个PID值有关?
答案 0 :(得分:0)
你的第一个问题的答案是肯定的;设备只会在收到ACK数据包时才认为要成功发送批量IN数据包。
对于你的第二个问题,你猜对了:数据切换位在0和1之间切换,所以如果主机连续两次获得相同的数据包,它可以告诉第二个应该被忽略,因为它将具有与之前相同的数据切换值。
有关详细信息,请参阅第8.6节"数据切换同步和重试"在USB 2.0规范中。