第9课【USB协议】USB总线 接口 端点 管道 数据包 枚举 STM32_USB-FS-Device_Lib V4.1.0

简介

USB(Universal Serial Bus)通常指通用串行总线,日常生活中常见的计算机USB集线器控制器,手机等终端设备,USB线缆等,都是用了USB进行连接。USB技术体系规定了USB总线规范和USB通信协议,这意味着只要遵循USB技术要求制作的设备,都能通过USB总线进行通信。其中USB2.0规范是目前较为广泛被运用,且易于理解的,以下内容都以USB2.0为主线,穿插USB3.X,USB4.0的形式进行讨论

背景

在过去,计算机为了连接不同需求不同速度的外部设备(包括鼠标,键盘和打印机,扫描仪这类通用输入输出设备,还有其他诸如拥有特殊功能的专用设备),通常会预留很多设备接口,多样化接口解决不同设备连接需求的同时,也带来了新的问题:

  • 不支持热插拔:很多接口的连接需要经过【关闭计算机->连接设备->开启计算机】的复杂流程
  • 排障流程复杂:多样化的接口和通信协议,给开发者开发,消费者的使用都带来了一定了门槛

那为何不开发出一个通用的协议标准,统一计算机外设的硬件连接接口和数据传输协议。在1994年底,Intel联合Microsoft,IBM,Compaq,NEC等公司推出USB总线规范

特点

USB协议的目标,就是要解决以下+历史问题:

  • 支持热插拔:计算机无需关机即可同外设连接
  • 即插即用:在操作系统支持的情况下,会自行搜索并安装通用的设备驱动
  • 拓展性强:同时支持多种外设,例如鼠标,键盘,摄像头,打印机,麦克风等。开发者甚至可以自己定义外设
  • 支持多种传输速率:支持低速(1.5Mb/s),全速(12Mb/s),高速(480Mb//s),以及超高速(5Gb/s+)

版本

经过二十几年的发展,USB协议已经迭代了多个版本,分别是:

协议版本 更新内容
USB1.X USB1.0发布于1996年,传输速率为1.5Mb/s,USB1.1发布于1998年,传输速率提升到12Mb/s。USB1.X提供了对HUB和HID设备的支持
USB2.0 USB2.0发布于2000年,传输速率提升到了480Mb/s。USB2.0相当于是USB1.X的升级版
USB3.X USB3.0发布于2008年,传输速率提升到了5Gb/s,USB3.1发布于2013年,传输速率提升到了10Gb/s。USB3.X都提供对USB2.0设备和接口的向后兼容,此外USB3.X还提供了电源支持
USB4.0 USB4.0是当前最新的USB协议,发布于2019年,传输速率达到了惊人的40Gb/s。USB4.0提供了对USB3.X和USB2.0的向后兼容,此外USB4.0还提供了ThunderBolt 3协议支持

数据流模型

总线拓扑结构

USB总线系统是主从式结构的,它可以由一个主机和一个/多个从机构成:

  • 主机一般被称为Host,Host一般会有一个USB主控制器(用于处理数据传输)以及一个USB根集线器(用于同从机之间进行物理连接)
  • 从机一般被称为Device,一般就是指USB功能设备(发挥指定用途)或USB集线器(用于拓展USB接口)

数据传输一般只能在主机和从机之间进行,主机与主机,从机与从机之间一般是不能进行数据交换的。

USB OTG(On The Go)技术
该技术在物理连接上多使用了一根ID数据线,用作身份标识。使用此技术的设备可以在主机和从机之间切换。例如支持USB OTG技术的手机,在连接计算机时可以当作从机,当使用专用数据线同USB设备连接时有又可以作为主机,可外接USB设备包括U盘,键盘等
但从本质上讲,USB OTG技术依旧是遵循主从结构的

数据传输是由主机进行主导的,从机只是被动地进行应答,无论是输入/输出数据,都是由主机端发起,从机收到主机的请求后,按照要求执行对应操作

以下是USB总线系统的拓扑结构图:
在这里插入图片描述
结合拓扑图,可以很好地理解USB总线系统的特点:

  • 整个系统以Host的根集线器为中心:这恰巧也诠释了USB主从模式的结构,主机是整个USB总线的中心
  • USB集线器最多可以串联5个:由于低层的集线器或从机进行数据传输时,都是共享的上一层集线器的带宽,过多的集线器串联会导致每个设备分配到的带宽变小。同时,过多的集线器串联可能会导致每个从机的供电量变小,不正常运行
  • 总线上最多能连接127个从机:USB协议规定,每个初始化成功的USB从机(USB功能设备和USB集线器)都必须有一个唯一的7位二进制地址,这就意味着理论上,单个USB根集线器下最多可以连接2^7=128个从机(除去特殊的地址0,地址0既是USB根集线器的默认地址,也是未初始化从机的临时地址)

地址0被USB根集线器和未初始化的从机临时使用,会出现冲突吗?
不会,当所有的从机都未初始化时(包括根集线器),USB主机会先对根集线器进行初始化,因为此时物理上只有根集线器同主机相连,在根集线器初始化中和初始化完成后,都以地址0作为自身的默认地址。而当根集线器初始化完毕后,主机会开始初始化根集线器下的设备,根集线器下的设备未初始化时的默认地址都会是地址0,但这和根集线器自身地址为地址0并不冲突,因为此时通过地址0同未初始化的设备通信,本质上是通过根集线器(地址0)间接的同USB从机通信


USB总线系统实际上真的可以连接127个从机吗?
不可以,可连接从机数量是要比127少的。因为要考虑以下因素

  • 电力约束:过多USB集线器串联会导致电力供应不足,部分从机可能会不能正常工作
  • 总线带宽:连接过多USB从机时,总线带宽的分配会变得十分有限,导致数据传输出现问题
  • 总线长度:这里的长度指的是物理长度,USB线过长会导致电信号质量变差,数据包丢包变多
  • USB集线器占位:USB集线器也会占用地址,所以实际上真正能发挥作用的从机会更少

综上来说,USB总线上连接的设备是会受到多种因素的限制的(对于USB3.0没有这种限制)

主/从设备通信流

从总线拓扑图的结构中,单独对一对USB主机/从机进行数据传输分析。从逻辑上看,它们的关系可以抽象成下图,USB主机通过用户端软件中的Buffer,通过USB总线提供的管道,和USB从机上的多个端点进行连接。USB主机/从机间的数据传输,其实就是通过用户端软件的Buffer和端点进行数据交换

在这里插入图片描述
其中有两个比较重要的抽象概念,端点管道

端点

端点是USB从机中可以收发数据的最小单位,你可以将端点理解为用于数据传输的Buffer。本质上,每个USB从机在逻辑上都可以理解为多个端点的集合,其中的多个端点都是相互独立的。通过设备地址+端点地址,USB主机可以准确的定位到端点(此处可以结合USB数据格式中的设备地址进行理解),从而进行数据交换

端点分为:

  • 控制端点:USB从机都必须有一个控制端点:端点0,用于对设备进行枚举,以及对设备进行一些基本的控制。它的数据传输方向是双向的,而其他的普通端点的数据方向都是单向的
  • 普通端点:USB从机除了控制端点外,可以有一个或多个普通端点。低速从机做多可以有2个,高速和全速从机最多可以有15个。普通端点需要在设备配置之后才能进行数据传输

管道

管道是USB主机和USB从机之间数据传输的模型,共有两种类型的管道:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值