USB学习笔记(1)初始USB

本文主要是简要概述一下USB系统,让初学者对USB系统有一个大致的认识,

1. USB是什么?

  1. USB是通用串行总线(Universal Serial Bus)的缩写;
  2. 支持具有热拔插,并且是即插即用PnP(Plug and Play)的特性;
  3. USB是主从模式的结构;
  4. USB OTG,同一个设备在不同的场合下可以在主机和从机之间切换;
  5. 目前USB最新的协议是USB4.0

2. USB的拓扑结构

USB是一种主从结构的系统。主机叫做Host,从机叫做Device(也叫做设备);

通常主机具有一个或多个USB主控制器(host controller)和根集线器(root hub)。主控制器主要负责数据处理,根集线器则提供一个连接主控制器与设备之间的接口和通路;还有另一类特殊的USB设备–USB集线器(USB hub),它可以对原有的USB口在数量上进行扩展,获得更多的USB口;需要注意的是。集线器只能扩展出更多的接口的USB口,而不能扩展出更多的带宽,带宽是共享一个USB主控制器的。
USB学习笔记(1)初始USB
USB学习笔记(1)初始USB

3. USB的电气特性

标准的USB线是使用4芯电缆:5V电源线,差分数据线负(D-),差分数据线正(D+)以及GDN地,在USB OTG中又增加一条识别身份的ID线,主要用于确认接连的两个机器,谁做主机,谁做设备。

USB使用的差分传输模式,在USB低速和全速模式中,采用的是电压传输模式,而在高速模式下采用的是电流传输模式。

USB使用的是NRZI编码方式:当数据为0时,电平翻转;数据为1时,电平不翻转。为了防止出现长时间的电平不变化,在发送数据前要经过位填充处理(当遇到连续6个数据1时,就强制插入一个数据0)。初学者只需要大概知道他们的传输方式就好了,这些工作USB芯片已经做了,不需要深究。

4. USB的插入检测机制

在USB集线器的每个下游端口的D+和D-上,分别接了一个15K的下拉电阻到地,这样当集线器的端口没有设备插入的时候,D+和D-就被这两个下拉电阻拉到了低电平,所以默认集线器默认时低电平。而在设备端,在D+或者D-上接了一个1.5K的上拉电阻到3.3V电源(全速设备和高速设备上拉电阻接到D+,低速设备上拉电阻接到D-)。当设备插入到集线器时,接了上拉的数据线与USB集线器的下拉电阻分压,最终时3V左右,对于集线器来说是个高电平。集线器检测到这个状态后,它就报告给USB主控制器,这样就检测到了有设备插入。

5. USB的协议了解

USB总线只是提供主机与设备之间通讯的数据通路,关于主机与设备之间怎么通讯的,设备实现的具体功能,是需要通过USB协议实现的。USB协议的内容比较复杂,本节只提取部分内容进行描述。

1. 描述符

简单理解,描述符就是设备告诉主机,设备能实现的功能,设备的信息等。描述符可以分为:

  • 设备描述符(Device Descriptor):设备描述符主要记录设备所使用的USB协议版本号,设备类型,端点0的最大包大小,厂商ID(VID),产品ID(PID),设备版本号,厂商字符串索引,产品字符串索引,设备***索引,可能的配置数等。
  • 配置描述符(Configuration Descriptor):配置描述符主要记录配置所包含的接口数,配置的编号,供电方式,是否支持远程唤醒,电流需求量等。
  • 接口描述符(Interface Descriptor):接口描述符主要记录接口的编号,接口的端点数,接口所使用的类,子类,协议等。
  • 端点描述符(Endpoint Descriptor):端点描述符主要记录端点号及方向,端点的传输类型,最大包长度,查询时间间隔等。
  • 字符串描述符(String Descriptor):字符串描述符主要是提供一些文字信息给用户阅读。
  • 类特殊描述符(HID描述符):HID描述符属于类特殊描述符的一种,HID是Human Interface Device的缩写,可以理解成人机交互设备,HID设备也是后面我们用到最多的一种设备,比方说鼠标,键盘等。
  • 报告描述符(Report Descriptor):报告描述符主要是为了描述报告的结构及用途。“报告”就是HID设备与主机进行通讯的媒介。

