一、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
所属系列
从当前文章继续阅读它所在合集中的前后内容。
零基础入门USB 第 6 / 9 篇
查看合集 本作品集介绍USB基础知识,解析USB通信协议,学习USB工作原理,制作USB设备,编写USB上位机软件。
相关文章
优先推荐同专题、同标签和同作者内容,补足热门文章。
评论 0
登录 后参与评论
评论
成为第一个评论的人