USB协议概述

USB协议有很多博主讲的很详细了,我这里就是按照我个人的理解总结下,本文章倾向于总结结构,关于结构中的每个字节的具体含义推荐大家还是去找手册,我这里只是一笔带过。

本文章借鉴了其他博主的一些内容,侵删!!!!

1 USB协议术语

首先来看下USB通信的简单框图

如上图所示,左边是主机(上位机),右边是USB设备,对于USB协议来说,整个通信链路上,只能有一个主机,剩下的都是从机,一个主机最多挂载127的设备,为什么是127个设备呢,这个是和协议中的一个指令参数有关,后续我们再说。

1.1配置(Configuration)

        一个USB设备可以有多种配置,不同的配置对应于完全不同的功能,比如一会是作为U盘用,一会是作为网卡用,这就是两个不同的配置。

        主机可以控制设备选择哪个具体的配置,但是设备当前只能选择一个配置。​一般1个USB设备只包含一个配置。

1.2 接口(Interface)

配置下一级是接口     

一个配置可以有多个接口,每个接口都是这个配置下的一个小的功能,比如UVC类USB,分为 控制通信 interface功能和数据interface功能,比如,一个打印机可以有一个接口用于打印,另一个接口用于管理。

1.3 End point (ep)端点

接口下一级是端点

   一个接口完成一种功能,每种接口(功能)配有1个或者多个端点,多个端点共同完成某个接口的功能。

        端点和主机之间的通信 线路 被称之为 pipes(管道)。

        主机和USB设备通信,实际上是要指定和USB设备中的哪个端点通信,因为一个USB设备可以支持多个不同的端点,每个端点都可以传输不同的数据,这些端点共享USB的带宽,(因为物理链路上就只有那么几根,速率也是固定的)

每个USB设备最多支持16个端点同时每个USB设备都必须支持端点0,因此用户最多只能多加15个端点。注意除了控制端点0是双向的以外,其余的每个端点的方向是单向的,要么是IN,要么是OUT,不能同时IN  OUT。

为什么是16个端点和127个USB设备呢,这个是由 USB通信协议规定的,USB通信协议的最基本单位是包(packet),一个包的基本格式如下图,下图中的ADDR中的7bit是USB设备地址,就是指是和哪个USB设备通信的,4bit ENDP是端点号,端点号是指和USB设备中的哪个端点通信的。

端点的分类

1 Control Endpoint: 端点0,最基本的控制通信指令传输。
2. Bulk Endpoint: 用于大批量数据传输的端点
3. Interrupt Endpoint: 用于低延迟的中断传输端点
4. Isochronous Endpoint: 同步端点,用于对延迟要求比较低的场景,比如同步视屏,这些场景可以丢数据,但是不能有延迟

上述术语结构可以如下图所示:

1.4 枚举和重枚举
 

枚举是指当USB设备插入后,HOST会探测USB管脚上的电信号状态,当电信号状态发生改变,则Host 会通过USB协议读取 USB设备的 设备描述符,然后发送SET_CONFIGURATION request。

重枚举就是进行两次枚举,这可能发生在设备重新启动或发生了某些变化导致需要重新枚举的情况下。在重枚举过程中,主机会重新执行枚举过程中的步骤,以确保设备的正确配置。

比如对于cyusb3014来说:

当第一次插入USB时,FX3自动枚举并通过USB电缆下载固件和USB描述符表。然后触发软断开连接,再这之后,FX3再次枚举,这一次作为由下载的信息定义的设备。这种两步枚举,被称为重枚举

1.5 USB 速率 (Super-Hi-Full- low Speed )

1) USB 3.0 (SuperSpeed) interface at 5 Gbps
2) USB 2.0 (Hi-Speed) interface at 480 Mbps
3) USB 1.1 (Full Speed) interface at 12 Mbps

4 )USB 1.0 (Low Speed) interface at 1 Mbps

1.6 USB描述符

USB描述符是USB设备的特色,USB各种各样灵活的功能就是通过USB描述符实现的。USB描述符是对设备的配置、接口、端点、字符串的描述,主机会在枚举此设备的时候根据设备实现的描述符去确定设备到底是一个什么样的设备、设备需要的总线资源、和设备的通讯方式等等。

2 USB传输协议

USB所有的数据传输都是通过包packet 来进行的,不同的包packet类型组成事务(Transction),不同的事务类型组成传输(Transfer )。

2.1 包packet 

一个包的基本格式:注意不同类型的包包含的内容不一样,后面具体说明

不过所有包的基本格式都是:

包的类型通过PID字节分为 :令牌包,数据包,握手包,帧首包(SOF)

1 令牌包  :令牌包包含 OUT/ IN/ SETUP ,这个包的主要作用是标识本次传输事务是什么类型的,发到哪里的,因此令牌包没有数据. 具体的数据或者指令在后面的数据包中。

2 数据包 主要发送数据,没有ADDR+ENDP ,PID用于识别不同类的 数据包,这个包的主要作用是利用DATA 关键字传输数据或者指令。

3 握手包 握手包只有PID部分,没有其他部分,主要是用来握手用的。

4帧首包

