历史上的今天
返回首页

历史上的今天

今天是:2026年03月14日(星期六)

2023年03月14日 | 单片机外围模块漫谈之四,USB总线基本概念

2023-03-14 来源:zhihu

  1. USB概述

USB设备现在是用的非常普遍的一种接口了,它即插即用的特性给人们带来了很大的方便。在嵌入式的应用中, USB经常被用来作为与上位机通信的接口,还用来通过U盘存储数据等。USB按通讯速度可分为低速,全速和高速设备。在我们的应用中,低速和全速是最为普遍的,在此我们对USB从物理层到协议层做一个简要的介绍。高速USB的原理是一样的,在理解了低速和全速设备的工作原理后再去理解高速设备就比较简单了,在此我们暂不讨论。

低速(Low Speed, 1.5Mbps):键盘,鼠标,手写笔

全速(Full Speed, 12Mbps):音频

高速(High Speed, 480Mbps):视频

USB协议是开放的,可以从官方网站usb.org下载。

2. 主机,设备(Host, Device)

上图是一个典型的USB全速主机和设备的连接示意图。主机要有对外的供电能力,图中可以看到作为主机的单片机,一个引脚用来控制三极管或MOSFET,提供5V的电源至USB口。设备供电有两种方法:一种是通过USB总线,从主机提供的5V获得,如我们常用的U盘;一种是自己从另外的电源获得,此时主机至设备的电源线可以不连。如果设备的1.5k上拉电阻是加在D-上,那么此设备将被主机识别为低速设备。高速设备的上拉与全速设备一样是加到D+,需要靠软件协议进一步区分。

通过USB总线获得供电的设备,分为两种配置:

低功率设备(Low-power devices): 最大电流不超过100mA

高功率设备(High-power devices): 刚连接后设备后的枚举阶段不超过100mA,配置完成后最大不超过500mA。

USB所有的通讯都是由主机发起。当主机检测到有设备连接时,首先会询问设备,让设备自报家门,看看设备都具备哪些能力,其中就包括最大电流,然后主机根据上报的描述进行相应的操作。这个过程叫自举(Enumeration)。设备通过描述符(Descriptor)来声明自己的能力,包括:

设备描述符(Device Descriptor)

配置描述符(Configuration Descriptor)

接口描述符(Interface Descriptor)

端点描述符(Endpoint Descriptor)

字符串描述符(String Descriptor)

端点(Endpiont)是USB通信的基本单元,每个USB设备都会包含若干个端点。主机下发的数据最终会根据设备地址和端点地址到达某一个端点,主机获取数据也是给某个端点发出读数据命令,此端点随后把存储在自己缓冲区的数据发给主机。

在端点之上是逻辑组织,多个端点可以归到一个接口,多个接口可以归为一个配置。而一个设备可以有多个配置。

3. USB物理层

(USB Specification 2.0)

1 红色 Vbus(5V)

2 白色 D-

3 绿色 D+

4 黑色 GND

有的USB接口会多出一根ID线,以支持OTG(On The Go)。支持OTG的线两端是不一样的,其中一端插到OTG设备时会把设备接口的识别引脚ID拉低,此设备识别到自己的ID拉低后会进入主机状态(Host),连线另一端的设备ID没有拉低,默认进入设备状态(Device)。之后通过软协议可以主从切换。但是集中这种应用不是太多,一台设备要么作主机,要么作设备的情况比较多。

USB使用的是差分传输模式,有两根数据线D+和D-。
Differential 1:D+ > VOH(min) (2.8V) 且D- < VOL(max)(0.3V)
Differential 0:D- > VOH and D+ < VOL

J状态:对于低速USB是Differential 0,对于全速USB是 Differential 1
K状态:对于低速USB是Differential 1,对于全速USB是 Differential 0

除此之外,通过把D+,D-当作单端信号拉低,拉高,可以表示一些特殊的状态。

SE0状态(Single Ended 0):D+ 低,D- 低
SE1状态(Single Ended 1):D+ 高,D- 高

Reset信号:D+ and D- < VOL for >= 10ms
主机在要和设备通信之前会发送Reset信号来把设备设置到默认的未配置状态。即主机拉低两根信号线(SE0状态)并保持10ms。

看到这里也许有点晕,不过没关系,你如果看USB协议会更晕。

我们千万不要掉进这个坑里出不来,就像我们用串口也从来不会去触发一个起始信号,或者拉出一个结束信号一样,这些物理层信号状态的处理完全由芯片集成的USB控制器来处理。而且提供USB软件协议栈也是必须的,靠用户自己完全把所有细节搞清楚是不现实的。然而就像开车一样,你如果对汽车的原理有更深入的了解,一定更能充分的发挥出这辆车的性能。

继续,除了以上状态,还有:

Idle State, Resume State, Start of Packet, End of Packet, Disconnect, Connnect.

4. Packet

