一、IN 事务(设备 → 主机数据传输)1. 事务流程主机发送 IN 令牌包:通知设备准备发送数据。设备响应:
若数据准备好:发送数据包(DATA0/DATA1)。若未准备好:发送 NAK 握手包。若设备错误:发送 STALL 握手包。主机确认:
成功接收数据后,向设备发送ACK 握手包,表示 “数据已收到”。若接收数据错误(如 CRC 校验失败),不返回任何握手包,设备需重试。2. ACK 发送方主机 → 设备:主机在正确接收设备发送的数据后,向设备返回 ACK,确认数据接收完成。
二、OUT 事务(主机 → 设备数据传输)1. 事务流程主机发送 OUT 令牌包 + 数据包:向设备发送数据。设备响应:
成功接收数据后,向主机发送ACK 握手包,表示 “数据已接收”。若未准备好接收数据:发送 NAK 握手包。若设备错误或无法处理:发送 STALL 握手包。主机确认:通过设备返回的握手包判断传输结果。2. ACK 发送方设备 → 主机:设备在正确接收主机发送的数据后,向主机返回 ACK,确认数据接收完成。
三、主机如何判断数据传输状态?事务类型主机动作设备响应主机判断逻辑IN发送 IN 令牌 → 接收数据发送数据 / NAK/STALL- 收到数据:返回 ACK,确认传输成功。- 收到 NAK:设备未准备好,稍后重试。- 收到 STALL:设备错误,需处理异常。OUT发送 OUT 令牌 + 数据 → 等待响应发送 ACK/NAK/STALL- 收到 ACK:设备成功接收数据。- 收到 NAK:设备未准备好,稍后重试。- 收到 STALL:设备错误,需处理异常。四、关键总结ACK 的方向:
IN 事务中 ACK 由主机 → 设备(确认主机收数据);
OUT 事务中 ACK 由设备 → 主机(确认设备收数据)。核心机制:
USB 通过握手包的交互实现双向确认,主机根据设备返回的握手包(IN 事务)或自己发送的握手包(OUT 事务)判断数据传输状态。异常情况:
NAK:设备暂时未准备好,主机可重试。STALL:设备永久错误(如端点暂停),需主机干预(如复位端点)。无响应:主机超时或数据错误,自动重试或报错。五、扩展:高速 USB 的 NYET 握手包在高速 USB(480Mbps)的 IN 事务中,设备若暂时无法准备数据,可返回NYET 握手包(仅高速支持),表示 “当前未准备好,但未来可能准备好”,主机可在短时间内重试,比 NAK 更高效。
注:来自deepseek