目录
1 字段
1.1 包识别字段PID
1.2 地址字段
1.3帧号字段
1.4 数据字段
1.5 CRC字段
2 包
2.1令牌包
2.2帧起始包
2.3数据包
2.4SPLIT包(分割事务包)
2.5握手包
参考
USB包的构成是一个逐层的过程,首先这些串行数据按照特定的规则构成字段,字段是构成包的基本单元,字段按照一定的顺序可以组成包,进而多个包可以组成事务,最终多个事务组成一个传输。代表一个完整的数据传输。
1 字段
所有包都有开始(SOP)和结束(EOP)界定符,开始界定符(SOP)与包之间是SYNC字段。输入电路使用SYNC字段来将输入数据与本地时钟对齐,SYNC字段中最后两位用来标记SYNC字段的结束,并通过推断识别PID的开始。对应如下。
SOP | SYNC | PACKET | EOP |
1.1 包识别字段PID
- 每个USB包的SYNC字段后紧跟一个PID
- PID由一个四位包类型字段和一个四位校验字段组成
- PID的四位校验字段是通过对包类型字段进行补码生成的,若与包类型字段不是补码关系则发生PID错误
- 主机和所有功能必须对所有接收到的PID字段进行完整解码,若接收到的PID错误,接收器丢弃整个包
- 如果功能收到了一个不支持的事务类型或方向的有效PID,则该功能不得回应。
- PID分为四个编码组:令牌、数据、握手和特殊
- 传输的前两位PID位(PID[0:1])指示编码组
1.2 地址字段
地址字段有两部分组成:功能地址字段(ADDR)和端点字段(EP)。如果包的地址字段与设备端点不匹配则必须忽略这个包。
功能地址字段ADDR
- ADDR字段通过其地址指定功能,根据令牌PID的值,功能可能是包的源或者目的。
- ADDR[6:0]指定了128个地址
- ADDR字段用于IN、SETUP、OUT令牌以及PING和SPLIT特殊令牌
- 每一个单独的功能都会有一个ADDR值,这意味着会有多个端点共享一个ADDR值,这意味着可能会有多个端点共享一个ADDR
- 复位和上电时,ADDR默认为0,必须在枚举的过程中由主机进行分配
- ADDR0被保留作为默认地址,不能分配给其他用途
端点字段
- 附加的4位端点字段,允许在多端点的功能中更加灵活的寻址
- 除了端点0外,其他端点地址是根据功能的端点来定义的
- 端点字段定义了用于IN、SETUP、和OUT令牌以及PING特殊令牌
- 所有功能必须支持端点地址为0的默认控制管道
- 低速设备每个功能最多支持3个端点:端点编号为0的控制管道以及另外两个端点
额外的两个端点可以作为
- 两个控制管道
- 一个控制管道和一个中断端点
- 两个中断管道
- 全速和高速功能可以支持最多16个IN和OUT端点(16组端点)
1.3帧号字段
- USB帧的概念是用于组织和标记数据传输的时间间隔,帧号就是用来标识这些帧的序号,一个帧内可以包含一个或多个包
- 在USB的SOF包中,帧号字段位于SOP、SY