USB接口是有协议的传输,业务层的数据不能直接放到总线上传输,需要封包后传输。而且通信方式总是主机发起,设备应答,设备不能主动传输数据。
包是USB传输的基本单元,其结构由四部分组成:SOP、SYNC、Packet Content、EOP。(个人理解:有始有终,由发送方一次性驱动。发送方可以是主机,也可以是设备。)
其实,SOP就是SYNC的第一位,从下图可以很直观的看出来。之所以单独提出来,是因为其有特定功能:通知接收端口——数据分组开始传输。
Packet Content由 PID域、地址域、端点域、数据域、帧号域、CRC域 组成。
其中 PID域 是所有Packet Content必有的域,且位于起始位置。Packet Content剩余部分根据PID不同而有所不同。
USB发送顺序:同步域按MSb到LSb顺序发送;Packet Content部分,以域为单元,先定义的单元先发送,单元内按LSb到MSb顺序发送,对于数据域,低地址字节先发送,字节内按LSb到MSb顺序发送。
PID定义如下:
PID域的低四位为PID值,高四位为PID按位取反的校验位,如下图所示:
常用到的包就以下8个:
事务:一次完整的基本数据传输交互。
事务是不能被穿插打断的。穿插是指事务中间不能出现非本事务的包;打断是指事务不能跨帧,如果事务不足以完整安排到当前可用帧,则必须将其全部安排到下一个可用帧。
事务通常由三个包组成:令牌包、数据包、握手包。
事务总是以令牌包开始,所以令牌包的类型决定事务的类型,因此事务主要有如下三种:
SETUP事务——向设备发送控制命令;
IN事务——从设备读取数据;
OUT事务——向设备发送数据;
SETUP事务中的数据包必须使用DATA0,IN事务及OUT事务的数据包使用DATA0还是DATA1,跟事务在传输中的序列有关,具体参看传输相关说明。
由于数据包长度有限,过多的数据会分成多个事务来处理。
USB协议对SETUP事务的数据包内容,定义了一个8字节的标准请求:
以下标准请求是所有设备必须支持的:
USB协议定义了四种传输:控制传输、中断传输、同步传输、批量传输。
其中控制传输是所有设备必须支持的传输。
控制传输分为三种类型:控制写、控制读、无数据控制;
传输过程分为三个阶段:建立阶段、数据阶段(可选)、状态阶段,每个阶段由一个或多个事务组成,事务的数据包需要在DATA0与DATA1之间翻转,具体参看下图:
注意:状态阶段,事务的数据包不能省略,但该数据包的数据域长度为0。
所有USB设备在连接之初,必须经过枚举过程,以便主机了解连接的是什么设备,并加载对应驱动程序,进行后续一系列的数据通信。
枚举过程如下:
1、检测到J状态,等待100ms设备电气特性稳定。
2、执行复位至少10ms,以便设备能检测到;再驱动总线空闲10ms,以便设备复位完成。
3、获取设备描述符(缺省地址)。
4、第二次复位(可选)。
5、分配地址(后续都是通过新地址通信)。
6、再次获取设备描述符。
7、获取配置描述符集合。
8、获取字符串描述符(可选)。
9、选择配置。
最后上一张逻辑分析仪抓取的波形及解码图,以便对USB通信有一个直观的感受。
图中包括一次完整的【控制传输】过程,该控制传输处于设备枚举时的两次复位之间,主机通过此传输获取设备描述符。