『USB3.0Cypress』USB原理(4)标准请求、传输结构

在这里插入图片描述

前言

前文提到,当USB设备与主机连线,并且从设备上电之后,USB主机检测到从设备接入之后,进行一连串的操作以期待得知设备的信息。这其中包括了对设备的枚举操作,枚举操作就是主设备发出标准请求,从设备响应信息,对响应的信息进行必要规范就是描述符。关于描述符的内容在下节内容介绍。本文介绍标准请求,以及传输结构即主从设备之间完成信息交互的传输结构,即不同传输模式应用在不同场景,不同的事务类型组合完成具有实际意义的操作即某种传输模式,那么事务是由包组成的,包作为通信过程中的最小单位,包又由域组成。

1.标准请求

USB数据通信只能发生在主机与从机之间,所有的数据通信都由主机发起,而从机只能被动地应答。在USB规范里,对命令一词提供的英文单词为“Request”,意为请求的意思,但这里为了更好的理解主机与设备之间的主从关系,将它解释成“命令”。当USB设备的识别过程(即枚举)也是一个数据通信过程,在这一过程中,USB规范规定了一个标准的过程,主机在这一过程中发不同的命令,设备对这些命令作出正确响应以完成设备的识别过程。这里的命令即标准请求
所有的USB设备都要求对主机发给自己的控制命令作出响应,USB规范定义了11个标准命令,它们分别是:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、Set_Interface、Set_Feature、Synch_Frame。所有USB设备都必须支持这些命令(个别命令除外,如Set_Descriptor、Synch_Frame)。
不同的命令虽然有不同的数据和使用目的,但所有的USB命令结构是一样的。下表所示为USB命令的结构(偏移量低的先发送)。一共5个字段,不同字段含义不同,相互间不同的组合形成了11个标准命令,如下表所示。

偏移量长度(Bytes)描述
0bmRequestType1类型D7:传输方向
0=主机至设备
1=设备至主机
D6:D5:种类
0-标准 1-类 2-厂商 3-保留
D4:D0 :接收者
0-设备 1-接口 2-端点 3-其他
1bRequest1命令类型编码值
2wValue2不同命令含义不同
3wIndex2索引或偏移不同命令含义不同
4wLength2数据字节数

其中bRequest为命令编码值,共有11种标准命令,见下图 :

valuebRequest
0GET STATUS
1CLEAR FEATURE
2为将来保留
3SET FEATURE
4为将来保留
5SET ADDRESS
6GET DESCRIPTOR
7SET DESCRIPTOR
8GET CONFIGURATION
9SET CONFIGURATION
10GET INTERFACE
11SET INTERFACE
12SYNCH FRAME

需要注意的是,USB的规范中,使用的是小端模式,即低字节在先,高字节在后。下面介绍几个常用的标准请求。

2.常用的标准请求

2.1GET_DESCRIPTOR

bmRequestTypebRequestwValuewIndexwLength数据过程
10000000BGET_DESCRIPTION描述符类型和索引0或者语言ID描述符长度描述符

wValue字段的第一字节(字符)表示同一中描述类型(比如字符串描述符)中具体的某个描述符(如厂商或者产品字符),第二字节表示描述类型的编号。

编号描述符类型
1设备描述符(DEVICE)
2配置描述符(CONFIGURATION)
3字符串描述符(STRING)
4接口描述符(INTERFACE)
5端点描述符(ENDPOINT)

wIndex字段,只在获取字符串描述符中表示语言的ID号,除此之外为0。
wLength字段,表示要求设备返回数据的字节数,设备实际返回可以比它小。

2.2SET_ADDRESS

当设备复位后,都使用默认地址0。主机从地址0的设备获取设备描述符,一旦收到第一次设备描述符之后,主机就会发送设置地址的请求,以尽量减少设备使用公共地址0的时间。

bmRequestTypebRequestwValuewIndexwLength数据过程
00000000BSET_ADDRESS设备地址0x00000x0000

2.3SET_CONFIGURATION

SET_CONFIGURATION和SET_ADDRESS请求很类似,区别是wValue的意义:SET_ADDRESS中,wValue的第一字节(低字节)表示设备的地址;SET_CONFIGURATION则为配置的值。该值与配置描述符的配置编号一致时,表示选中该配置,通常为1,因为大多数USB设备只有一种设置;若为0,则设备进入地址设置状态。

bmRequestTypebRequestwValuewIndexwLength数据过程
00000000BSET_CONFIGUTATION配置值0x00000x0000

3.从不同传输类型认识传输结构

一次传输(Transfer)由 1 次到多次相同事务或者不同事务(Transaction)组成,即不同类型的事务组合完成某种模式的一次传输。事务也分为IN事务,OUT事务,SETUP事务,一定要区分IN事务与IN令牌包。在下文的配图,需要明确某一模块的单位是事务还是包。

3.1控制传输

控制传输分三个过程:建立过程、数据过程(可选)、状态过程。这里的过程可以理解为,为实现某种模式的传输任务需要的事务的集合, 例如建立过程理解为在建立阶段,需要控制传输模式进行握手,这时候的握手需要的事务的组合称之为建立过程。
如图,以控制读为例,展示了完整的一次控制传输的过程。三个阶段已经标注,需要注意的是图中黑色矩形框应理解为事务单元。还是要强调,要区分此处的IN事务与IN令牌包,图中矩形代表是包单元
在这里插入图片描述

  • 建立过程,如下图所示,这是一次SETUP事务,图中矩形代表的是包(这个概念在本文下一节),深色代表从主机到设备,白色代表数据方向为设备到主机。这建立阶段的数据交换包含了SETUP令牌封包、紧随其后的DATA0数据封包以及ACK握手封包。它的作用是执行某一个设置的数据交换,并定义此控制传输的内容(即:在Data Stage中IN或OUT的data包个数,及发送方向,在Setup Stage已经被设定)。
    在这里插入图片描述

  • 数据阶段一个数据过程可以包含多个数据事务,但所有数据事务必须是同一方向的。若数据方向发生了改变,则认为进入状态过程。 数据过程的第一个数据包必须为DATA1,然后每次正确传输一个数据包后就在DATA0和DATA1之间交替。

  • 状态过程:状态过程只使用DATA1包,并且传输方向与数据过程相反。