Packet是USB通讯最基本的单位。

SOP:Start Of Packet,标志由空闲状态转入数据包发送。

SYNC:同步段,供USB设备进行时钟同步。

PID:Packet Identifier。种类比较多,下面再详细说明。

Address:设备和端点地址。一个主机可以挂接多个设备,主机会给每个设备分配不同地址。

Frame Number:帧号,每发一帧加1,达到7FFFH时变为0。

Data:数据段。

CRC:校验和。

EOP:End Of Packet。

通过不同的PID,数据包被分成4个大类,每个大类又包含一些小类:

令牌 (Token) OUT,IN,SETUP,SOF

数据 (Data) DATA0,DATA1

握手 (Handshake) ACK,NAK,STALL,NYET

特殊包 (Special) PRE,ERR


5. Transaction

一次Transaction总是从主机向设备发出一个令牌(Token)开始。再次强调,USB所有的通信过程都是由主机发起。三种令牌把Transaction分为三类:

OUT:主机发送数据给设备。

IN:主机从设备获取数据。

SETUP:主机对设备进行设置。

USB协议里的OUT和IN,都要站在主机的角度来看。下面是比较典型的获取,发送数据的例子:

每一次Transaction,Token总是必需的,数据段和握手则视情况而定。比如在上一个例子中,当主机发出IN令牌获取数据时,如果设备没准备好数据,则可以返回NAK结束此Transaction。


6. Transfer

好了,有了以上这些,似乎万事俱备了。但是如果进一步想一下,那么还是有些问题不好解决。什么呢?比方说DATA数据段的长度规定多长好呢?主机多长时间发起一次通信比较好呢?

一个USB主机上是允许挂载多个设备的,而这些设备千差万别:比如像鼠标,按键后需要快速响应,把位置信息发送到主机,它的数据量很少,而像U盘则需要传输大量的数据。如果按鼠标的时候U盘正在传输数据怎么办呢?

为了解决上述问题,USB首先规定了四种传输类型:

控制传输(Control Transfers): 主要用来在设备刚连接到主机时对设备进行设置。还有平时对设备状态的管理。它需要双向的数据传输。

批量传输(Bulk Data Transfers): 主要用来进行量大,但对传输时间要求不严格的场景。例如U盘。

中断传输(Interrupt Data Transfers): 需要及时准确的传输信息的场景。中断传输总是单向的。比如鼠标。

同步传输(Isochronous Data Transfers): 一般需要占用相对固定的带宽,延时短而且比较确定。传输是单向的,数据出错后不需要重传。比如USB摄像头。

然后,为了解决设备的及时响应问题,USB每隔1ms (高速USB是每隔125us)发出一个SOF令牌,紧接令牌进行同步类型的传输,之后依次是中断类型,控制类型和批量数据传输类型。在每一个Frame内,Isochronous,Interrupt和Control都会保证一定的带宽。而Bulk型的传输优先级最低,不一定每帧都得到带宽进行数据传输。

一个Transfer 由一个或多个Transactions组成。比如一次控制传输可以由Setup,IN,OUT等Transactions组成。Packet和Transaction是不允许被中间打断的,而Transfer的多个Transactions可以分多次传输。


7. 小结

我们对USB的物理层和协议层做了简要的介绍。在接下来的文章里我们将通过实际的例子来看一下USB是如何工作的,并对很多工程师经常忽略或者没有意识到的一些问题进行探讨。



推荐阅读

史海拾趣

Fedco_Batteries公司的发展小趣事

面对日新月异的市场需求和技术变革,Fedco_Batteries始终保持创新的步伐。公司加大了研发投入,不断推出新型电池产品,满足客户的多样化需求。同时,公司还积极探索新的应用领域,将电池技术应用于更多领域,如新能源汽车、智能家居等。这种创新驱动的发展战略,让Fedco_Batteries在行业中始终保持领先地位。

ABOV(现代单片机)公司的发展小趣事

Fedco_Batteries的创始人李先生,在电子产业蓬勃发展的年代,看到了电池领域的巨大潜力。他凭借对技术的热爱和对市场的敏锐洞察,决定投身电池制造行业。创业初期,公司面临着资金短缺、技术瓶颈等重重困难。然而,李先生带领团队日夜兼程,不断研发新型电池技术,最终成功推出了一款性价比高、性能稳定的电池产品,打开了市场的大门。

Elcos AG公司的发展小趣事

随着国内市场的饱和,Elcos AG开始寻求国际化拓展的机会。公司首先在欧洲市场建立了销售网络,通过与当地合作伙伴的紧密合作,逐渐打开了欧洲市场的大门。随后,Elcos AG又将目光投向了亚洲和北美市场,通过设立海外办事处和参加国际展会等方式,积极推广公司品牌和产品。在国际市场的竞争中,Elcos AG凭借其卓越的产品品质和完善的售后服务体系,赢得了众多客户的信赖和支持。