如下图所示:PID是 0XA5 

SOF包每隔一端时间就从HOST 发送一个,发送到总线上的所有设备,不会引起任何功能生成应答包。

SOF包由两个作用。第一个作用是当一个功能检测到SOF包后,就知道USB主机控制器开始启动一个帧(微帧)了。第二个作用时标功能, 每一个设备功能可以接收SOF包,通过Frame域来判断当前的时间走到哪里了。

2.2 事务 

事务类型分为:SETUP 事务,IN事务,OUT 事务

每一个事务类型: 比如SETUP 事务,IN事务,OUT 事务 的 结构都是

每个事务类型中的:

令牌包用于标识本次传输是发到哪里的,方向是什么

数据包用于传输具体的指令或者数据

握手包用于握手

比如SETUP事务的结构:

IN事务的结构

OUT事务结构

2.3 传输

传输类型分为:控制传输,批量传输,中断传输,同步传输

每一个传输类型都是由事务组成的

控制传输:

如上图,控制传输中的建立阶段是Setup事务,其他传输都没有,Setup事务主要是通过Setup事务中的 数据包中的DATA字节传输要请求什么命令,然后在数据阶段 从设备 通过 IN 事务中的 数据包返回 SETUP事务请求的数据,最后 HOST再发送一个 OUT 事务(状态阶段)

同步传输:分为读和写,方向不一样

同步传输只有令牌包(通知后面的数据包是给谁的),然后若干个 数据包,没有握手包。

批量传输:批量传输分为读和写,方向不一样

首先通过 IN(OUT)事务中的令牌包通知后面的数据包是给谁的,方向是什么,然后通过IN(OUT)事务中的数据包发送数据,这里可能会发送多个数据包,最后发送握手包

中断传输:分为读和写,方向不一样

首先通过 IN(OUT)事务中的令牌包通知后面的数据包是给谁的,方向是什么,然后通过IN(OUT)事务中的数据包发送数据,这里可能会发送多个数据包,最后发送握手包

他们之间的关系如下图

本图来自博客: 一个早期的程序员,侵删!!!!!!

关于更加详细的结构解释参考我自己画的图

2.4 建立连接(枚举)

 当主机检测到D+与D-之间有电压差,就认为有新的设置接入,然后主机就会发送一系列的请求(Resqusts)给设备。

  主机以控制传输(Control Transfer)的方式,通过端点0(Endpoint 0)对设备发送各种请求(Resqusts),设备收到主机发来的请求后回复相应的信息,进行枚举(Enumerate)操作。所有USB设备必须支持标准请求(StandardRequests),控制传输方式(Control Transfer)和端点0(Endpoint 0)。

这里建立连接的时候发送的数据,是通过上面说的 控制传输 方式来通信的:

上面说的请求Resqusts字段 是在 控制传输中 的SETUP事务中 的DATA0 包中的 数据阶段的,如下图

每个请求request的 格式都是8个字节

这些 请求的格式如下图:

bmRequestype : 请求的分类,比如标准请求Standard ,用户请求 Vendor....我们主要关注标准请求,这个是 建立连接阶段必须要发送的。

bRequest: 每个请求类下面的 不同指令,比如标准请求的分类是:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、Set_Interface、Set_Feature、Synch_Frame。...

连接过程

设备插入

1)用户插入USB(设备处于上电状态,端口不工作),Hub检测各个端口(能判断是什么设备)并用中断端点向host报告各个端口状态。

2)host发送request(Get_Port_Status)请求连接设备,hub回复设备速度类型信息。

3)host等待100ms,让电源稳定,发送复位请求(Set_Port_Feature)到设备(单对单),host不断查询设备复位状态(Get_Port_Status请求),hub持续10ms复位,当撤销后设备就处于默认/空闲状态(Default state),准备接收主机发来的请求。

4)主机发送地址为0的Get Descriptor请求(当设备第一次联机的时候必须回复地址为0的请求) (再次复位,再次复位的目的是使设备进入一个确定的状态,这个不是规定的状态,是windows的行为)。然后设备回复这个指令

5)Host通过Set_Address请求向设备分配一个唯一的地址。在完成这次传输之后,设备进入地址状态(Address state),之后就启用新地址继续与主机通信。这个地址对于设备来说是终生制的,设备在,地址在;设备消失(被拔出,复位,系统重启),地址被收回。同一个设备当再次被枚举后得到的地址不一定是上次那个了。

枚举过程

6) 然后正式进入描述符的解析,主机发送 Get_Descriptor请求到新地址读取设备描述符,这次主机发送Get_Descriptor请求可算是诚心,它会认真解析设备描述符的内容。设备接到包后就开始解析包(其实就是你在固件程序里判断处理) ,然后按固定格式返回自己设备的设备描述符,这一步主要是主机知道你的USB设备的基础属性。设备描述符内信息包括端点0的最大包长度,设备所支持的配置(Configuration)个数,设备类型,VID(Vendor ID,由USB-IF分配), PID(Product ID,由厂商自己定制)等信息。之后主机发送Get_Descriptor请求,读取配置描述符(Configuration Descriptor),字符串等,逐一了解设备更详细的信息。

