USB总线专题(二)——数据传输及协议

2017/08/22 USB

1.端点:

位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点) 。

2.帧:

时间概念,在USB中,一帧就是1MS(低速和全速),它是一个独立的单元,包含了一系列总线动作,USB将1帧分为好几份,每一份中是一个USB的传输动作。

3、upstream、downstream(上行、下行):

设备到主机为上行,主机到设备为下行

4.USB的数据格式:

USB数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。

这里写图片描述

USB是串行总线,所以数据是一位一位地在数据线上传递的。既然是一位一位地传递,就存在着一个数据位先后的问题。USB使用的是LSB在前的方式,即先出来的是最低位数据,接下来是次低位,最后是最高位(MSB)。一个包,又被分成了很多个域(field),而LSB、MSB就是以域为单位来划分的。

4.1 域:是USB数据最小的单位,由若干位组成(至于是多少位由具体的域决定),域可分为七个类型:

1、同步域(SYNC),八位,值固定为0000 0001,用于本地时钟与输入同步。

2、标识域(PID),由四位标识符+四位标识符反码构成,表明包的类型和格式,这是一个很重要的部分,这里可以计算出,USB的标识码有16种

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进制中的除法。

4.2 包:由域构成的包有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同的包的域结构不同,介绍如下:

1、令牌包:可分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放据数的)。

令牌包有4种,分别为输出(OUT)、输入(IN)、建立(SETUP)和帧起始(SOF Start Of Frame)

•输出令牌包:用来通知设备将要输出一个数据包。

•输入令牌包:用来通知设备返回一个数据包。

•建立令牌包:只用在控制传输中,它跟输出令牌包的作用一样,也是通知设备将要输出一个数据包,两者的区别在于:SETUP令牌包后只使用DATA0数据包,且只能发到设备的控制端点,并且设备必须要接收,而OUT令牌包没有这些限制。

•帧起始包:在每帧(或微帧)开始时发送,它以广播的形式发送,所有USB全速设备和高速设备都可以接收到SOF包。USB全速设备每毫秒产生一个帧,而高速设备每125us产生一个微帧。

其中输入包、输出包和设置包的格式都是一样的:

SYNC+PID+ADDR+ENDP+CRC5(五位的校验码)

这里写图片描述

帧起始包的格式:

SYNC+PID+11位FRAM+CRC5(五位的校验码)

这里写图片描述

2、数据包:分为DATA0包和DATA1包,当USB发送数据的时候,当一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0包和DATA1包交替发送,即如果第一个数据包是 DATA0,那第二个数据包就是DATA1。但也有例外情况,在同步传输中(四类传输类型中之一),所有的数据包都是为DATA0,格式如下:

SYNC+PID+0~1023字节+CRC16

这里写图片描述

3、握手包:结构最为简单的包,格式如下

SYNC+PID

这里写图片描述

5.USB描述符

USB 描述符中记录了设备的类型、厂商ID和产品ID(通常依靠它们来加载对应的驱动程序)、端点情况、版本号等众多信息。

一个USB设备只有一个设备描述符。设备描述符里决定了该设备有多少种配置,每种配置有一个配置描述符;而在每个配置描述符中又定义了该配置里有多少个接口,每个接口都有一个接口描述符;在接口描述符里又定义了该接口有多少个端点,每个端点都有一个端点描述符;端点描述符定义了端点的大小、类型等。如果有类特殊描述符,它跟在相应的接口描述符之后。

在主机获取描述符时,首先获取设备描述符,接着再获取配置描述符,然后根据配置描述符中的配置集合的总长度,一次将配置描述符、接口描述符、类接口描述符(如果有)、端点描述符一次读回。对于字符串描述符,是单独获取的。主机通过发送获取字符串描述符的请求以及描述符的索引号、语言ID来获取相对应的字符串描述符。

设备有一个设备地址,USB主机依靠这个设备地址来访问设备。而在设备内部还会分的更细,它会分出一些端点出来等。就是说,如果USB主机要和USB设备通信,光有设备地址是不够的,还需要一个端点地址。有了设备地址和端点地址,就能准确地对端点发送和读取数据了。而配置和接口,是为了更方便地管理端点而抽象出来的概念。一个设备可以有多个设备,但是同一时间只能有一个配置有效,每个配置下又可以有多个接口。当我们需要不同的功能时,只要选择不同的配置即可。同一个端点号不能出现在同一配置下的两个或多个不同的接口中。同一个端点号可用在不同的配置中。

6.USB设备的枚举过程

枚举:就是从设备读取各种描述符信息,这样主机就可以根据这些信息来加载合适的驱动程序,从而知道设备是什么样的设备,如何进行通信等。

