USB2.0 IN/OUT事务ACK成功的数据翻转(DATA TOGGLE)
USB使用数据翻转(DATA TOGGLE)的同步机制,用来实现在USB主机和设备之间多个事务的数据传输同步。该同步机制原理是:
- USB主机和设备各自维护一个数据包PID,根据PID来发送数据包
- 数据接收方根据接收到的数据包情况来改变自身数据包PID
- 数据发送方根据接收方的握手包来改变自身的数据包PID
- 数据在主机和设备使用交替的包序列,如DATA0/DATA1之间进行切换,如果主机和设备端之间没有改变自身的PID,则认为数据传输失败,则当前数据包会被重转。
由于同步传输不存在握手包,所以同步传输不使用数据翻转机制。同步传输的数据发送方仅按照指定的PID序列发送数据包,接收方根据接收到的数据包PID序列来判断数据是否正确从而进行数据同步。
IN事务DATA0/DATA1 ACK的数据翻转
如我们有以下两次的IN事务,其事务编号分别为46680和46681事务。
USB主机使用包10070包指示这是一个IN事务,并且USB设备使用DATA1包向USB主机返回数据,USB主机收到数据后将自己的数据包序列变为DATA0,并向USB设备返回ACK,这时USB设备切换自己的包序列为DATA0.这时在事务46681中,使用主机再次请求的IN事务则使用DATA0来进行数据传输。所以以上事务的数据翻转过程如下:
这里我们做一个说明:USB主机和USB设备经过很长一段时间数据通讯后,这时USB主机和设备的数据包序列PID为DATA1。所以在在启动IN事务46680时,USB设备使用DATA1包序列返回数据,USB设备确认数据无误后,将自己的包序列切换为一下包序列DATA0,并给USB设备返回ACK,USB设备接收到ACK后,切换自己的包序列为DATA0,即下一次进行数据传输的包序列。
事务46681类似,USB主机和设备使用此包序列进行数据传输,重复不止。
OUT事务DATA0/DATA1 ACK的数据翻转
对于OUT事务类似:
如上图所示,这里我们截取2个OUT事务分别为71539和71540事务。对于71539事务USB主机使用DATA0包发送数据给设备,而事务71540使用DATA1。
USB主机和设备经过一段时间的数据发送后,当前的数据包PID为DATA0,USB主机需要向USB设备发送数据,使用事务71539。USB主机首先向USB设备发送OUT包,然后使用DATA1发送数据,USB设备收到数据后确认无误后将自己的包PID从DATA0变成DATA1,并向主机返回ACK,主机收到ACK后装饰自己的包ID从DATA0变为DATA1.
而对于事务71540,USB主机首先发送OUT包,然后使用DATA1发送数据给设备,USB设备收到数据无误后将自己的包ID从DATA1变为DATA0,并返回ACK给主机,主机收到ACK后将自己的包ID从DATA1变为DATA0.