一、概述
数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。
二、域
域:是USB数据最小的单位,由若干位组成(至于是多少位由具体的域决定),域可分为七个类型
1、同步域(SYNC)
是用来告诉USB的串行接口引擎数据要开始传输了,请做好准备。除此之外,同步域还可以用来同步主机端和设备端的数据时钟,因为同步域是以一串0开始的,而0在USB总线上就是被编码为电平翻转,结果就是每个数据位都发生电平变化,这让串行接口引擎很容易就能够恢复出采样时钟信号;对于全速设备和低速设备,同步域使用的是00000001(二进制数,总线上的发送顺序);对于高速设备,同步域使用的是31个0,后面跟1个1(需要注意的是,这是对发送端的要求,接收端解码时,0的个数可以少于这个数)。
2、标识域(PID)
由四位标识符+四位标识符反码构成,表明包的类型和格式,这是一个很重要的部分,这里可以计算出,USB的标识码有16种。
1)令牌包
0x01:输出(OUT)启动一个方向为主机到设备的传输,并包含了设备地址和标号;
0x09:输入(IN) 启动一个方向为设备到主机的传输,并包含了设备地址和标号;
0x05:帧起始(SOF)表示一个帧的开始,并且包含了相应的帧号;
0x0d:设置(SETUP)启动一个控制传输,用于主机对设备的初始化。
2)数据包
0x03:偶数据包(DATA0);
0x0b:奇数据包(DATA1)。
3)握手包
0x02:确认接收到无误的数据包(ACK);
0x0a:无效,接收(发送)端正在忙而无法接收(发送)信息;
0x0e:错误,端点被禁止或不支持控制管道请求。
4)特殊包
0x0C前导,用于启动下行端口的低速设备的数据传输。
3、地址域(ADDR)
七位地址,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址,由此可以知道为什么一个USB主机只能接127个设备的原因。
4、端点域(ENDP)
四位,由此可知一个USB设备有的端点数量最大为16个。
5、帧号域(FRAM)
11位,每一个帧都有一个特定的帧号,帧号域最大容量0x800,对于同步传输有重要意义(同步传输为四种传输类型之一)。
6、数据域(DATA)
长度为0~1023字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度 。
7、校验域(CRC)
对令牌包和数据包(对于包的分类请看下面)中非PID域进行校验的一种方法,CRC校验在通讯中应用很泛,是一种很好的校验方法,至于具体的校验方法这里就不多说,请查阅相关资料,只须注意CRC码的除法是模2运算,不同于10进制中的除法。
三、包
由域构成的包有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同的包的域结构不同,介绍如下
1、令牌包
可分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放据数的) 其中输入包、输出包和设置包的格式都是一样的:
SYNC+PID+ADDR+ENDP+CRC5(五位的校验码)
帧起始包的格式:
SYNC+PID+11位FRAM+CRC5(五位的校验码)
2、数据包
分为DATA0包和DATA1包,当USB发送数据的时候,当一次发送的数据长度大于相应端点