Faraday Technology公司的发展小趣事

随着市场竞争的加剧,Elcos AG意识到持续创新的重要性。公司加大了研发投入,成立了专门的研发团队,专注于新产品的研发和现有产品的优化。经过数年的努力,Elcos AG成功推出了一系列具有行业领先性能的新型电子元器件,这些产品以其高性能、低功耗和稳定性强的特点,赢得了市场的广泛认可。

Advanced Detector Corp公司的发展小趣事

为了进一步提升竞争力,ADC积极寻求与其他企业的战略合作。通过与业界领先的企业建立合作关系,ADC成功整合了各方资源,共同研发新技术、新产品。这些合作不仅加速了ADC的技术创新步伐,也为其带来了更多的商业机会。

ERNI Electronics公司的发展小趣事

随着公司规模的扩大和产品线的丰富,ERNI Electronics开始积极拓展全球市场。1980年,公司在美国建立了分公司,为后续成为全球供应商打下了坚实的基础。此后,ERNI在新加坡建立了亚洲区总部,并在中国、台湾、韩国、泰国、马来西亚和印度等地设立了销售办事处。这一系列举措使得ERNI的产品能够覆盖更广泛的市场,满足了全球客户的需求。

问答坊 | AI 解惑

嵌入式Linux系统小型化技术

    摘要:介绍了Linux在嵌入式领域中的应用和宿主机、目标机开发模式,详细地给出了精简内核的实现过程。分析了glibc系统库和ELF文件格式的结构和其中的共享库裁剪技术的原理,提出并实现了一种库裁剪方案。 关键词 嵌入式;Linux;小 ...…

查看全部问答>

关于驱动开发的迷茫……

今年刚毕业,应聘一家公司说是做驱动开发的,但是我应聘的部门是软件部,不是驱动部,工作也主要是用MFC编程。我个人对底层的一些东西还是比较感兴趣的,想做驱动开发。但是不知道在这家公司到底适不适合我……不知道这算不算是在做驱动开发,还请 ...…

查看全部问答>

Accurate Inverter Error Compensation and Related

Accurate Inverter Error Compensation and RelatedSelf-Commissioning Scheme in SensorlessInduction Motor DrivesGianmario Pellegrino, Member, IEEE, Radu Iustin Bojoi, Member, IEEE, Paolo Guglielmi, Member, IEEE,and Francesco Cupertin ...…

查看全部问答>

USART的IAP编程,下载不了程序

我的芯片是stm32f103r8。 demo中我把配置文件修改为 #define USE_STM3210B_EVAL  ,同时把FLASH_SIZE 改为 0x10000 即64K。用.hex和.bin文件下载,都没成功过。 我是用IAR生成.hex和.bin。  ...…

查看全部问答>

430F149键盘中断问题,急!!

键盘采用中断方式,可是我按键盘后,程序没反映,跟踪时有键盘的值, 在P1键盘中断中,先判断键盘的值,再做标志位,然后在主程序根据标志位来完成任务! 现在不知道是什么问题,多按几下却能够得到响应的希望结果,现在请问专家和高手们,你们的 ...…

查看全部问答>

收到MSP430 LaunchPad 开发板后,发现串口例程调试不通?

自从参加TI论坛的活动,获得LaunchPad 开发板后,本想利用MSP430G2553芯片做个小控制设备。因为需要用到串口,就随便调试了一下TI提供的几个串口例程,结果用串口调试助手调试时,发现没有收到发出的数据,不过,那个定时器模拟串口的例子可以调通 ...…

查看全部问答>

个人闲置 Jlink v8仿真器 9.5成新

jlink V8仿真器 j-link ARM9 STM32 ARM仿真器 9.5成新,买来后没有用一直放着。 有需要的朋友来看下。 http://item.taobao.com/item.htm? ... AuHN&id=37162726692 同时还有两本书: 嵌入式Linux应用开发完全手册(附CD光盘)书 韦东山 ...…

查看全部问答>

《视频4》R7F0C802下载hex文件(付方法)-Renesas Flash Programmer 和CubeSuite+

本帖最后由 kejoy 于 2014-10-3 22:33 编辑 R7F0C802下载hex文件的问题,其实在很早的帖子里面就有提到参看:https://bbs.eeworld.com.cn/thread-444254-1-1.html,但是一直没有发现问题的原因。也与坛友讨论过,最终在瑞萨FAE的帮助下找到了原因 ...…

查看全部问答>

【Nucleo心得】+ 8x8点阵驱动 (EX01)

本帖最后由 slotg 于 2014-10-5 18:21 编辑 Nucleo板的开发方式有很多种,除了大家所熟悉的KEIL,IAR等工具之外,我选择使用MBED的开发方式,这是一个全新的体验,选择MBED的原因是在这种开发环境下的编程方式就如同Arduino系统一样省略了很多对M ...…

查看全部问答>