USB如何处理重传?

时间:2018-06-12 14:27:39

标签: usb

我正在尝试理解数据包级别的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值有关?

1 个答案:

答案 0 :(得分:0)

你的第一个问题的答案是肯定的;设备只会在收到ACK数据包时才认为要成功发送批量IN数据包。

对于你的第二个问题,你猜对了:数据切换位在0和1之间切换,所以如果主机连续两次获得相同的数据包,它可以告诉第二个应该被忽略,因为它将具有与之前相同的数据切换值。

有关详细信息,请参阅第8.6节"数据切换同步和重试"在USB 2.0规范中。