后面还会对描述符进行大篇幅的描述,这里先大致了解一下。

2. 包结构

USB总线上传输数据是以包为基本单位,一个包包含多个域,不同类型的包包含的域也不一样,但是它们都是以一个同步域开始,后面接一个包标识符(PID),最终以包结束符(EOP)结束这个包。简单理解,同步域就是告诉USB总线,要开始传输数据了,包结束符就是告诉USB总线,这个包的数据已经发送完毕了。而包标识符就是用来说明这个包是什么类型的包,分为四种包:

  • 令牌包(token packet):令牌包用来启动一次USB传输,所有的数据传输都是由主机发起的,设备只能被动接听数据,这就需要主机发送一个令牌包来通知哪个设备进行响应,如何响应
  • 数据包(data packet):顾名思义就是用来传输数据
  • 握手包(handshake packet):握手包用来表示一个传输是否被对方确认。需要注意的是,返回NAK并不是表示数据出错,只是说明设备目前没有数据接收能力。当USB主机或者设备检测到数据出错时,将说明都不返回,这个等待握手的一方就会收不到握手包从而等待超时
  • 特殊包(special packet):需要了解的可以去百度资料,这里不做讲述
PID类型 PID名 说明
令牌包 OUT 通知设备主机将要输出一个数据包,主机发送数据给设备
IN 通知设备返回一个数据包,设备发送数据给主机
SOF 通知设备这是一个帧起始包,SOF令牌包后面不跟数据包,其他令牌包都需要跟数据包
SETUP 通知设备将要开始一个控制传输,和OUT包一样,都是告诉设备将要输出一个数据包,SETUP令牌包后面只使用DATA0数据包,且只能发到设备的控制端点,并且设备必须接收
数据包 DATA0
DATA1
DATA2 主要用在高速分裂事务和高速高带宽同步传输中
MDATA 主要用在高速分裂事务和高速高带宽同步传输中
握手包 ACK 确认,表示正确接收数据,并且有足够的空间来容纳数据,设备和主机都可以发送ACK来确认,而NAK,STALL,NYET只有设备能够返回
NAK 不确认,表示没有数据需要返回,或者数据正确接收到数据,但是没有足够的空间容纳他们,当主机接收到NAK时,知道设备还没准备好,主机会在以后合适的时机进行重新传输
STALL 挂起,表示设备无法执行这个请求,或者端点已经被挂起了,他表示一种错误状态。
NYET 未准备好,在USB2.0高速设备输出事务中使用,他表示设备本次数据成功接收,但是没有足够的空间接收下一次数据,主机在下一次输出数据的时候,将先用PING令牌包来试探设备是否有足够的空间接收数据
特殊类 PRE 前导(令牌包)
ERR 错误(握手包)
SPLIT 分裂事物(令牌包)
PING PING测试(令牌包)

一般USB芯片都会自动辨识各种包的类型,数据包切换,握手等协议。开发者一般不需要去关心这些,比方说USB芯片接收到了一个包,如果有空间接收就会自动返回ACK包,如果没有空间,则返回NAK包。开发者只需要通过USB芯片的数据手册,读取当前包类型,以及数据需要我们做的事情,相对应的完成就好了。

3. 传输类型

包是USB总线上传输的基本单位,但是我们不能随意的使用包来传输数据,必须按照一定的关系把这些包组成事务来传输数据。

事务通常是由2个或者3个包组成:令牌包,数据包和握手包

  1. 令牌包用来启动一个事务,总是由主机发送
  2. 数据包传送数据,可以从主机到设备,也可设备到主机,具体的方向由令牌包决定
  3. 握手包的发送者通常为数据接收者。

USB协议规定了4种传输类型:

  • 批量传输(bulk transaction):批量传输通常用在数据量大,对数据实时性要求不高的场合,比方说,打印机,U盘。
  • 同步传输(isochronous transaction):同步传输用在数据量大,对实时性要求高的场合,对数据准确率不用100%高的场合,比方说音频设备,视频设备。
  • 中断传输(interrupt transaction):它不是由设备主动发出的中断请求,而是主机保证在一段时间间隔安排一次传输,比方说鼠标,键盘。
  • 控制传输:最复杂,为了保证数据的传输过程的数据完整性

