赞
踩
来自:https://hellocode.blog.csdn.net/article/details/113272041
批量传输由一个或多个批量事务组成,每一个批量事务具有令牌包、数据包、握手包,如图下所示。批量事务类型的特点是能够通过错误检测和重试来保证主机和设备之间数据的无错误传递。需要理解和注意以下点。
当主机准备接收批量数据时,它发出IN令牌,设备端点通过返回数据包或(如果无法返回数据)NAK或STALL握手来响应主机。 NAK表示设备暂时无法返回数据,而STALL表示端点永久停止。 如果主机收到 一个有效的数据包,它用ACK握手来响应。 如果主机在接收数据时检测到错误,则不会向设备返回握手包。
当主机准备发送批量数据时,它首先发出一个OUT令牌包,然后是一个数据包。 如果设备接收数据包时没有错误,则设备将返回三个(或四个,包括NYET,用于高速操作的设备)握手中的一个。
ACK:表示没有错误,并通知主机它可以发送下一个数据包。
NAK:表示接收数据没有错误,但是主机应该重新发送数据,因为有可能设备处于临时条件拒绝接受数据(例如缓冲区满)。
STALL:如果端点被停止,则返回STALL以指示主机不应该重试传输,表示设备可能存在错误。
NYET:只用在高速设备中,表示设备没有准备好数据。
Error:如果收到的数据包带有CRC或位错误,则不返回握手。
批量传输使用数据包切换实现同步操作,就是通过数据DATA0包和DATA1包的切换来实现主机和设备传输错误检测以及重发机制。
初始在发送数据之前,假设主机和设备状态都是0。
主机会根据当前状态先发送DATA0类型数据包给设备,当设备正确收到数据包后会对自己的状态进行反转(变为1),并给主机发送应答数据包,当主机正确接收到应答包后会对自己的状态进行反转(变为1)。
如果还需要发送数据包,则主机会发送DATA1类型的数据包(根据自己的当前状态为1决定的),当设备收到正确收到数据包后会进行对自己的状态进行反转(变为0),并给主机发送应答数据包,当主机正确接收到应答包后会对自己的状态进行反转(变为0)。
正确数据传输机制如下图。
初始在发送数据之前,假设主机和设备状态都是0。
机制就是初始在发送数据之前,主机和设备状态都是0,主机会先发送DATA0类型数据包给设备,当设备发现数据存在问题后不会对自己的状态进行切换,并给主机发送非应答数据包,当主机接收到非应答数据包后,不会对自己的状态进行切换。
主机会在适当的时刻对DATA0数据包进行重传(Retry),直到设备接收正常,设备发现数据包正常了会把自己的状态进行反转,并返回应答数据包,主机在收到应答包后会反转自己的状态。
数据被破坏的检测和重传机制如下图。
初始在发送数据之前,假设主机和设备状态都是0。
主机会先发送DATA0类型数据包给设备,当设备正确收到数据包后会进行对自己的状态进行反转为1,并给主机发送应答数据包,但是,但是应答包在链路上出故障了,怎么办?当主机收到一个校验有问题应答包,主机不会对自己的状态进行反转,主机该怎么办?往下看。
主机会在合适的时间对DATA0数据包进行重发,但是当前设备的状态是1,因此设备会忽略该数据包并保持现在的状态,然后设备会给主机重新在发送一次应答包,当主机正确收到设备的应答包后对自己的状态进行反转。
当还需要发送数据包时,主机会根据自己当前的状态(假设为1),会发送DATA1数据包,设备在正确收到DATA1数据包后,会对自己的状态进行反转,并给主机发送应答数据包,当主机正确接收到应答包后会对自己的状态进行反转。
应答包故障的传输机制如下图。
首先介绍下批量传输低速、全速、高速数据包最大长度大小,如下图,我们可以看到批量传输不支持低速传输。
读163字节,因为是全速设备(Full Speed),所以批量传输需要分3个事务才可以传输完毕,每一个事务最大传输64字节,因为上一次传输最后的数据包PID为DATA0,所以此传输第一个事务的数据包PID为DATA1,下面两个数据包PID依次为DATA0、DATA1。
假设上一次批量传输最后一次以PID为DATA0数据包的批量事务结束。
批量写和批量读相反,批量写主机使用OUT令牌包,抓包图参考批量读,这里不再贴图。
假设上一次批量传输最后一次以PID为DATA0数据包的批量事务结束。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。