1.前置知识
可以先看我的另外一篇文章 《USB2.0电气层信号的表示及速率的识别过程》,这篇文章主要介绍了usb2.0信号在bit层面的电气层表示 以及 usb2.0速率的识别过程。
usb设备在完成速率识别后,主机和设备便可以通过包(packet) 进行通信。
2.包(packet)的组成
包(packet) 的组成如下图所示,其中SOP,SYNC,EOP以及PID,在每一个 包(packet) 中都是存在的。而 地址(地址+端点),帧号,数据则不会同时出现,这是由包的类型(PID) 决定的。
SOP 和 EOP作为包的开始和结束在此不再赘述,可参考《USB2.0电气层信号的表示及速率的识别过程》
2.1 SYNC Field
- 全速/低速: 3对KJ外加2个K
- 高速:15对KJ,外加2个K
注 :利用连续变化的信号携带包的速率信息,连续两个k信号标志着PID的开始
2.2Address Fields
2.2.1 Address Field
使用7个bit标识地址,可表示128个地址,0地址由新插入设备且未分配地址使用,(1-127)可用来分配给设备(所以一个主机最多支持127个设备)
2.2.2 Endpoint Field
使用4个bit表示端点,4个bit可以表示16中情况,即一个设备最多有16个IN端点和16个OUT端点(一个设备描述符下最多有16个IN端点描述符和16个OUT端点描述符)。
2.3 Data Field
每个包最大传输1024个数据,不同的事务(Transaction)或 传输(Transfers)在不同速率下可传输的最大数据量是不同的,最大1024。
2.4 PID(Packet Identifier Field)、
- 下图是PID的格式,PID使用8bit表示,有效数据是4bit,高4bit是低4bit的取反,用于校验。
PID在总线上的顺序是(LSb)->(MSb)
-
PID 值决定了 包 的类型。主要分为4类:
- 令牌包(Token):
OUT, IN, SETUP, PING
SOF
- 数据包(Data):
DATA0, DATA1, DATA2, MDATA, 不同的事务(Transaction)或 传输(Transfers)在不同速率下数据包的长度是不同的,最大1024。
- 握手包(Handshake):
ACK,NAK, STALL, NYET, ERR
- 特殊包(Special):
-SPLIT 和 PER设计不同速率下的传输机制,不在本文中讨论,后续会有文章专门介绍。
-
下图是usb2.0所有支持的包,以及不同类型的包由谁发出, 支持的速率, 支持的事务(Transaction)
注:PER和ERR的PID是一样的,但因一个是高速模式下的包,一个是全速模式下的包,所以并不冲突。
3. 总结
多个包(packet) 构成一个事务(Transaction), 多个事务(Transaction)构成一个传输(Transfers),
本文引入了包(packet) 的概念,但在usb2.0中 包(packet) 并不能作为一个孤立的概念来理解usb, 仅本文而言,知识是不成体系的,后面会有文章继续介绍其他概念。
有关包(packet) 的详细信息可参阅《Universal Serial Bus Specification Revision 2.0》的8.4章Packet Formats