不同的 PID 标识了 不同类型的 USB 包(即:不同的包类型 Packets Type)。
笔记:
PID 唯一性
PID = Packet ID
PID的构成:四位标识符 + 四位标识符反码
这里只用(PID0~4),PID4~7是PID0~4的取反,用来校验 PID :

根据 USB2.0 的 Spec 描述了 不同PID 对应的 不同类型包 :

下图是USB1.1文档规定的PID类型:
根据 USB2.0 可以看出,PID 主要将 USB 的包分为了 4种PID类型(PID Type) 16个包:
1. 令牌包(Token)类型
| 包名 | ||
|---|---|---|
| 输出包 | 0x01 | 输出(OUT)启动一个方向为主机到设备的传输,并包含了 设备地址 和 标号。 |
| 输入包 | 0x09 | 输入(IN) 启动一个方向为设备到主机的传输,并包含了 设备地址 和 标号。 |
| 0x05 | 帧起始(SOF)表示一个帧的开始,并且包含了相应的帧号。 | |
| 设置包 | 0x0D | 设置(SETUP)启动一个控制传输,用于主机对设备的初始化。 |
SofTool.CN
举例理解:
PID=0x01 ,可以说:它是一个 输出 令牌包。
PID=0x09 ,可以说:它是一个 输入 令牌包。
2. 数据包(Data) 类型
| 0x03 | 偶数据包(DATA0)。 |
| 0x0B | 奇数据包(DATA1)。 |
| 0x07 | 高速设备的 PID 的 同步包 |
| 0x0F | 高速设备 分离包,高带宽的同步事务 |
SofTool.CN
举例理解:
PID=0x03 ,可以说:它是一个 DATA0 的 数据包。
3. 握手包(HandShake)类型
| 0x02 | 确认接收到无误的数据包(ACK)。我俗称:确认包 |
| 0x0A | 无效(NAK),接收(发送)端正在忙而无法接收(发送)信息。 |
| 0x0E | 错误(STALL),端点被禁止或不支持控制管道请求。 |
| 0x06 | 无响应(NYET)。 |
SofTool.CN
举例理解:
PID=0x02 ,可以说:它是设备给主机回复的一个 确认 的 握手包。表示设备正确收到了主机的数据。
4. 特殊 类型
前导包,错误包,分裂事务和 PING 测试
补充
上面的16个包中,其中常用的4个包的传输方向如下:
| PID | 数据传输方向 |
|---|---|
| IN | Device->Host |
| OUT | Host->Device |
| SETUP | Host->Device |
| PING | Device->Host |

