设备本身不具备主动发送的能力,完全由主机控制器的信号触发。
以一次 批量 IN 传输 为例,设备将数据放到 D+/D- 的完整时机链条:
- 主机控制器发送
IN 令牌包(包含设备地址 + IN 端点号)到 D+/D- 总线。
- 设备 PHY 监听并解析令牌包,校验
ADDR 和 ENDP 是否匹配自身,CRC5 校验通过。
- 设备 PHY 触发硬件中断,通知设备控制器:“主机要读取这个 IN 端点的数据”。
- 设备控制器检查软件层面的端点状态:是否
ENABLED?端点队列中是否有就绪的 URB?
- 若端点就绪且 URB 存在,设备控制器从 URB 缓冲区中读取数据,按 USB 规范编码后,驱动 D+/D- 发送数据数据包。
- 主机接收数据后,发送
ACK 握手包;设备收到 ACK 后,触发 URB 完成回调,清理已发送的 URB,准备下一次传输。
- 若端点无就绪 URB,设备驱动 D+/D- 发送
NAK 握手包,主机稍后重试。