其中,批量传输,同步传输,中断传输每传输一次数据都是一个事务;控制传输包括3个过程:建立过程,数据过程,状态过程,其中,建立过程和状态过程分别是一个事务,数据过程可能是多个事务。

  • 建立过程:建立过程使用SETUP令牌包,数据包类型只使用DATA0包,握手包,设备只能使用ACK来应答。
  • 数据过程:这个过程不是必须的,第一个数据包必须是DATA1,后面DATA0和DATA1交替。
  • 状态过程:与前面的过程的传输方向相反,表示本次传输结束。状态过程只使用DATA1

4. 端点和端点0

端点构建了主机与设备之间通讯的桥梁,主机与设备之间传输数据都是通过端点传输的,一般一个设备至少有一个端点,每个端点都明确规定了支持的最大包长。

端点0是每个USB设备都必须具备的默认控制端点,它一上电就存在并且可用,设备的各种描述符以及主机发送的一些命令(枚举过程)都是通过端点0来传输的。

6. USB设备的枚举过程

USB主机在检测到USB设备插入之后,就要对设备进行枚举;

枚举就是主机从设备读取各种描述符信息,设备告诉主机设备的具体功能。

设备的枚举过程使用的传输模式是控制传输,控制传输分为3个过程:建立过程,可选的数据过程,状态过程;

枚举详细过程:

  1. 设备复位:USB主机检测到USB设备插入后,对设备进行复位处理;刚插入USB总线的设备都是通过地址0来与主机通讯。

  2. 获取设备描述符:主机往地址为0的设备的端点0发送获取设备描述符的标准请求(建立过程);设备在收到标准请求之后,将设备描述符发送给主机(数据过程);主机收到设备描述符之后,发送长度为0的数据包给设备(状态过程);需要注意的是,标准的设备描述符是18个字节,但是主机第一次只会获取设备描述符的前八个字节。

  3. 设置地址阶段:主机会对设备再次复位,随后进入到设置地址阶段,主机往地址为0的设备的端点0发送设置地址请求(建立过程);设备在收到请求之后,保存请求里面主机发送的地址信息,然后设备将获取到的新地址设置成自己的地址(以后主机就通过这个地址来访问此设备),并发送长度为0的数据给主机(状态过程),此阶段没有数据过程。

  4. 主机再次获取设备描述符:这次主机通过新的地址访问设备,并再次发送获取设备描述符的标准请求,这一次,设备就需要把18个字节的完整的设备描述符信息发送给主机。

  5. 获取配置描述符:主机在获取到了完整的设备描述符之后,会发送获取配置描述符的标准请求,此时设备会发送9个字节的配置描述符给主机。

  6. 获取配置描述符集合:在后面我们会讲到设备的配置描述符,接口描述符,类特殊描述符,端点描述符等,会以一个集合的方式放在一起,主机在获取到配置描述符信息之后(里面包好了配置描述符集合总长度),主机会再次发送一个获取配置描述符的标准请求,此时需要设备返回的数据的总长度就是配置描述符集合的总长度,所以,我们将完整的配置描述符集合信息发给主机。

  7. 获取字符串描述符:如果在前面的配置描述符里面填了字符串索引,那么主机会发送获取字符串描述符的标准请求,设备根据索引值,发送相应的字符串描述符。

  8. 报告描述符:如果是HID设备,主机还会发送获取报告描述符的标准请求,设备返回相应的信息即可。

需要注意的是,不同的USB芯片的枚举过程可能有所区别,但是大致的流程基本都差不多,完成了枚举过程,主机和设备之间的通讯的前期准备工作基本就完成了。

我的个人博客网址:一个点的频率 希望大家关注一下,谢谢!!!

相关文章:

  • 2021-06-29
  • 2021-05-31
  • 2021-05-17
  • 2021-11-15
  • 2022-12-23
  • 2021-10-24
  • 2021-10-07
  • 2021-12-29
猜你喜欢
  • 2022-12-23
  • 2021-12-03
  • 2021-09-16
  • 2021-06-17
  • 2021-08-20
  • 2021-10-14
相关资源
相似解决方案