USB协议中最为复杂的是底层数据通信结构的内容,其中包括了最基本的数据传输单元、数据传输类型、数据传输机制及数据交换流程。
1、数据通信协议的简介
(1)、首先要提出系统的通信模型 , 用来确定传输什么数据、在何种硬件或软件实体之间进行数据通信、实现什么特殊功能。
(2)、其次, 就要提供数据的传输方法, 这里面包括最为底层的数据单元格式、硬件上的数据发送方式(比如数据线串行、无线等)整体的数据传输类型等。
(3)、还有提供给用户的软件架构 , 如何在PC或嵌入式系统上通过软件编程来控制和使用这种通信协议。
2、USB系统:
(1)、USB整体通信模型:也就是USB的星形拓扑结构 , 以USB主机为核心 , 建立USB主机与USB设备之间的数据通信 , 通过USB Hub作为节点连接主机与设备。在PC平台上建立在PCI总线之上。定义完整的机械层和电气层定义。这些内容确定了USB的整体方案。
(2)、USB通信协议:以差模串行信号为载体传送二进制代码来传输信号 ; 数据包作为最基本的完整信息单元, 包含了一系列数据信息。数据包也可以包 括很多称为“域”的层次; 以包为基础, 构成 USB的4种数据传输类型。进而, 组合不同的传输类型, 传输各种类型的数据 , 实现USB的各种功能。
(3)、软硬件架构:包括主机、Hub与设备架构;主机与设备通信的流程、步骤;软硬件设计的方法等。这是USB系统开发工程师最终的目的, 也是学习和掌握USB技术的目的。
3、USB数据通信结构概况
“包”, 是USB最基本的数据单元。每一个包,基本上包含了一个完整的USB信息。
(2)、按照包在整个USB 数据传输中的作用不同,包可以分为3类 :
每一种类型都由一定的包按照某种特定的格式组成。 不同的传输类型所能达到的传输速度、占用USB总线的带宽、传输数据的总量和应用场合等都是不同的。
如批量传输 , 顾名思义 , 这种传输类型就是用在大量数据的传输中。比如1MB的内容 , 就可以用批量传输来发送。 但是在这整个过程中 , 并不是通 过一次批量传输来完成 , 而是分为多个数据交换过程。 也就是把数据分为多份 , 然后一次次地传输 , 直到所有的数据都发送完毕。 而这一次次的传输就是“事务”。
事务:每种传输方式都由很多个事务来完成 , 每一笔事务由底层包组成。
3、二进制数的位发送顺序
MSB是Most Significant Bit的缩写,最高有效位。在二进制数中,MSB是最高加权位。与十进制数字中最左边的一位类似。通常,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧。
LSB(Least Significant Bit),意为最低有效位;MSB(Most Significant Bit),意为最高有效位,若MSB=1,则表示数据为负值,若MSB=0,则表示数据为正。
(1)、按照协议规定 : USB总线上首先发送LSB, 然后发送近邻的下一位 , 最后发送MSB。
例如:USB上需要发送一个二进制数11001010 , 该数用十六进制可表示为0xCA。该数在 USB 总线上发送的顺序如下。
MSB LSB
1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
4、二进制数的序列------域
域(Field), 是USB中对一系列有统一意义的二进制数的称呼。
同步序列域(Synchronization Sequence, 简写为 SYNC) , 简称为同步域。
同 步域用于本地时钟与输入信号的同步, 代表一个包的起始。同步域长度为8位,最后2位作为一个标志, 标明标识域PID的开始。同步域的数值固定为 00000001,同步域位于每一个包的最开始处。主要是用硬件来处理。
MSB LSB
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
(2)、标识域
包标识域( Packet Identifier Field, 简写为 PID) , 简称为标识域。
标识域紧跟在同步域之后,用来标明包的类型和格式,作为包的错误检测手段的一种。由于同步域主要是由硬件来处理的 , 因此 , 标识域就是USB软件机制最先收到并处理的包的内容。USB主机和设备都要首先对接收到的标识域进行解码。如果出现错误或是该标识域指明的类型或方向不被支持 , 那么这个包就会被忽略。比如, USB接口芯片中定义的IN端点, 在接收到OUT标识域后 , 就会把相应的包忽略掉。
标识域由 4 位标识符和紧跟的 4 位标识符的反码组成 , 总共 8 位。
MSB LSB
!PID3 | !PID2 | !PID1 | !PID0 | PID3 | PID2 | PID1 | PID0 |
标识域中关键的标志符由 4 位二进制数组成 , 因而 , 可以 计算出 , USB 能够定 义的包的类型总共有 24 = 16 种。USB1.1中·,使用了10种。USB2.0定义了16种标识域。
数据包类型 | 标识符名称 | 标识符值PID[3:0] | 标识域意义 |
令牌包 | 输出(OUT) | 0001 | 启动一个方向主机到设备的数据传输,并且包括了设备地址和端点号 |
输入(IN) | 1001 | 启动一个方向设备到主机的数据传输,并且包括了设 备地址和端点号 | |
帧起始(SOF) | 0101 | 表示一个帧的开始,并且包含了相应的帧号 | |
设置(SETUP) | 1101 | 启动一个方向为通过控制管道进行设置的数据传输,并且包括了设备地址和端点号 | |
数据包 | 数据 0(DATA0) | 0011 | 偶数据包 |
数据 1(DATA1) | 1011 | 奇数据包 | |
握手包 | 确认(ACK) | 0010 | 接收到没有错误的数据包 |
无效(NAK) | 1010 | 接收端无法接受数据或发送端无法发送数据 | |
错误(STALL) | 1110 | 端点被禁止或者不支持控制管道请求 | |
特殊包 | 前导 | 1100 | 用于启动下行端口的低速设备数据传输 |
(3)、地址域
地址域(Address Field, 简写为 ADDR) 内存放的是设备在主机上的地址, 具有惟一性, 设备和地址是一一对应的, 并且由主机分配地址。 地址域由7位二进制数组成。
MSB LSB
ADDR6 | ADDR5 | ADDR4 | ADDR3 | ADDR2 | ADDR1 | ADDR0 |
能够表示的最大地址容量为27 = 128个。而地址 000 0000 被命名为零地址 , 是任何一个设备第一次连接到主机时 , 在被主机配置、枚举前缺省的地址 , 因此零地址被保留。 这样, USB主机能够识别的设备总数为27 - 1 = 127个。这也就是USB拓扑结构中最大USB设备个数为127个的原因。
(4)、端点域
端点域(Endpoint Field, 简写为ENDP), 也叫做端点号。
端点域是USB中一系列实际的物理数据缓冲区,存储发送和接收的数据。
端点域由4位二进制数组成,低速的设备只能定义两个端点,全速的设备能定义16+16=32个端点,除了端点0以外, 任何一个端点都可以定义为 IN 端点或是 OUT 端点。
MSB LSB
ENDP3 | ENDP2 | ENDP1 | ENDP0 |
(5)、帧号域
帧号域(Frame Field, 简写为FRAM)中的帧是时间概念。USB协议中, 1帧即1ms。在USB总线上, 1帧是一个独立的单元 , 包含了一系列总线动作。 USB将这1帧分为好几份 , 每一份中是一个USB的传输动作。
每一个帧都有特定帧号。帧号域由11位二进制数组成。帧号域的最大容量为211=2048=0x800,帧号只能在帧起始包中传递。
MSB LSB
FRAM10 | FRAM9 | FRAM8 | FRAM7 | FRAM6 | FRAM5 | FRAM4 | FRAM3 | FRAM2 | FRAM1 | FRAM0 |
(6)、数据域
数据域(Data Field, 简写为DATA)中的数据长度为0~1023字节, 在不同的传输类型中 , 数据域的长度各不相同,但必须为整数个字节的数据。
(7)、校验域
循环冗余校验域(Cyclic Redundancy Checks, 简写为CRC) , 简称为校验域。
标识域PID可以通过其反码叠加来校验,CRC则是用来对令牌包和数据包中非PID的域进行校验的 一种方法。对于令牌包, USB采用5位的CRC校验法, 简写为CRC5。而对于数据包, 则采用16位的CRC 校验法 , 简写为CRC16。
5、最基本的数据单元------包
包( Packet)是最基本的USB的数据单元, 由 一系列的域组成。USB中定义了4种类型的包 , 即令牌包、数据包、握手包和特殊包。
根据标识域PID的不同 , 令牌包( Token Packet)又可细分为:输入包IN、输出包OUT、设备包 SETUP和帧起始包SOF。
输入包IN、输出包OUT和设置包SETUP:同步域SYNC+标识域PID+地址域ADDR+端点域 ENDP+校验域CRC5(CRC5 是 对地址 域 ADDR 和端 点域 ENDP 总共 11 位数进行的校验)
8bit | 8bit | 7bit | 4bit | 5bit |
SYNC | PID | ADDR | ENDP | CRC5 |
帧的起始包SOFK:帧起始包不是特定针对 某一个设备和端点的传输, 是整个USB总线动作的一个时间划分。
8bit | 8bit | 11bit | 5bit |
SYNC | PID | FRAM | CRC5 |
(2)、数据包
根据PID的不同, 数据包(Data Packet)分为DATA0和DATA1两种包。
在分包传输时,如果第一个数据包被确定为DATA0, 那么第二个发送的数据包就应该是DATA1……如此交替下去。 而 数据的接收方在接收数据时检查其类型是否是 DA TA0、DATA1 交替的 , 这 是保证 数据交换 正确的机 制之一。
数据包:同步域SYNC + 标识域PID + 数据域DATA + 校验域CRC16
8bit | 8bit | 0~1023bytes | 16bit |
SYNC | PID | DATA | CRC16 |
(3)、握手包
握手包( Handshake Packet)是结构最为简单的包。根据PID的不同, 握手包可分为 3 种类型, 即确认包 ACK、无效包NA 和停止包 STALL。
8bit | 8bit |
SYNC | PID |
确认包 ACK: 用于表示数据包被成功接收(一般是接收数据的一方发出) , 具体说就是 :
无效包NAK: 主要用于2种场合(NAK只能由设备发送 , 而不能由主机发送):
错误包 STALL: 主要用于 3 种场合(NAK是USB的一种暂时状态, 当设备处于“忙”的工作状态时 , 就会发送NAK,STALL也只能是由设备来发送, 而不能是主机发送的) :
设备无法发送数据、设备无法接收数据、不支持某一种控制管道的命令。
如有错误或者疑问,请及时提出。谢谢!!!