《圈圈教你玩 USB》学习笔记-握手包

握手包用来表示一个传输是否被对方确认。握手包只有同步域,PID 和 EOP,是最简单的一种数据包,如下所示

同步域 包标识 PID EOP

握手包有:ACK,NAK,STALL 和 NYET。

ACK 确认
NAK 不确认
STALL 挂起
NYET 未准备好

1、ACK:表示正确接收数据,并且有足够的空间来容纳数据。主机和设备都可以用 ACK 来确认,而 NAK,STALL 和 NYET 只有设备能够返回,主机不能使用这些握手包。

2、NAK:表示没有数据需要返回,或者数据正确接收但是没有足够的空间来容纳它们。当主机收到 NAK 时,知道设备还未准备好,主机会在以后合适的时机进行重试传输。

3、STALL:表示设备无法执行这个请求,或者端点已经被挂起了,它表示一种错误的状态。设备返回 STALL 后,需要主机进行干预才能解除这种 STALL 状态。

4、NYET:表示设备本次数据成功接收(只在 USB2.0 的高速输出事务中使用),但是没有足够的空间来接收下一次数据。主机在下一次输出数据时,将先使用 PING 令牌包来试探设备是否有空间接收数据,以避免不必要的带宽浪费。

需要注意的是,返回 NAK 并不表示数据出错,只是说明设备暂时没有数据传输或者暂时没有能力接收数据。当 USB 主机或者设备检测到数据出错时(如 CRC 校验错,PID 检验错,位填充错等),将什么都不返回。这时等待接收握手包的一方就会收不到握手包从而等待超时。

发布了124 篇原创文章 · 获赞 21 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/tyustli/article/details/103971237