在设备的枚举过程中都是使用控制传输。控制传输分为三个过程:建立过程、可选的数据过程及状态过程。 具体参照:USB通信协议深入理解

(1)USB主机检测到USB设备插入后,就会先对设备复位。USB设备在总线复位后其地址为0,这样主机就可以通过地址0和那些刚刚插入的设备通信。USB主机往地址为0的设备的端点0发送获取设备描述符的标准请求(这是一个控制传输的建立过程)。设备收到该请求后,会按照主机请求的参数,在数据过程将设备描述符返回给主机。主机在成功获取到一个数据包的设备描述符并且确认没有错误后,就会返回一个0长度的确认数据包(状态过程)给设备,从而进入到接下来的设置地址阶段。这里需要注意的是,第一次主机只会读取一个数据包的设备描述符。标准的描述符有18字节,有些USB设备的端点0大小不足18字节(但至少具有8字节),在这种情况下,USB主机也是只发送一次数据输入请求,多余的数据将不会再次请求。因此,如果当设备端点0大小不足18字节时,就需要注意到这个问题。也就是说在第一次获取设备描述符时,只需要返回一次数据即可,不要再等主机继续获取剩余数据(如果还有),因为主机不会这么干的。当主机成功获取到设备描述符的前8字节之后(USB协议规定端点0最大包长至少要有8字节),它就知道端点0的最大包长度了,因为端点0最大包长度刚好在设备描述符的第八字节处

(2)主机对设备又一次复位。这时就进入到了设置地址阶段。USB主机往地址为0的设备的端点0发出一个设置地址的请求(控制传输的请求过程),新的设备地址包含在建立过程的数据包中。具体的地址由USB主机负责管理,主机会分配一个唯一的地址给刚接入的设备。USB设备在收到这个建立过程之后,就直接进入到状态过程,因为这个控制传输没有数据过程。设备等待主机请求状态返回(一个输入令牌包),收到输入令牌包后,设备就返回0长度的状态数据包。如果主机确认该状态包已经正确收到,就会发送应答包ACK给设备,设备在收到这个ACK之后,就要启用新的设备地址了。这样设备就分配到了一个唯一的设备地址,以后主机就通过它来访问该设备。需要注意的是,像D12这样的USB接口芯片,会自动等待状态过程主机的ACK之后才启用新地址,所以要在返回0长度的状态包之前,将地址写到D12芯片的地址寄存器中,D12芯片等主机返回ACK后,才会使用新的地址。

(3)主机再次获取设备描述符。这次跟第一次有点不一样,首先是主机不再使用地址0来访问设备,而是使用新的设备地址;另外,这次需要获取全部的18字节的设备描述符。如果你的端点0最大包长小于18字节,那就会有多次请求数据输入(即发送多个IN令牌包)。

(4)主机获取配置描述符。配置描述符总共为9字节。主机在获取到配置描述符后,根据配置描述符中所描述的配置集合总长度,获取配置集合。获取配置描述符和获取配置描述符集合的请求是差不多的,只是指定的长度不一样。有些主机干脆不单独获取配置描述符,而是直接使用最大长度来获取配置描述符集合,因为设备实际返回的数据可以少于指定的字节数。配置集合包括配置描述符、接口描述符、类特殊描述符(如果有)、端点描述符等。接口描述符、类特殊描述符、端点描述符是不能单独获取的,必须跟随配置描述符以一个集合的方式返回一并返回。

如果有字符串描述符,还要获取字符串描述符。另外,像HID设备还有报告描述符等,它们是单独获取的。

7.USB通信的格式

这里写图片描述

USB 数据包使用反向不归零码(NRZI)。反向不归零码由传送信息的 USB代理程序完成,然后被编码的数据通过差分驱动器送到USB电缆上,紧接着接收器将输入的差分信号进行放大,将其送给解码器。

8.传输类型与端点支持的最大包长

每个端点描述符中都规定了端点所支持的最大数据包长。主机每次发送数据包,都不能超过端点的最大包长。

1.对于控制传输的端点,低速模式最大包长固定为8字节,高速模式最大包长固定为64字节,而全速模式可在8、16、32、64字节中选择。

2.对于同步传输的端点,全速模式最大包长上限为1023字节,高速模式最大包长上限为1024字节,低速模式不支持同步传输。

3.对于中断传输的端点,低速模式最大包长上限为8字节,全速模式最大包长上限为64字节,高速模式最大包长上限为1024字节。

4.对于批量传输的端点,高速模式固定为512字节,全速模式最大包长可在8、16、32、64字节中选择,低速模式不支持批量传输

参考:

1.USB协议基本知识

2.USB概述及协议基础

3.USB枚举过程

4.USB的通讯协议(通俗易懂)

想留言却没看到评论框?点这里。

Search

    Post Directory