7)主机通过解析描述符后对设备有了足够的了解,选择一个最合适的驱动给设备。 然后tell the world(announce_device)说明设备已经找到了,最后调用设备模型提供的接口device_add将设备添加到 usb 总线的设备列表里,然后 usb总线会遍历驱动列表里的每个驱动,调用自己的 matc(usb_device_match) 函数看它们和你的设备或接口是否匹配,匹配的话调用device_bind_driver函数,现在就将控制权交到设备驱动了。(读完设备描述符,控制权交给驱动,设备进入配置状态)驱动(注意,这里是驱动,之后的事情都是有驱动来接管负责与设备的通信)。

8)根据前面设备回复的信息,发送Set_Configuration请求来正式确定选择设备的哪个配置(Configuration)作为工作配置(对于大多数设备来说,一般只有一个配置被定义)。至此,设备处于配置状态(Configured),当然,设备也应该使能它的各个接口(Interface)

至此一个基本的USB协议框架就完成了

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: USB CDC(通用串行总线通信设备类)是一种用于在USB设备和主机之间进行通信的协议。该协议定义了一组命令、数据格式和控制信号,用于实现串行通信。USB CDC协议中文版是对USB CDC协议的中文翻译。 USB CDC协议中文版将USB CDC协议的相关英文文档进行了翻译,以便于非英语读者更好地理解和使用此协议。该翻译文档详细说明了USB CDC协议的各个方面,包括通信设备类的基本定义、数据传输和控制流程、命令和数据格式等。它提供了对协议的整体框架和细节的描述,以及一些实例和示意图,以帮助读者更好地理解。 通过使用USB CDC协议中文版,开发人员可以更容易地理解和实现USB设备与主机之间的串行通信。他们可以了解USB CDC协议中定义的命令和数据格式,以及如何处理数据传输和控制流程。同时,中文版的文档还提供了可供参考的示例代码和实际应用场景,以帮助开发人员更快地将USB CDC协议应用于实际项目中。 总之,USB CDC协议中文版是为了方便中文读者理解和使用USB CDC协议而进行翻译的文档。它提供了对USB CDC协议的详细描述和指导,使开发人员能够更好地实现USB设备与主机之间的串行通信。 ### 回答2: USB CDC协议(通用串行总线通信设备类协议)是一种标准的USB通信协议,用于在计算机和USB设备之间传输串行数据。它定义了一组命令和通信规则,允许计算机通过USB接口与串行设备进行通信,例如调制解调器、串行GPS接收器、条码扫描仪等。 USB CDC协议中文版是对USB CDC协议的中文翻译。它包含了USB CDC协议的各种功能、命令和规范的解释和说明,方便中国地区的技术人员理解和使用该协议USB CDC协议中文版的内容主要包括以下几个方面: 1.协议介绍:对USB CDC协议的起源、发展背景以及工作原理进行介绍,让读者对该协议有一个全面的了解。 2.功能说明:详细介绍USB CDC协议支持的各种功能,如设备初始化、数据传输、错误处理等,帮助读者理解如何使用协议来实现特定的通信功能。 3.命令和特性:列举和解释USB CDC协议中的各种命令和特性,包括设备控制命令、数据传输命令等,以及协议支持的各种特性和功能。 4.接口和配置:介绍USB CDC协议的接口和配置,包括数据传输的格式、速率、流控等参数设置,帮助读者正确配置设备和主机之间的通信参数。 通过学习USB CDC协议中文版,读者可以更好地理解和应用USB CDC协议,从而能够更加顺利地开发和调试USB设备,提高工作效率。 ### 回答3: USB CDC(通信设备类)协议,是一种用于USB设备通信的协议标准。它定义了一种通用的通信接口,使得USB设备能够与计算机进行数据交换,并实现不同种类设备的互联互通。该协议广泛应用于各种USB设备,如手机、调制解调器、打印机等。 USB CDC协议中文版主要分为以下几个部分: 1. 概述:介绍了USB CDC协议的基本概念、作用和特点,以及协议级别的体系结构和功能要求。 2. 设备模型:详细描述了USB CDC设备的逻辑模型和功能模型,包括数据通信功能、设备管理功能和通信接口的定义。 3. 通信接口描述:定义了USB CDC设备的通信接口,包括接口的描述、操作命令、标准发送和接收数据的方法等。 4. 控制器对设备的操作:介绍了计算机主机与USB CDC设备之间的通信过程和数据传输方式,包括数据的发送、接收、控制和监测等操作。 5. 数据交换:详细描述了USB CDC设备与计算机之间的数据交换方式和协议要求,涵盖了数据格式、数据包重组、错误检测和纠正等相关内容。 6. 其他附录:包括一些附加信息、参考文献和示例代码等,帮助用户更好地理解和应用USB CDC协议。 总体来说,USB CDC协议中文版提供了详细的技术规范和操作指南,为USB设备的通信实现提供了标准化的方法和约定,促进了不同品牌和类型设备之间的互联互通。这对于USB设备的开发、集成和兼容性提供了重要的参考,有助于推动USB接口技术的发展和应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值