USB 控制传输(Control Transfer)的重传机制
1. 控制传输的事务结构
控制传输分为三个阶段,每个阶段都有自己的事务,并可能触发重传机制:
- 设置阶段(Setup Stage):主机发送 8 字节的
Setup Packet
。 - 数据阶段(Data Stage):主机或设备发送数据(可选)。
- 状态阶段(Status Stage):主机和设备确认传输完成。
每个阶段基于 USB 事务(Transaction),包括以下内容:
- 令牌包(Token Packet):标识事务类型和数据方向。
- 数据包(Data Packet):承载实际传输的数据。
- 握手包(Handshake Packet):用于确认事务状态。
2. 协议细节与比特位内容
令牌包(Token Packet)
-
格式:
SYNC (8 bits) | PID (8 bits) | ADDR (7 bits) | ENDP (4 bits) | CRC5 (5 bits) | EOP
- SYNC (8 bits):同步字段,用于设备锁相。
- PID (8 bits):标识包类型,如
SETUP
(0x2D)和OUT
(0xE1)。 - ADDR (7 bits):设备地址,指定目标设备。
- ENDP (4 bits):端点号,标识目标端点。
- CRC5 (5 bits):校验令牌包内容的循环冗余校验码。
- EOP:包结束标志。
-
重传机制:
- 如果设备未接收到完整或正确的令牌包,它会忽略事务,主机在超时后重发。
数据包(Data Packet)
-
格式:
SYNC (8 bits) | PID (8 bits) | DATA (0-1024 bytes) | CRC16 (16 bits) | EOP
- SYNC (8 bits):同步字段。
- PID (8 bits):
DATA0
(0xC3)或DATA1
(0x4B)表示数据包序号。 - DATA (0-1024 bytes):实际数据,长度由事务决定。
- CRC16 (16 bits):校验数据包的完整性。
-
重传机制:
- 如果设备收到数据包但校验失败(CRC16 错误),设备会发送 NAK(0x5A) 或不响应。
- 主机会根据 NAK 信号进行重传。
- 数据切换位(Data Toggle):用于标识数据包的序号(
DATA0
或DATA1
),主机和设备通过序号同步避免重复数据。
握手包(Handshake Packet)
-
格式:
SYNC (8 bits) | PID (8 bits) | EOP
- SYNC (8 bits):同步字段。
- PID (8 bits):
ACK (0xD2)
:设备正确接收数据。NAK (0x5A)
:设备暂时无法接收数据。STALL (0x1E)
:设备无法处理请求。
-
重传机制:
- 如果主机未收到
ACK
,或者收到NAK/STALL
,它会触发重试逻辑。 - 重传次数由主机控制器实现,通常重试 3 次后报错。
- 如果主机未收到
3. 重传逻辑触发点
以下情况可能触发控制传输的重传:
-
令牌包丢失或损坏:
- 如果设备未检测到完整的令牌包,则不响应,主机会超时后重传。
-
数据包丢失或损坏:
- 如果设备检测到
CRC16
错误,发送NAK
,主机会重传。 - 如果数据序号不匹配(
DATA0
或DATA1
),设备会忽略,主机重新发送。
- 如果设备检测到
-
握手包丢失:
- 如果主机未收到
ACK
,会重新发送数据包。
- 如果主机未收到
4. 示例流程:控制传输中的重传
假设主机与设备进行以下控制传输:
-
主机发送
Setup Packet
:- 主机发送令牌包和
DATA0
,设备校验后发送ACK
。 - 如果设备未发送
ACK
,主机会重传。
- 主机发送令牌包和
-
主机发送数据(数据阶段):
- 主机发送
DATA1
包。 - 设备检测
CRC16
错误,返回NAK
。 - 主机重发数据,直到收到
ACK
。
- 主机发送
-
状态阶段:
- 主机发送
IN
令牌包,设备返回ACK
确认完成。 - 如果主机未收到
ACK
,会重传。
- 主机发送
5. 比特位重传的关键技术
- PID 检测:通过 PID 校验机制,设备和主机能检测包类型和有效性。
- CRC 校验:对令牌包和数据包进行错误检测。
- NAK 反馈:设备未准备好时,返回
NAK
请求重传。 - 超时机制:主机设定超时时间,未收到响应会重发。
通过上述比特位级别的校验和反馈机制,USB 控制传输实现了可靠的重传逻辑,有效保证数据完整性和可靠性。