我们之前接触过的通信协议有串口、I2C、SPI以及CAN总线,这里我们又去学习USB总线,那USB和之前我们介绍过那些总线有什么区别呢。
通用串行总线(英语:Universal Serial Bus,缩写:USB)是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数字电视(机顶盒)、游戏机等其它相关领域。
在USB总线出现之前,计算机与键盘、鼠标、扫描仪、打印机等的设备连接都使用专用的接口连接,不同的设备的接口不能互用,扩展性很差,每次插拔设备都要关闭计算机,不支持热插拔,且通信速率很低。
为了解决上述问题,USB总线诞生了。USB总线就好像一条管道,管道里流过的东西只要符合USB协议,至于具体流的是什么东西,USB总线并不关心。对应具体的设备上,只要是支持USB协议的设备,都可以连接计算机,如USB键盘、USB鼠标、USB摄像头、USB音箱等。USB的出现简化了计算机与外围设备的连接,增强了扩展性,支持热插拔,且通信速度很快。
从USB协议诞生至今,出现了多个USB协议版本,如USB1.0、USB1.1、USB2.0、USB3.0、USB3.1、USB3.2。最新的是USB4.0协议,可直连CPU的PCIe总线,最大速度可达40Gbps,使用Type-C接口,兼容DP视频协议、PD快充协议等,最高支持100W供电。
USB协议版本 | 速率称号 | 最大速率 | 电源 | 类型 | 推出时间 |
---|---|---|---|---|---|
USB1.0 | 低速(Low-Speed) | 1.5Mbps | 5V/500mA | 半双工 | 1996年1月 |
USB1.1 | 全速(Full-Speed) | 12Mbps | 5V/500mA | 半双工 | 1998年9月 |
USB2.0 | 高速(High-Speed) | 480Mbps | 5V/500mA | 半双工 | 2000年4月 |
USB3.0(USB3.2 Gen1) | 超高速(SuperSpeed USB) | 5Gbps | 5V/900mA | 全双工 | 2008年月11月 |
USB3.1(USB3.2 Gen2) | SuperSpeed USB 10Gbps | 10Gbps | 20V/5A | 全双工 | 2013年月7月 |
USB3.2(USB3.2 Gen2×2) | SuperSpeed USB 20Gps | 20Gbps | 20V/5A | dual-lane | 2017年月9月 |
USB4.0(Gen3×2) | ---- | 40Gbps | 100瓦 | single-lane或dual-lane,兼容Thunderbolt3 | 2019年月8月 |
注:USB3.2推出时,USB-IF公布了新的命名规范,将USB3.0改名为USB3.2 Gen1,USB3.1改名为USB3.2 Gen2,而将能够使用两个USB Type-C Rx/Tx针脚的USB3.2改名为USB3.2 Gen2×2。
下图是各个版本USB协议使用的标志及接口,USB3.2以后,只使用Type-C接口,包括图中未画出的USB4.0和Thunderbolt3。
伴随着USB的版本迭代,USB又产生了多种连接器类型规范,比如Type A、Type B、Type-C。
下图是USB3.2协议使用的标志,此标志是USB-IF网站上最新的。
下图是USB4.0协议使用的标志,USB4.0使用Gen3 lane,single-lane可达到20Gps,dual-lane为40Gps。USB4™ 20Gbps使用single-lane,USB4™ 40Gbps使用dual-lane。
USB是主从模式的总线,主机称为Host,丛机称为Device(设备)。从机与从机之间、主机与主机之间(不包括USB4.0),不能互联。每次通信都是由主机发起,从机不能主动发起通信,只能被动的应答主机的请求。
USB3.0及以后的USB协议,主机也可以和集线器(Hub)通信。为了增加灵活性,又出现了USB OTG(On The Go),USB OTG支持主从切换,同一个设备,在不同场合下,可以在主机和从机之间切换。
USB OTG线中增加了一根USB ID线,当USB ID线上拉时,处于从机模式,当USB ID线接地时,处于主机模式。
在有些场景下,我们期望将一个USB接口扩展为多个USB接口,这时我们就会使用到一个装置,也就是USB Hub,如下图所示:
因此,USB总线可能呈现出树状的拓扑接口吗,USB标准上说USB总线拓扑是一种分层星型结构,如下图所示:
从树结构我们可以看到:
下图是USB3.2线缆的示意图,同时兼容USB2.0:
USB使用差分信号传输数据,图中的D+和D-是一对差分线,SSTX+和SSTX-是一对差分线,SSRX+和SSRX-是一对差分线:
USB3.2和USB2.0使用不同的差分线传输数据,两者互不干扰,可同时工作。USB3.2线缆中保留了USB2.0的数据传输通道,实现了对USB2.0的兼容。USB主机可通过$V_{BUS}$线向设备供电,最大可输出20V/5A,GND是地线。
当一个USB设备插入PC机,PC机怎么知道有设备插入?
如下图所示,USB2.0接口只有4条线:$V_{BUS}$(5V),GND,D-,D+。
USB低速设备硬件接线图
USB全速(高速)设备硬件接线图
注意:上图中VCC同$V_{BUS}$。
PC机的USB插孔的D-和D+数据线均连接15K欧姆的下拉电阻。而USB设备端的D-或D+数据线连接1.5K欧姆的上拉电阻。当设备插入PC机的时候,会将PC机的D-或D+端的电压拉高,当PC机在D-或D+端检测到高电平时,就知道有设备插入了。
如果是PC机D-端被拉高,接入的则是USB低速设备;如果是PC机D+端被拉高,接入的则是USB全速或高速设备,具体是全速设备还是高速设备,会由PC机和USB设备发包握手确定。
USB架构包含四种基本类型的数据传输:
下表是这四类传输在不同速度模式下支持的最大包长度:
速度模式 | 低速 | 全速 | 高速 |
控制传输 | 8 | 8/16/32/64 | 64 |
同步传输 | 不支持 | 1023 | 1024 |
中断传输 | 0~8 | 0~64 | 0~1024 |
批量传输 | 不支持 | 8/16/32/64 | 512 |
USB2.0主机控制器通过把时间在低速、全速模式下分成1毫秒宽的帧(frame),在高速模式下分成125微妙宽的微帧(microfranme),以此来管理传输。主机控制器将每个帧或微帧的一部分分配给各个传输。每个帧(或微帧)以带有时序参考的帧(Start-of-Frame,SOF)开始。超高速总线不使用SOF,但主机控制器仍可以在125微妙的总线时间内安排超高速传输。
USB传输可以安排在1个或多个帧或微帧中,每个传输包含多个事务,每个事务又进一步含有多个信息包(packets)。信息包必须在一个帧或微帧中传输完毕,不能跨帧或微帧。信息包分为4类,令牌类信息包确认事务类型,数据类信息包携带数据和状态代码,握手类信息包携带状态代码,最后一种是特殊类信息包。
USB传输由一个或多个事务(transaction)组成,这些事务可将数据载入端点或从端点取出。USB2.0事务开始于主机在总线上发送的令牌信息包(token packet)。令牌信息包含有目标端点号和方向。IN令牌信息包表示向端点请求数据信息包。OUT令牌信息包则是主机派发数据信息包的先行信息。除了数据,每个数据包还含有错误检查位和一个带有数据顺序值的信息包ID(PID)。许多事务还拥有握手信息包(handshake packet),数据的接收端用它来报告事务成功或失败。对于超高速传输事务,信息包类型和协议有所不同,但却含有相同的地址、错误检查和与数据相配合的数据顺序值。
信息包类型 | PID名字 | 取值(二进制) | 传输类型 | 来源 | 说明 |
---|---|---|---|---|---|
令牌 | OUT | 0001 | 全部 | 主机 | IN事务中需要的设备和端点地址 |
令牌 | IN | 1001 | 全部 | 主机 | IN事务中需要的设备和端点地址 |
令牌 | SOF | 0101 | 帧开始 | 主机 | SOF标识符和帧号 |
令牌 | SETUP | 1101 | 控制 | 主机 | 用于Setup事务的设备和端点地址 |
数据 | DATA0 | 0011 | 全部 | 主机、设备 | 数据交替或数据PID序列 |
数据 | DATA1 | 1011 | 全部 | 主机、设备 | 数据交替或数据PID序列 |
数据 | DATA2 | 0111 | 等时 | 主机、设备 | 数据PID序列 |
数据 | MDATA | 1111 | 等时、分割事务 | 主机、设备 | 数据PID序列 |
握手 | ACK | 0010 | 控制、批量、中断 | 主机、设备 | 接收端接收到正确的数据信息包 |
握手 | NAK | 1010 | 控制、批量、中断 | 设备 | 接收端不能接收数据,或者发送端无法发送数据或无数据要发送 |
握手 | STALL | 1110 | 控制、批量、中断 | 设备 | 控制请求不被支持或端点被停止 |
握手 | NYET | 0110 | 控制写、批量、OUT、分割事务 | 设备 | 正确的接收了数据信息包,但还没准备好接收下一个,或集线器还没有将数据信息包分割完成 |
特殊 | PRE | 1100 | 控制、中断 | 主机 | 主机发出的先行信号 |
特殊 | ERR | 1100 | 全部 | 集线器 | 由集线器返回的错误 |
特殊 | SPLIT | 1000 | 全部 | 主机 | 分割事务 |
特殊 | PING | 0100 | 控制写、批量、OUT | 主机 | PING测试 |
特殊 | EXT | 0000 | 无 | 主机 | 扩展,未使用 |
参考文章
[1]十四、Linux驱动之USB驱动分析
[2]19.Linux-USB总线驱动分析
[3]Linux USB总线驱动框架分析
[4]常见硬件通信(SPI、I2C、CAN、USB、UART)协议介绍
[5]USART(RS232/422/485)、I2C、SPI、CAN、USB总线
[6]USB总线-USB协议简介(一)(转载)
[7]图解USB标准之架构概览