3.2批量传输

批量传输是可靠的传输,需要握手包来表明传输的结果。若数据量比较大,将采用多次批量事务传输来完成全部数据的传输,传输过程中数据包的PID 按照 DATA0-DATA1-DATA0-…的方式翻转,以保证发送端和接收端的同步。USB 允许连续 3次以下的传输错误,会重试该传输,若成功则将错误次数计数器清零,否则累加该计数器。超过三次后,HOST 认为该端点功能错误(STALL),放弃该端点的传输任务。下图为BULK传输事务组成示意,下图中矩形框为事务单元。
在这里插入图片描述

下图中矩形框为包单元,描述了三种事务分别是IN事务、OUT事务和PING事务,深色代表从主机到设备,白色代表数据方向为设备到主机。一次批量传输(Transfer)由 1 次到多次批量事务传输(Transaction)组成。
在这里插入图片描述

3.3中断传输

由IN或OUT事务组成。 中断传输在流程上除不支持PING 之外,其他的跟批量传输是一样的。他们之间的区别也仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。主机在排定中断传输任务时,会根据对应中断端点描述符中指定的查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。同样中断传输也采用PID翻转的机制来保证收发端数据同步。下图为中断传输的流程图。中断传输方式总是用于对设备的查询,以确定是否有数据需要传输。因此中断传输的方向总是从USB设备到主机。
在这里插入图片描述

3.4同步传输

只有IN和OUT事务;同步传输是不可靠的传输,所以它没有握手包,也不支持PID翻转;主机在排定事务传输时,同步传输有最高的优先级;总线优先保证占用带宽;只使用DATA0;数据包大小全速1-1023字节,高速1024字节;低速设备不支持;同步传输适用于必须以固定速率抵达或在指定时刻抵达,可以容忍偶尔错误的数据上。
在这里插入图片描述

4.包、域

关于传输,要明白两个观点。第一,USB总线上所有的事务(数据流传输)都是由USB Host主动发起,而USB设备永远永远都是只是被动地接收然后处理USB Host发来的各种各样的命令(要求)。第二, 包(Packet)是USB系统中信息传输的基本单元(请始终记得这句话),所有数据都是经过打包后在总线上传输的。包也是理解整个传输结构最为关键的概念,它是由域(字段)组成的,而不同类型的包组合又组成了事务,事务与传输又是息息相关的。他们之间的关系是,传输由事务组合组成,传输分四种,每一种传输模式也有不同传输任务,事务由包组成,不同的事务类型作用在不同的场景中由不同的包组成,包是最小传输单元,包由域字段组成。

4.1包是由域组成的

:USB包由五部分组成,即同步字段(SYNC)、包标识符字段(PID)、数据字段、循环冗余校验字段(CRC)和包结尾字段(EOP),包的基本格式如下图:
在这里插入图片描述

  • 同步序列域(SYNC),位于一个包的最开始处,8bit或32bit,固定0000 0001;
  • 标识域(PID):在同步域之后,标明包类型。8bit,LSB四位为标识码,MSB四位为标识码的反码;
  • 地址域(ADDR):由主机分配唯一地址,7bit,由于地址0保留用作初始化,因此地址最多有127个,也是usb结构中最大127个设备的原因;
  • 端点域(ENDP):4bit,端点0必须作为控制端点,端点可被定义为IN、SETUP、OUT、PING端点,所有设备必须支持端点0作为默认的控制管道;
  • 帧号域(FRAM):11bit,每个帧都有一个特定帧号,帧号域最大容量为0x7FF;
  • 数据域(DATA):在不同的传输类型中,数据域的长度不同(0到1024Byte),但是必须为整数个字节的长度;令牌域(CRC):对令牌包和数据包中非PID域进行校验,令牌包使用CRC5(5bit),数据包使用CRC16(16bit)。

4.2包类型

4.1节说明了包的基本组成结构,需要说明的是上述字段也称作域。不同类型的包是由PID字段标识的。不同类型的包所包含的字段不同,上述只是基本组成,若需了解,上网随处可见。具体分为四个大类,令牌包(Token)、数据包(DATA)、握手包(Handshake)、以及一些特殊包。而在每一个大类中,还是包含着一些小类,例如令牌包包括了SETUP令牌包、IN令牌包和OUT令牌包,其他的大类也都有小类,那么PID可以区分小类, 如下:
在这里插入图片描述
包“向上”组成事务: 在USB上数据信息的一次接收或发送的处理过程称为事务处理(Transaction)即:The delivery of service to an endpoint。一个事务由一系列packet组成,具体由哪些packet组成,它取决于具体的事务。可能由如下包组成:
• 一个token packet
• 可选的data pcket
• 可选的handshake packet
• 可选的special packet
需要注意的是事务也分为IN事务,OUT事务,SETUP事务,一定要区分IN事务与IN令牌包。需要理清事务、包、域之间的关系。

5.传送门

END

🔈文章原创,首发于CSDN论坛。
🔈欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🔈欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。


  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA小油条

原创不易,请多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值