1. IN 事务 (IN Token)
定义:IN 事务是由主机发起的请求,要求从设备读取数据。
过程:
主机发送一个IN令牌包(IN Token Packet),指定要从哪个端点读取数据。
设备接收到IN令牌后,如果有数据可发送,则回应一个DATA包(DATA0或DATA1)。
主机接收DATA包后,发送一个握手包(Handshake Packet,如ACK、NAK或STALL)确认接收状态。
用途:用于从设备获取数据,例如读取文件、传感器数据或命令响应。
2. OUT 事务 (OUT Token)
定义:OUT 事务是由主机发起的请求,要求向设备写入数据。
过程:
主机发送一个OUT令牌包(OUT Token Packet),指定要向哪个端点写入数据。
主机接着发送一个DATA包(DATA0或DATA1),包含要写入的数据。
设备接收到DATA包后,发送一个握手包(Handshake Packet,如ACK、NAK或STALL)确认接收状态。
用途:用于向设备发送数据,例如写入文件、配置命令或控制指令。
3. SETUP 事务 (SETUP Token)
定义:SETUP 事务是一种特殊的OUT事务,专门用于控制传输中的设置阶段。
过程:
主机发送一个SETUP令牌包(SETUP Token Packet),指定要向哪个端点发送设置信息。
主机接着发送一个特殊格式的DATA0包,包含8个字节的设置信息(Setup Data)。
设备接收到SETUP DATA包后,发送一个握手包(Handshake Packet,如ACK、NAK或STALL)确认接收状态。
用途:用于初始化设备或执行特定的控制操作,例如设置设备地址、选择配置、获取设备描述符等。
在USB(Universal Serial Bus)协议中,每种事务(IN、OUT、SETUP)又可以分为三种不同的响应情况:正常(Normal)、忙(Busy)和错误(Error)。这些响应状态通过握手包(Handshake Packet)来表示,具体来说是通过ACK、NAK和STALL这三种握手信号来区分的。
1. 正常(Normal)
定义:表示数据传输成功完成,没有发生任何问题。
握手信号:ACK(Acknowledgment)
过程:
当设备成功接收到一个OUT或SETUP事务的数据包后,它会发送一个ACK握手包给主机,确认数据已正确接收。
当设备成功发送了一个IN事务的数据包后,它也会发送一个ACK握手包给主机,确认数据已正确发送。
结果:主机知道数据传输已经成功完成,可以继续进行后续的操作或开始新的事务。
2. 忙(Busy)
定义:表示设备当前无法处理请求,但可能会在稍后变得可用。
握手信号:NAK(Negative Acknowledgment)
过程:
当设备暂时无法处理主机的请求(例如,设备的缓冲区已满或正在进行其他操作),它会发送一个NAK握手包给主机。
主机接收到NAK后,通常会等待一段时间(根据具体情况),然后重新尝试该事务。
结果:主机知道设备当前忙于其他任务,但可以在稍后重试。NAK是一种非致命错误,不会导致通信中断,而是提示主机稍后再试。
3. 错误(Error)
定义:表示设备遇到了一个无法恢复的问题,或者请求本身无效。
握手信号:STALL(Stall)
过程:
当设备遇到无法处理的情况,例如请求的端点不存在、请求的命令无效或设备进入错误状态时,它会发送一个STALL握手包给主机。
主机接收到STALL后,通常需要采取进一步的措施,例如重新配置设备、发送新的控制命令或终止当前的传输。
结果:STALL是一种更严重的错误,表示设备无法继续当前的事务。主机需要根据具体情况决定如何处理,可能需要重新初始化设备或执行其他恢复操作。