四、USB通讯的数据结构

    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数据通信结构概况

(1)、包

    “包”, 是USB最基本的数据单元。每一个包,基本上包含了一个完整的USB信息。

(2)、按照包在整个USB 数据传输中的作用不同,包可以分为3类 :

    令牌包

    数据包

    握手包

(3)、域

    USB 中对一系列有统一意义的二进制数的称呼。

(4)、域的分类:

    同步序列域

    包标识域

    地址域

    端点域

    帧号域

    数据域

    CRC校验域

(5)、以包为基础,USB定义了4种数据的传输类型:

    控制传输

    中断传输

    批量传输

    同步传输

    每一种类型都由一定的包按照某种特定的格式组成。 不同的传输类型所能达到的传输速度、占用USB总线的带宽、传输数据的总量和应用场合等都是不同的。

(6)、传输

    如批量传输 , 顾名思义 , 这种传输类型就是用在大量数据的传输中。比如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

11001010

4、二进制数的序列------域

    域(Field), 是USB中对一系列有统一意义的二进制数的称呼。

(1)、同步域

    同步序列域(Synchronization Sequence, 简写为 SYNC) , 简称为同步域。

    同 步域用于本地时钟与输入信号的同步, 代表一个包的起始。同步域长度为8位,最后2位作为一个标志, 标明标识域PID的开始。同步域的数值固定为 00000001,同步域位于每一个包的最开始处。主要是用硬件来处理。

                          MSB                                                                                                                                  LSB

10000000

 

(2)、标识域

    包标识域( Packet Identifier Field, 简写为 PID) , 简称为标识域。

    标识域紧跟在同步域之后,用来标明包的类型和格式,作为包的错误检测手段的一种。由于同步域主要是由硬件来处理的 , 因此 , 标识域就是USB软件机制最先收到并处理的包的内容。USB主机和设备都要首先对接收到的标识域进行解码。如果出现错误或是该标识域指明的类型或方向不被支持 , 那么这个包就会被忽略。比如, USB接口芯片中定义的IN端点, 在接收到OUT标识域后 , 就会把相应的包忽略掉。

    标识域由 4 位标识符和紧跟的 4 位标识符的反码组成 , 总共 8 位。

                             MSB                                                                                                                                  LSB

!PID3!PID2!PID1!PID0PID3PID2PID1PID0

    标识域中关键的标志符由 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

ADDR6ADDR5ADDR4ADDR3ADDR2ADDR1ADDR0

  能够表示的最大地址容量为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

ENDP3ENDP2ENDP1ENDP0

(5)、帧号域

  帧号域(Frame Field, 简写为FRAM)中的帧是时间概念。USB协议中, 1帧即1ms。在USB总线上, 1帧是一个独立的单元 , 包含了一系列总线动作。 USB将这1帧分为好几份 , 每一份中是一个USB的传输动作。

  每一个帧都有特定帧号。帧号域由11位二进制数组成。帧号域的最大容量为211=2048=0x800,帧号只能在帧起始包中传递。

1ms帧结构
1ms帧结构

                          MSB                                                                                                                                        LSB 

FRAM10FRAM9FRAM8FRAM7FRAM6FRAM5FRAM4FRAM3FRAM2FRAM1FRAM0

 

(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种类型的包 , 即令牌包、数据包、握手包和特殊包。

(1)、令牌包

  根据标识域PID的不同 , 令牌包( Token Packet)又可细分为:输入包IN、输出包OUT、设备包 SETUP和帧起始包SOF。

  输入包IN、输出包OUT和设置包SETUP:同步域SYNC+标识域PID+地址域ADDR+端点域 ENDP+校验域CRC5(CRC5 是 对地址 域 ADDR 和端 点域 ENDP 总共 11 位数进行的校验)

                        

IN/OUT/SETUP包数据格式
8bit8bit7bit4bit5bit
SYNCPIDADDRENDPCRC5

  帧的起始包SOFK:帧起始包不是特定针对 某一个设备和端点的传输, 是整个USB总线动作的一个时间划分。

帧起始包SOF数据格式
8bit8bit11bit5bit
SYNCPIDFRAMCRC5

(2)、数据包

  根据PID的不同, 数据包(Data Packet)分为DATA0和DATA1两种包。

  在分包传输时,如果第一个数据包被确定为DATA0, 那么第二个发送的数据包就应该是DATA1……如此交替下去。 而 数据的接收方在接收数据时检查其类型是否是 DA TA0、DATA1 交替的 , 这 是保证 数据交换 正确的机 制之一。

  数据包:同步域SYNC + 标识域PID + 数据域DATA + 校验域CRC16

数据包数据格式
8bit8bit0~1023bytes16bit
SYNCPIDDATACRC16

(3)、握手包

  握手包( Handshake Packet)是结构最为简单的包。根据PID的不同, 握手包可分为 3 种类型, 即确认包 ACK、无效包NA 和停止包 STALL。

握手包
8bit8bit
SYNCPID

  确认包 ACK: 用于表示数据包被成功接收(一般是接收数据的一方发出) , 具体说就是 :

  标识域 PID 被正确接收 ;

  并且没有发生数据位错误 ;

  没有发生数据域的 CRC 校验错误等。

  无效包NAK: 主要用于2种场合(NAK只能由设备发送 , 而不能由主机发送):

  在接到主机发来的 OUT 命令后, 设备无法接收数据 ;

  接到主机的 IN 命令 , 但是设备没有数据发送给主机。

  错误包 STALL: 主要用于 3 种场合(NAK是USB的一种暂时状态, 当设备处于“忙”的工作状态时 , 就会发送NAK,STALL也只能是由设备来发送, 而不能是主机发送的) :

  设备无法发送数据、设备无法接收数据、不支持某一种控制管道的命令。

如有错误或者疑问,请及时提出。谢谢!!!

               上一篇                                                                                 下一篇

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值