USB2.0 IN/OUT事务ACK错误或丢失的数据翻转(DATA TOGGLE)
2021-12-06
1893
0
前面一节我们讨论了当ACK成功发送并被接收时的数据包PID翻转,但在实际的数据传输过程中,也会出现ACK丢失或者错误的情况,这节我们来讨论这种情况。
IN事务ACK错误或丢失的数据翻转(DATA TOGGLE)
IN事务ACK错误或丢失的数据翻转(DATA TOGGLE)如下图所示:
USB主机与设备经过一段的数据传输后,开始使用事务i进行IN事务数据传输。
- USB主机发送IN令牌包,指示这是一个IN事务。USB主机和设备当前的数据包ID均为DATA1.
- USB设备收到IN令牌包后,向使用当前的数据包DATA1向主机发送数据。
- USB主机收到据据包DATA1后,确认无误后,将自己的数据包PID从DATA1变为DATA0,并将USB高备发送ACK握手包。
- 不过由于种种原因,USB设备未收到该ACK握手包或该握手包无效或丢失,USB设备端的令牌包保持不变。
- USB主机继续使用IN令牌包指明继续接收数据。
- 由于上一次事务中,USB设备的数据包序列未变化,则USB设备认为上一次数据传输失败,使用原来的令牌包重传上一包数据。
- USB主机收到数据后,发现收到的数据包PID为DATA0,不等于理论上的DATA1,故认为USB设备上一次没有收到ACK,故USB主机忽略该数据包,并向USB设备发送ACK握手包,让USB设备进行数据包序列同步即从DATA1翻转为DATA0
- 这次ACK握手包正确无误的传输并且USB设备接收到了,USB设备翻转数据包序列。所以这次事务变成了上一个事务i的重传事务。
- USB主机继续使用IN令牌接收数据,后续数据传输成功后并且USB设备接收到了主机的ACK,再次进行数据包序列翻转。
正确返回的ACK数据据序列数据传输可见:http://www.usbzh.com/article/detail-706.html
OUT事务ACK错误或丢失的数据翻转(DATA TOGGLE)
OUT事务ACK错误或丢失的数据翻转(DATA TOGGLE)如下图所示:
- USB主机在发送数据之前,主机和设备的数据包序列均为DATA0
- USB主机发送OUT令牌包,指示USB设备接收数据
- USB主机使用DATA0数据包发送数据
- USB设备接收到数据确认无误后,翻转自己的数据包序列,从DATA0变为DATA1,并向USB主机发送ACK握手包
- 由于种种原因,ACK握手包发送失败或丢失了,USB主机不进行数据包序列翻转,保持当前数据数据包序列不变,即为DATA0
- US主机待等超时后,重传OUT事务
- USB主机发送OUT令牌到设备指明设备接收数据
- USB主机继续使用DATA0数据包序列发送上一次未收到ACK的数据包
- USB设备收到数据包后发现和其预期的DATA1数据包序列不一样,而是DATA0,则认为当前事务是重传上一次的OUT事务,则忽略该数据包并向USB主机返回ACK握手包,并保持自身数据包序列不变。
- USB主机收到ACK握手包后,将自己当前的数据包序列从DATA0番转为DATA1
- USB主机继续发送数据,使用事务i+1,该次数据传输,ACK正确无误。
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936