前言
包(Packet)是USB系统中信息传输的基本单元,物理层的设计为了稳定传递的传递包
包的组成
USB包由五部分组成:同步字段(SYNC)、 包标识符字段(PID)、 数据字段 、循环冗余校验字段(CRC)和包结尾字段(EOP)
同步字段(SYNC) | PID字段 | 数据字段 | CRC字段 | 包结尾字段 |
SYNC字段:由8位组成,作为每个数据封包的前导,用来产生同步作用,使USB设备与总线的包传输 率同步,它的数值固定为00000001(物理层鉴相使用)。
PID字段:用来表示数据封包的类型。有效字段4bit,总长度8bit,包标识符中的校验字段是通过对类型字段的每个位求反码产生 的
PID0 | PID2 | PID3 | PID4 | ~PID0 | ~PID1 | ~PID2 | ~PID3 |
数据字段:是用来携带主机与设备之间要传递的信息,其内容和长度根据包标识符、传输类型的不同而各不相 同。在USB包中,数据字段可以包含设备地址、端点号、帧序列号以及数据等内容。在总线传输中,总是首先传输字节的最低位,最后传输字节的最高位。
CRC字段:CRC校验是为了保证数据在传输过程中的完整性, 接收方接收到数据时,采用同样的校验算法对原始数据进行计算,如果计算结果和接收到的校验值一致,说明 数据校验正确,这一帧数据可以使用,如果不一致,说明传输过程中出现了差错,这一帧数据丢弃,请求重发。 常用的校验算法有奇偶校验、校验和、CRC,ECC等
包结束字段:包结尾字段即发送方在包的结尾发出包结尾信号。USB主机根据EOP判断数据包的结束。至少2个{SE0,SE0}
包的类型
USB根据PID的不同,可分为令牌包、数据包和握手包(常用的封包类型高亮显示):
封包类型 | PID名称 | PID编码 | 说明 |
令牌 (仅Host可发出) | OUT(写数据) | 0001B | 主机对从机进行写数据 |
IN(读数据) | 1001B | 主机对从机进行读数据 | |
SOF(同步应用) | 0101B | 特殊应用,帧的起始标记与帧码 | |
SETUP | 1101B | 配置从机,初始化信息,分配地址 表示进行控制传输 | |
数据 | DATA0 | 0011B | 为了分辨数据包 |
DATA1 | 1011B | ||
握手 (谁接到数据包就发送握手包) | ACK | 0010B | 握手成功 |
NAK | 1010B | 无法接收数据或无法发送数据 | |
STALL | 1110B | 端点产生迟滞(设备出现故障) | |
特殊 | PRE | 1100B | 使能下游端口的USB总线的数据传输切换到低速 的设备 |
令牌包(Token)
在USB系统中,只有主机才可以发送令牌包,常用的是OUT(写数据)、IN(读数据)以及STEUP(配置)。令牌包为固定大小,除去同步字段,共计24bit(8的整数倍),其中数据字段为11bit,包含7bit地址与4bit端点号。
8位 | 8位 | 7位 | 4位 | 5位 | |
SYNC | PID | ~PID | ADDR | ENDP | CRC5 |
数据字段中的7bit地址(ADDR),意味着一个USB系统可以使用128个地址,其中0地址默认不能使用,实际可使用的地址为127个;
数据字段中的4bit端点号(ENDP),表示一个设备的多种功能,例如一个耳麦,既有音频输入,也有音频输出的功能。
数据包(Data)
USB数据包的大小并不固定,其数据域是根据USB设备的传输速度 及传输类型而定,且须以8字节为基本单位。也就是,若传输的数据不足8字节,或传输到最后所剩余的 也不足8字节,仍须传输8字节的数据域。
8位 | 8位 | 0~1023字节 | 16位 | |
SYNC | PID | ~PID | DATA | CRC16 |
握手包(Handshake)
握手信息包是最简单的信息包类型。在这个握手信息包中仅包含一个PID数据域而已。
8位 | 8位 | |
SYNC | PID | ~PID |