usb 订阅
USB,是英文Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。 展开全文
USB,是英文Universal Serial Bus(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术。
信息
外文名
Universal Serial Bus
外语缩写
USB
推出年代
1994
中文名
通用串行总线
应用领域
计算机领域的接口技术
usb简介
通用串行总线 (Universal Serial Bus,USB) 是一种新兴的并逐渐取代其他接口标准的数据通信方式,由 Intel、Compaq、Digital、IBM、Microsoft、NEC及Northern Telecom 等计算机公司和通信公司于1995年联合制定,并逐渐形成了行业标准。USB 总线作为一种高速串行总线,其极高的传输速度可以满足高速数据传输的应用环境要求,且该总线还兼有供电简单(可总线供电)、安装配置便捷(支持即插即用和热插拔)、 扩展端口简易(通过集线器最多可扩展127 个外设)、传输方式多样化(4 种传输模式),以及兼容良好(产品升级后向下兼容)等优点。 [1]  通用串行总线(universal serial bus,USB)自推出以来,已成功替代串口和并口,成为21世纪大量计算机和智能设备的标准扩展接口和必备接口之一,现已发展到USB 4.0版本。USB 具有传输速度快、使用方便、支持热插拔、连接灵活、独立供电等优点,可以连接键盘、鼠标、大容量存储设备等多种外设,该接口也被广泛用于智能 手机中。计算机等智能设备与外界数据的交互主要以网络和USB接口为主。 [2] 
收起全文
精华内容
下载资源
问答
  • usb 最全封装库(含micro usb)for altium

    热门讨论 2017-12-14 22:52:42
    含micro usb 的最全usb pcb library库,做PCB板工程师最佳选择
  • USB2.0和USB3.0彻底梳理

    千次阅读 2019-03-21 15:20:59
    最近公司有一款产品要用到USB技术,因此我又一次对USB基础知识进行了梳理,只是这一次把这些梳理全部公之于众,希望对大家有帮助,下表是我边查资料边更新,耗费了半天的时间汇总出来的。 USB1.0 ...

            最近公司有一款产品要用到USB技术,因此我又一次对USB基础知识进行了梳理,只是这一次把这些梳理全部公之于众,希望对大家有帮助,下表是我边查资料边更新,耗费了半天的时间汇总出来的。

     

    USB1.0

    (USB2.0低速版本)

    USB1.1

    (USB2.0全速版本)

    USB2.0

    (USB2.0高速版本)

    USB3.0

    (USB3.1 Gen 1)

    (USB3.2 Gen 1)

    USB3.1

    (USB3.1 Gen 2)

    (USB3.2 Gen 2)

    USB3.2

    (USB3.2 Gen 3)

    发布时间

    1995年

    1998年

    2000年

    2008年

    2013年

    2018年

    信号定义

    4条信号线:

    电源、地线、2条数据线(一对差分信号线)

    4条信号线:

    电源、地线、2条数据线(一对差分信号线)

    4条信号线:

    电源、地线、2条数据线(一对差分信号线)

    4条原有线(电源、地线、2条数据线)用于兼容老版本的USB;4条新增的线(一对差分输入线和一对差分输出线)用于提高速率

    4条原有线(电源、地线、2条数据线)用于兼容老版本的USB;4条新增的线(一对差分输入线和一对差分输出线)用于提高速率

    --

    传输速率

    1.5Mbps,即0.1875MB/s

    12Mbps,即1.5MB/s

    480Mbps,即60MB/s

    5GMbs

    10GMbs

    20GMbs

    /全双工

    半双工

    半双工

    半双工

    全双工

    全双工

    全双工

    采用该接口的设备

    鼠标;键盘

    鼠标;键盘;打印机

    打印机;

    大容量存储器

    大容量存储器

    大容量存储器;影音设备;

     

    供电

    5V/100mA

    5V/500mA

    5V/100mA

    5V/500mA

    5V/0.5A

    5V/0.9A

    20V/5A,即100w

     

    编码方式

    8bit/8bit

    8bit/8bit

    8bit/8bit

    8bit/10bit

    128bit/132bit

     

    采用的接口类型

     

     

     

     

     

     

    【几点说明】

    1、USB-IF公布了最新的USB命名规范,原来的USB 3.0和USB 3.1将会不再被命名,所有的USB标准都将被叫做USB 3.2,当然考虑到兼容性,USB 3.0至USB 3.2分别被叫做USB 3.2 Gen 1、USB 3.2 Gen 2、USB 3.2 Gen 2x2。至于为什么USB 3.2被叫做USB 3.2 Gen 2x2,原因是它使用了上下所有的数据针脚,让数据速度能够加倍。

    2、USB 3.2仍然采用SuperSpeed USB层数据速率和编码技术,这点和USB 3.1并没有区别;不过USB 3.2标准却对集线器规范进行更新,支持主机设备和外设在单通道和双通道之间无缝切换。

    3、USB 3.2支持多通道操作,使用USB 3.2主机连接USB 3.2存储设备时,最高可以实现2GB/s的数据传输速率。不过就目前情况来看,目前只有使用USB-C线缆(通过USB SuperSpeed 10Gbps USB 3.1 认证)时才支持该极限速度。由此看来USB 3.2更像是把两条独立的USB 3.1通道合并,从而对单向传输速率进行了翻倍,原理类似于Thunderbolt 1向Thunderbolt 2进化的过程;至于频宽和数据传输效率的改进则暂时没有提到。

     

    【心得感悟】

    USB1.1没有搞死USB1.0,USB2.0没有搞死USB1.1,USB3.0没有搞死USB2.0,USB3.1也没有搞死USB3.0,如今USB3.2也出来了,它们都活的好好的,只不过它们都活在各自的土地上,它们是一个家族,祖孙六代同堂,统治着各种各样的电子产品。实际上,虽然PC端的USB HOST已经逐步更新到USB3.1,但是基于USB1.0和USB1.1的设备(比如键盘、鼠标和游戏手柄)都还能活很久,因为孕育它们的土壤依然存在。

    谈到土壤,我不得不简单回顾一下USB的历史,USB因什么而生。雷军说,小米为发烧而生,那么USB为什么而生呢?

    答案是:USB是为当下而生。

    为什么USB协议会不断更新,不断升级,为什么不能一步到位呢?因为时代背景限制了USB协议的能达到的高度。它必须在时代发展的大潮下推动着前进。

    一方面,早期的接口不具备即插即用的功能,要使用某个接口,就必须通过系统重启的方式对它们进行初始化,这种局面毫无疑问急需打破;另一方面,计算机的发展推动了周边设备的发展,比如打印机、扫描仪、传真机等,而这些设备早期与电脑通信是通过其他接口进行的,这些接口必须在电脑启动之前就连接好,否则无法使用。况且很多厂商都定义自己的接口,导致接口类型五花八门,性能参差不齐,这为电子设备的普及带来了巨大的障碍。

    基于这方面的原因,一个对电子领域影响深远的组织就成立了,这就是USB-IF,就是它发明了USB,也就是USB的出现,电子设备的通信接口才被统一了,这是一个伟大的壮举,英雄的壮举,因为它为电子设备的飞速发展清扫了一个大的障碍。

     

    【写在最后】

    还没有到最后,我会在研发空余时间持续更新这篇文档的内容,请大家耐心等待。

    展开全文
  • 适用于安装win7系统后USB3.0无效的情况,在WIN8/10 PE下运行此工具可为已安装的win7系统加入USB3.0驱动
  • C#编写的USB通信实例(含源码)

    热门讨论 2018-04-03 21:16:16
    本资源是使用C#和DotNetUSBLib开发的USB通信实例程序,使用VS2015+Devexpress编写,可以结合我的相关博文进行学习实验
  • USB_HID协议中文版_USB接口HID设备.pdf

    热门讨论 2016-08-09 16:27:28
    USB HID开发必备的资料,包括底层固件的枚举描述符配置,上位机HID设备枚举、查找、连接及通讯
  • usb2.0_ser!_USB转串口的驱动程序,win10、win8、win7驱动程序。 usb2.0_ser!_USB转串口的驱动程序
  • 原版windows7集成usb3.0驱动+NVME补丁+uefi引导支持.iso
  • VC++ USB及串口通信工程源码

    热门讨论 2016-04-12 11:25:46
    本资源满足了广大需求者进行VC++ USB及串口通信开发的需求,使其无需再花费大量时间进行资料、例程查找,并免去了调试及解决疑难问题的麻烦。参照本资源,开发者可以很快地实现VC++ 的USB及串口同步、异步通信。
  • usb-blaster驱动

    千次下载 热门讨论 2015-10-29 18:42:30
    适用于win7/8/8.1/10的usb-blaster驱动,亲测可用
  • 串口转USB驱动 win7 64位。2015年10月12日已测试在win7 64位下可用。在添加驱动时,需要手工选择该驱动。
  • 高通HS-USB驱动 2.1.0.3,Qualcomm HS-USB Driver,QDLoader 9008

    千次下载 热门讨论 2015-03-28 17:15:46
    高通平台手机 Modem、网络、调试COM口 ...驱动版本 2.1.0.3 是目前最新版本的驱动了,支持如下 Qualcomm HS-USB QDLoader 9008 Qualcomm HS-USB Diagnostics Qualcomm HS-USB NMEA 等等很多高通平台手机调试所需的驱动
  • USB转串口驱动 Silicon Labs CP210x USB to UART Bridge VERSION:6.7.2.200 DATE:2015/11/20
  • USB Dongle驱动

    热门讨论 2015-05-21 22:32:02
    BLE开发中用到的USB Dongle驱动
  • USB协议规范1.1/2.0/3.0 英文高清完整PDF版

    千次下载 热门讨论 2014-10-04 19:12:53
    USB协议规范1.1--支持USB低速和全速规范(12Mbps) USB协议规范2.0--支持USB高速协议规范(480Mbps) USB协议规范3.0--支持USB超高速协议规范(5Gbps) 本资源包括USB 1.1、2.0以及3.0的协议规范文档。随着USB设备的...
  • c# usb-hid通信上位机示例

    热门讨论 2016-03-23 10:13:10
    c# usb-hid通信上位机示例,可以读写USB-hid设备数据,开发环境为vs2010,可以直接运行,有工程源码
  • usb-to-serial-win10

    千次下载 热门讨论 2016-11-27 22:59:58
    PL2303芯片Prolific USB-to-Serial Comm Port,在WIN10下可用的驱动。也有win7和XP的。
  • QT5 下 usb 设备插拔检测

    热门讨论 2015-12-09 18:20:13
    基于QT 5做的usb插拔检测,我主用是用于检测usbkey的(通过 VID,PID),其他设备应该也是可以的,测试过u盘,usb转串口线,usb key都能识别,
  • C# USB HID示例

    千次下载 热门讨论 2014-11-14 00:18:25
    该代码提供简单的获取HID设备,并选择相对应的HID设备进行连接,并接收和输入数据的一个简单案例。适合于对USB HID设备刚入门的学习。其中部分代码参考网友。
  • 该文档包含USB2.0相关的所有协议内容(不包含类协议),文档有USB2.0协议、USB2.0 OTG补充协议、USB2.0电气特性、USB2.0插头尺寸说明等(无分数要求无偿分享,求发扬无偿分享)
  • USBasp驱动 32位和64位,对WIN7,WIN8,WIN10 32位和64位安装有详细的说明!WIN10 64位下写AVR不再犯愁!
  • USB4是什么?与USB 3.2有什么差异?

    千次阅读 2020-08-16 01:24:41
    在了解USB4和USB 3.2之前,需要先梳理一下USB的发展历程。 USB的演变 USB的演变 USB是一种传输数据的协议规范,也是一种接口技术规范。1996年由美国的Intel、微软、康柏、DEC和IBM,日本的NEC,加拿大的北方...

    在了解USB4和USB 3.2之前,需要先梳理一下USB的发展历程。

    USB的演变

    USB的演变

                                                                              

    USB是一种传输数据的协议规范,也是一种接口技术规范。1996年由美国的Intel、微软、康柏、DEC和IBM,日本的NEC,加拿大的北方电信公司等七家业界巨头组成的非盈利组织USB标准化组织(USB Implement Forum,简称USB-IF)推出了USB 1.0,之后推出了速度更快的USB 1.1和USB 2.0。2008年,由Intel,苹果,惠普,微软,瑞萨电子,意法半导体和德州仪器等组成的USB 3.0 Promoter Group行业技术联盟发布了USB 3.0,然后转移给了USB-IF来管理和维护。2013年到2019年之间,Intel等大公司联合的USB 3.0 Promoter Group相继推出了USB 3.1、USB 3.2和USB4协议规范,在USB-IF官网上发布和更新。

    从USB的演变图中可以看出,USB从最开始推出的USB 1.0到USB4共经历了24年。最明显的改进就是带宽的增加,在USB 2.0及之前主要支持低速(1.5Mbps)、高速(12Mbps)和全速(480Mbps)。到了USB 3.0开始进入超速模式,而且每升级一次,带宽就翻倍,从最开始的5Gbps到了现在的40Gbps。

    USB接口按照规范分为USB1.0、USB 1.1、USB2.0、USB 3.0。我们经常说的USB2.0接口和USB 3.0接口就是按照USB规范来分类的。2013年USB 3.0改名为USB 3.1 Gen 1,同时推出了10Gbps带宽的USB 3.1 Gen 2,两者统称为USB 3.1。到了2017年,USB 3.1 Gen 1和USB 3.1 Gen 2分别改名为USB 3.2 Gen 1和USB 3.2 Gen 2。同时加入了带宽为10Gbps的USB 3.2 Gen 1x2和带宽为20Gbps的USB 3.2 Gen 2x2,这4个统称USB 3.2。至此进入了USB 3.2时代,而USB 3.0的名字已经成为历史。总之,USB 2.0还保留着,而USB 3.0现在已经被USB-IF协会改名为USB 3.2 Gen 1了,而且还多了USB 3.2 Gen 2、USB 3.2 Gen 1x2和USB 3.2 Gen 2x2。其中USB 3.2 Gen 1x2和USB 3.2 Gen 2x2表示USB 3.2 Gen 1和USB 3.2 Gen 2的双通道模式,而USB 3.2 Gen 1和USB 3.2 Gen 2是单通道模式。单通道和双通道是什么意思呢?说明之前,来看下面的图。

     

    USB接口按照型号分为Type-A,Type-B和Type-C三种。Standard-A属于Type-A,Micro-B属于Type-B。从上图看出,USB 3.1接口及之前,除了Type-C,还有Type-A和Type-B这两种型号,而到了USB 3.2接口就只支持Type-C了。这就与USB接口的单通道模式和双通道有关,下面进行介绍。

    USB Type-C母座

                                                                     

    上图为USB Type-C母座,共有两个通道,即高速通道0和高速通道1,我们称之为Lane 0 Adapter和Lane 1 Adapter。即通道0适配器和通道1适配器 。这里的适配器可以看成是信号转换器。USB是全双工通信,每一个通道有两个差分对,一个用于发送,一个用于接收。即差分对TX1+和TX1-用于发送数据,差分对RX2+和RX2-用于接收数据,两个差分对组成高速通道0,即Lane 0 Adapter。同理,差分对RX2+和RX2-用于接收数据,差分对TX2+和TX2-用于发送数据,两个差分对组成高速通道1,即Lane 1 Adapter。 与Lane 0 Adapter和Lane 0 Adapter相连的通道称为Lane 0和Lane 1。

    单通道模式

    单通道传输USB 数据

                                                                      

    单通道模式就是只有lane 0和lane 1其中之一来传输USB数据,另一个用作其他用途。比如USB 3.2 Gen 1和USB 3.2 Gen 2,都是通过单通道来传输数据的。其中USB 3.2 Gen 1的传输速度为5Gbps,因为单通道是发送和接收同时进行,所以传输速度指的是发送或者接收中的一个的速度。就拿lane 0来说,有TX1+、TX1-和RX2+、RX2-这两个差分对,lane 0的传输速度指的就是TX1+、TX1-差分通道的速度为5Gbps,或者说是RX2+、RX2-差分通道的速度为5Gbps,用lane 1的传输数据时,速度同理。USB 3.2 Gen 2的传输速度为10Gbps,在USB 3.2 Gen 1基础上翻倍了,其实就是说USB 3.2 Gen 2通过lane 0的发送或者接收的差分通道传输速度翻倍为10Gbps,同理用lane 1传输数据时,发送或者接收的差分通道传输速度也是10Gbps。

    双通道模式

    双通道传输USB数据

                                                                                

    双通道模式就是lane 0和lane 1都用来传输USB数据。比如USB 3.2的USB 3.2 Gen 1x2和USB 3.2 Gen 2x2,USB4的USB4 Gen2x2和USB4 Gen3x2,都是通过双通道来传输数据的。如何判断是单通道模式,还是双通道模式?“Gen”后面数字如果带有“x2”字样就表示双通道模式,如果没有“x2”字样或者写的是"x1"字样,就表示单通道模式。同一个USB版本规范,双通道模式传输速度是单通道传输速度的2倍。比如USB 3.2 Gen 1x2的传输速度是USB 3.2 Gen 1传输速度的两倍,因为USB 3.2 Gen 1传输数据只用了一个5Gps的通道 ,而USB 3.2 Gen 1x2传输数据用了两个5Gps的通道,所以传输速度就变为了10Gbps。单通道传输的USB 3.2 Gen 2 的传输速度是在同样单通道传输的USB 3.2 Gen 1(5Gbps)基础上翻倍了,变成了10Gbps,同理,双通道传输的USB 3.2 Gen 2x2的传输速度自然就变成了USB 3.2 Gen 2的2倍,即20Gbps。USB4的USB4 Gen2x2是双通道传输,维持了USB 3.2 Gen 2x2同样的传输速度20Gbps。USB4的USB4 Gen3x2也是双通道传输,在USB4 Gen2x2基础上翻倍,变成了40Gbps。上面提到过,从USB 3.2开始就只支持USB Type-C接口,而不再支持Type-A和Type-B接口了。这是为什么呢?因为从USB 3.2开始定义了USB数据传输的双通道模式,即两组差分对用来发送,两组差分对用来接收,需要4组差分对,只有USB Type-C接口能提供4组差分线。单通道模式是一组差分对用来发送,一组差分对用来接收。Type-A和Type-B接口只能提供2对差分线,只适用于单通道模式。总之,因为引入了双通道传输USB数据的模式,所以使得USB 3.2及之后的USB4都只能支持USB Type-C接口。

    USB4的诞生

    在介绍USB4之前就不得不提一下Intel和苹果公司合作推出的雷电协议。雷电协议是组合协议,整合了DisplayPort协议(简称DP)和PCI-Express协议(简称PCIe)而成。先后推出了雷电1和雷电2协议,但都反响平平。后来推出了雷电3协议(Thunderbolt 3,简称TBT3),传输速度达到了40Gbps。Intel这次选择将协议交给了USB-IF协会。2019年,USB-IF在USB 3.2的基础上整合了雷电3协议(简称TBT3),推出了USB4 Gen 2x2和USB4 Gen 3x2。这次改名和以往不同的是依然保留了USB 3.2的名字。USB4就是在原先USB 3.2传输速度基础上进行了倍增,达到了40Gbps,也就是USB4 Gen 3x2的速度。USB4同时支持USB 3.2和TBT3的传输。总之,USB4=USB 3.2+TBT3。USB4和USB 3.2一样,也有单通道模式和双通道模式。USB4接口和USB 3.2接口一样,都支持搭载USB PD快充协议。

    USB4的带宽分配

    USB4整合了多个协议,可以同时支持更多设备,其中就涉及到带宽的分配,从下图可以看出USB4最多分配22Gbps的带宽用于数据传输,最少18G的带宽用于支持显示。可以连接一个分辨率为5120x2880(5k),刷新率60Hz,色深30bit的显示器,剩下18Gbps的带宽用于传输数据;也可以连接两个分辨率4096x2160(4k),刷新率60Hz,色深30bit的视频,剩下8Gbps的带宽用于传输数据。

    上面的图片来自英特尔的雷电3官网。

    USB4的应用

    USB4的应用如下:

    1、USB4如果只传输USB 3.2数据,可以占用20Gbps带宽。如果接支持USB 3.2 Gen 2x2的移动硬盘,速度明显会比我们过去用的USB 3.0快很多。

    2、USB4可以输出高清视频和数据,比如可以接双4k 60Hz显示器或单个5k 60Hz显示器,还因为支持PCIe协议,可以外接显卡、固态硬盘,扩展坞等。

    3、USB4高速通道如果只传输视频,可以占用80Gbps的带宽,支持到DP 2.0。可以进行8k 60Hz分辨率,30bit颜色深度的高清显示。

    4、USB4支持USB PD快充,最高可以达到100W功率充电。

    USB4和USB 3.2的差异

    在说明USB4与USB 3.2的差异之前,有必要说明一下DisplayPort通道的定义,和USB通道的定义有所区别,两者不能混淆。下面介绍DisplayPort通道的定义。

    DisplayaPort通道的定义

    前面提到对于USB来说,每一个通道有两个差分对,一个用于发送,一个用于接收。PCIe也一样是全双工通信,会同时发送和接收数据,通道的定义也符合这一点。

    DisplayaPort传输视频对于通道的定义与USB不一样,对于主机来说,因为它只有发送,没有接收,所以每一个通道就是一个差分对。本文为了区分DisplayPort与USB关于通道描述,防止两者混淆,在描述DisplayPort通道时,后面加上括号标注是DP,如2 Lane(DP)。如下图所示,DisplayPort在USB Type-C接口定义上有2 lane(DP)和4 lane(DP)两种情况。

    2 lane DP+USB 3.2

                                                                        

    上图是2 lane(DP)的定义,对于DisplayPort来说,差分对RX2+和RX2-与差分对TX2+和TX2-都是用来发送视频数据的,这点与USB数据的传输不同,所以差分对RX2+和RX2-与差分对TX2+和TX2-分别叫做lane 0(DP)和lane 1(DP)。剩下的差分对TX1+和TX1-与差分对RX1+和RX1-分别用作USB 3.2的发送和接收,称为USB的通道。

    4 lane DP

                                                                                  

    上图是4 lane(DP)的定义,对于DisplayPort来说,差分对RX2+和RX2-与差分对TX2+和TX2-以及差分对TX1+和TX1-与差分对RX1+和RX1-都是用来发送视频数据的,所以它们分别叫做lane 0(DP)、lane 1(DP)、lane 2(DP)和lane3(DP)。

    总之,造成DisplayPort通道的定义和USB以及PCIe对于通道的定义的不相同是有原因的。就是DisplayPort的传输只有一个方向,对于视频源来说是发送,对于显示器来说是接收,所以一个差分对就是一个通道。而USB和PCIe是双向的,既有发送,也有接收,所以一个发送的差分对和一个接收的差分对组成一个通道。

    接下来说USB4和USB 3.2的数据传输。

    USB 3.2数据传输

    现在介绍USB 3.2数据传输方式。USB 3.2的传输模式有两种:

    1、USB 3.2数据和2 Lane(DP)的DP 1.4视频数据同时传输;

    2、4 Lane(DP)的DP 1.4视频数据传输。

    如图,Lane 0 Adapter通道用于传输USB 3.2数据,速度可以选择5Gbps和10Gbps两种。Lane 1 Adapter用于传输2 Lane(DP)的DP 1.4视频数据,可以传输4K 60Hz 30位色深的视频,由于另外2 Lane(DP)用于USB传输,所以这个视频分辨率还不是DP 1.4的最高分辨率。

    如图,Lane 0 Adapter通道和Lane 1 Adapter通道用于传输4 Lane(DP)的DP 1.4视频数据,可以传输的4K 120Hz 30位色深的视频。

    USB4的数据传输

    USB4的传输模式也有两种:

    1、USB4双通道传输USB 3.2、DP 1.4和PCIe 3.0数据;

    2、USB4的雷电3(简称TBT3)模式。

    如图,USB4中Lane 0 Adapter通道和Lane 1 Adapter通道用于传输USB 3.2数据,可以选择5Gbps和10Gbps。同时还传输DP 1.4和PCIe 3.0数据。

     

    如图,是USB4中的雷电3模式(简称TBT3),Lane 0 Adapter通道和Lane 1 Adapter通道用于同时传输DP 1.2和PCIe 3.0数据。

    下面看一下USB4和USB 3.2的差异对比。

    USB4和USB 3.2的对比

                                                                    

    USB 3.2和USB4的对比

    1、传输带宽:USB 3.2最大是20Gbps,而USB4最大是40Gbps。

    2、传输协议:USB 3.2主要通过USB协议传输数据,或者通过DP Alt Mode(替代模式)来配置USB和DP。而USB4通过隧道技术将USB 3.2,DP和PCIe协议封装成数据包,同时发送。

    3、DP的传输:都能支持DP 1.4。USB 3.2通过DP Alt Mode(替代模式)来配置输出;而USB4除了可以通过DP Alt Mode(替代模式)来配置输出,还可以通过USB4隧道协议数据包来提取出DP数据。

    4、PCIe的传输:USB 3.2不支持PCIe,USB4才支持。通过USB4隧道协议数据包来提取出PCIe数据。

    5、TBT3的传输:USB 3.2不支持,USB4是支持的,就是通过USB4隧道协议数据包来提取PCIe和DP数据。

    6、Host to Host:主机和主机之间通信,USB3.2不支持,USB4支持。主要是USB4支持PCIe协议才能支持这个功能。

    注:隧道技术可以看作是将不同协议的数据整合到一起的技术 ,通过数据包头来区分类型。

    USB 3.2中,传输DisplayPort视频和USB 3.2数据是在不同的通道适配器传输的,而在USB4中,DisplayPort视频、USB 3.2数据和PCIe数据是可以在同一个通道传输的,这是两者最大的差异。可以看下图来加深理解。

    上面的图片来自英特尔的雷电3官网。

    USB4通道可以想象成可以通行各种类型车辆的车道,USB数据,DP数据和PCIe数据想象成不同的车。同一个车道有不同的车排成队在有序行驶,USB4同一个通道传输不同类型的数据也是这个原理。USB3.2,DP和PCIe数据先汇聚在一起,通过同一个通道发送出去,到对方的设备,然后再分离出3种不同类型的数据来。

    更多技术分享,请关注微信公众号:流源君

     

    展开全文
  • C#调用、操作usb摄像头

    热门讨论 2015-04-14 18:27:22
    在.net平台下使用C#开发语言调用系统USB摄像头。实现搜索所有摄像头、连接摄像头、拍照、抓拍、图片保存、视频暂停、视频关闭。
  • USB-Serial Controller。USB转串口驱动,2013-10-25最新版本,支持win7/win8,x86/x64。 其官网搜索prolific便是,PL2303最新下载地址如下: http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=225&pcid=41
  • pc与android通过usb socket实现手机通信Demo

    千次下载 热门讨论 2013-08-01 20:02:06
    a.PC客户端与Android服务端的Socket同步通信(USB) b.操作步骤如下: ----------------------------------------------------------- 1.请将测试数据文件夹中的ucliulanqi.apk copy到c:\下进行测试 2. 将android...
  • 圈圈教你玩USB(第二版)

    热门讨论 2016-05-25 11:17:38
    习惯性0分,方便大家学习
  • CubeMX生成的USB Audio Device只支持播放,基于这个工程,修改为USB录音设备,只需要修改一个文件。 CubeMX版本是4.21.0(STM32Cube V1.0),这个关系不大。 CubeMX配置 Pinout 这里没有配置用于连接ADC的IIS和...

    目录

    说明

    CubeMX配置

    Pinout

    Clock Configuration

    Configuration

    工程设置

    代码工程修改

    修改USB设备描述符

    修改数据传输配置

    声卡测试


    说明

    CubeMX生成的USB Audio Device只支持播放,基于这个工程,修改为USB录音设备,只需要修改一个文件。

    CubeMX版本是4.21.0(STM32Cube V1.0),这个关系不大。

    CubeMX配置

    Pinout

    这里没有配置用于连接ADC的IIS和IIC接口,只用于demo,USB声卡最终输出的数据是在程序中指定的。后续可以用IIS和IIC接入ADC芯片,也可以使用STM32本身的AD模块。

    USB部分配置如下图,选择Device Only,然后在MiddleWares中选择Audio Device Class。

    Clock Configuration

    时钟自己生成就行,必须使用外部晶振才可以,在Input frequency中填入实际晶振数值。

    Configuration

    然后进入如下Configuration页面。

    在这个页面,先点击USB_DEVICE Configuration,配置如下。

    然后点击USB_FS,配置如下,没有贴出来的都是默认的。

    工程设置

    点击菜单栏Project,选择Settings,配置如下。

    最后点击如下按钮,生成工程。

    代码工程修改

    修改如下文件,直接用https://download.csdn.net/download/weixin_39228381/12766725中的文件替换即可(文件审核中,目前是404,和用如下代码段内容一致),修改了USB设备描述符和数据传输配置。这里只做一些说明,具体修改内容在附件里。

    /**
      ******************************************************************************
      * @file    usbd_audio.c
      * @author  MCD Application Team
      * @version V2.4.2
      * @date    11-December-2015
      * @brief   This file provides the Audio core functions.
      *
      * @verbatim
      *      
      *          ===================================================================      
      *                                AUDIO Class  Description
      *          ===================================================================
     *           This driver manages the Audio Class 1.0 following the "USB Device Class Definition for
      *           Audio Devices V1.0 Mar 18, 98".
      *           This driver implements the following aspects of the specification:
      *             - Device descriptor management
      *             - Configuration descriptor management
      *             - Standard AC Interface Descriptor management
      *             - 1 Audio Streaming Interface (with single channel, PCM, Stereo mode)
      *             - 1 Audio Streaming Endpoint
      *             - 1 Audio Terminal Input (1 channel)
      *             - Audio Class-Specific AC Interfaces
      *             - Audio Class-Specific AS Interfaces
      *             - AudioControl Requests: only SET_CUR and GET_CUR requests are supported (for Mute)
      *             - Audio Feature Unit (limited to Mute control)
      *             - Audio Synchronization type: Asynchronous
      *             - Single fixed audio sampling rate (configurable in usbd_conf.h file)
      *          The current audio class version supports the following audio features:
      *             - Pulse Coded Modulation (PCM) format
      *             - sampling rate: 48KHz. 
      *             - Bit resolution: 16
      *             - Number of channels: 2
      *             - No volume control
      *             - Mute/Unmute capability
      *             - Asynchronous Endpoints 
      *          
      * @note     In HS mode and when the DMA is used, all variables and data structures
      *           dealing with the DMA during the transaction process should be 32-bit aligned.
      *           
      *      
      *  @endverbatim
      *
      ******************************************************************************
      * @attention
      *
      * <h2><center>&copy; COPYRIGHT 2015 STMicroelectronics</center></h2>
      *
      * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
      * You may not use this file except in compliance with the License.
      * You may obtain a copy of the License at:
      *
      *        http://www.st.com/software_license_agreement_liberty_v2
      *
      * Unless required by applicable law or agreed to in writing, software 
      * distributed under the License is distributed on an "AS IS" BASIS, 
      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      * See the License for the specific language governing permissions and
      * limitations under the License.
      *
      ******************************************************************************
      */ 
    
    /* Includes ------------------------------------------------------------------*/
    #include "usbd_audio.h"
    #include "usbd_desc.h"
    #include "usbd_ctlreq.h"
    
    
    /** @addtogroup STM32_USB_DEVICE_LIBRARY
      * @{
      */
    
    
    /** @defgroup USBD_AUDIO 
      * @brief usbd core module
      * @{
      */ 
    
    /** @defgroup USBD_AUDIO_Private_TypesDefinitions
      * @{
      */ 
    /**
      * @}
      */ 
    
    
    /** @defgroup USBD_AUDIO_Private_Defines
      * @{
      */ 
    
    /**
      * @}
      */ 
    
    
    /** @defgroup USBD_AUDIO_Private_Macros
      * @{
      */ 
    #define AUDIO_SAMPLE_FREQ(frq)      (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16))
    
    #define AUDIO_PACKET_SZE(frq)          (uint8_t)(((frq * 2 * 2)/1000) & 0xFF), \
                                           (uint8_t)((((frq * 2 * 2)/1000) >> 8) & 0xFF)
                                             
    /**
      * @}
      */ 
    
    
    
    
    /** @defgroup USBD_AUDIO_Private_FunctionPrototypes
      * @{
      */
    
    
    static uint8_t  USBD_AUDIO_Init (USBD_HandleTypeDef *pdev, 
                                   uint8_t cfgidx);
    
    static uint8_t  USBD_AUDIO_DeInit (USBD_HandleTypeDef *pdev, 
                                     uint8_t cfgidx);
    
    static uint8_t  USBD_AUDIO_Setup (USBD_HandleTypeDef *pdev, 
                                    USBD_SetupReqTypedef *req);
    
    static uint8_t  *USBD_AUDIO_GetCfgDesc (uint16_t *length);
    
    static uint8_t  *USBD_AUDIO_GetDeviceQualifierDesc (uint16_t *length);
    
    static uint8_t  USBD_AUDIO_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum);
    
    static uint8_t  USBD_AUDIO_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum);
    
    static uint8_t  USBD_AUDIO_EP0_RxReady (USBD_HandleTypeDef *pdev);
    
    static uint8_t  USBD_AUDIO_EP0_TxReady (USBD_HandleTypeDef *pdev);
    
    static uint8_t  USBD_AUDIO_SOF (USBD_HandleTypeDef *pdev);
    
    static uint8_t  USBD_AUDIO_IsoINIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum);
    
    static uint8_t  USBD_AUDIO_IsoOutIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum);
    
    static void AUDIO_REQ_GetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req);
    
    static void AUDIO_REQ_SetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req);
    
    /**
      * @}
      */ 
    
    /** @defgroup USBD_AUDIO_Private_Variables
      * @{
      */ 
    
    USBD_ClassTypeDef  USBD_AUDIO = 
    {
      USBD_AUDIO_Init,
      USBD_AUDIO_DeInit,
      USBD_AUDIO_Setup,
      USBD_AUDIO_EP0_TxReady,  
      USBD_AUDIO_EP0_RxReady,
      USBD_AUDIO_DataIn,
      USBD_AUDIO_DataOut,
      USBD_AUDIO_SOF,
      USBD_AUDIO_IsoINIncomplete,
      USBD_AUDIO_IsoOutIncomplete,      
      USBD_AUDIO_GetCfgDesc,
      USBD_AUDIO_GetCfgDesc, 
      USBD_AUDIO_GetCfgDesc,
      USBD_AUDIO_GetDeviceQualifierDesc,
    };
    
    /* USB AUDIO device Configuration Descriptor */
    __ALIGN_BEGIN static uint8_t USBD_AUDIO_CfgDesc[USB_AUDIO_CONFIG_DESC_SIZ] __ALIGN_END =
    {
      /* Configuration 1 */
      0x09,                                 /* bLength */
      USB_DESC_TYPE_CONFIGURATION,          /* bDescriptorType */
      LOBYTE(USB_AUDIO_CONFIG_DESC_SIZ),    /* wTotalLength  109 bytes*/
      HIBYTE(USB_AUDIO_CONFIG_DESC_SIZ),      
      0x02,                                 /* bNumInterfaces */
      0x01,                                 /* bConfigurationValue */
      0x00,                                 /* iConfiguration */
      0x80,                                 /* bmAttributes  BUS Powred*/ // 0xC0 ---> 0x80
      0x20,                                 /* bMaxPower = 100 mA*/
      /* 09 byte*/
      
      /* USB Speaker Standard interface descriptor */
      AUDIO_INTERFACE_DESC_SIZE,            /* bLength */
      USB_DESC_TYPE_INTERFACE,              /* bDescriptorType */
      0x00,                                 /* bInterfaceNumber */
      0x00,                                 /* bAlternateSetting */
      0x00,                                 /* bNumEndpoints */
      USB_DEVICE_CLASS_AUDIO,               /* bInterfaceClass */
      AUDIO_SUBCLASS_AUDIOCONTROL,          /* bInterfaceSubClass */
      AUDIO_PROTOCOL_UNDEFINED,             /* bInterfaceProtocol */
      0x00,                                 /* iInterface */
      /* 09 byte*/
      
      /* USB Speaker Class-specific AC Interface Descriptor */
      AUDIO_INTERFACE_DESC_SIZE,            /* bLength */
      AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
      AUDIO_CONTROL_HEADER,                 /* bDescriptorSubtype */
      0x00,          /* 1.00 */             /* bcdADC */
      0x01,
      0x27,                                 /* wTotalLength = 39*/ //²»Í¬111111111111111111111111
      0x00,
      0x01,                                 /* bInCollection */
      0x01,                                 /* baInterfaceNr */
      /* 09 byte*/
      
      /* USB Speaker Input Terminal Descriptor */
      AUDIO_INPUT_TERMINAL_DESC_SIZE,       /* bLength */
      AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
      AUDIO_CONTROL_INPUT_TERMINAL,         /* bDescriptorSubtype */
      0x01,                                 /* bTerminalID */
      0x01,                                 /* wTerminalType AUDIO_TERMINAL_USB_STREAMING   0x0101 */
      0x02,                                 // 0x01 ---> 0x02
      0x00,                                 /* bAssocTerminal */
      0x01,                                 /* bNrChannels */
      0x00,                                 /* wChannelConfig 0x0000  Mono */ //ÐèÒª¸Ä³Éstereo111111111111111111111111111
      0x00,
      0x00,                                 /* iChannelNames */
      0x00,                                 /* iTerminal */
      /* 12 byte*/
      
      /* USB Speaker Audio Feature Unit Descriptor */
      0x09,                                 /* bLength */
      AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
      AUDIO_CONTROL_OUTPUT_TERMINAL,           /* bDescriptorSubtype */ //6 ---> 3
      AUDIO_OUT_STREAMING_CTRL,             /* bUnitID */
      0x01,                                 /* bSourceID */
      0x01,                                 /* bControlSize */
      0,// |AUDIO_CONTROL_VOLUME, /* bmaControls(0) */
      1,                                    /* bmaControls(1) */
      0,                                 /* iTerminal */
      /* 09 byte*/
      
      /*USB Speaker Output Terminal Descriptor */
      0x09,      /* bLength */
      0x04,      /* bDescriptorType */
      0x01,        /* bDescriptorSubtype */
      0x00,                                 /* bTerminalID */
      0x00,                                 /* wTerminalType  0x0301*/
      0x01,
      0x02,                                 /* bAssocTerminal */
      0x00,                                 /* bSourceID */
      0x00,                                 /* iTerminal */
      /* 09 byte*/
      
      /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwith */
      /* Interface 1, Alternate Setting 0                                             */
      AUDIO_INTERFACE_DESC_SIZE,  /* bLength */
      USB_DESC_TYPE_INTERFACE,        /* bDescriptorType */
      0x01,                                 /* bInterfaceNumber */
      0x01,                                 /* bAlternateSetting */
      0x01,                                 /* bNumEndpoints */
      USB_DEVICE_CLASS_AUDIO,               /* bInterfaceClass */
      AUDIO_SUBCLASS_AUDIOSTREAMING,        /* bInterfaceSubClass */
      AUDIO_PROTOCOL_UNDEFINED,             /* bInterfaceProtocol */
      0x00,                                 /* iInterface */
      /* 09 byte*/
      
      /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Operational */
      /* Interface 1, Alternate Setting 1                                           */
      7,  /* bLength */
      0x24,        /* bDescriptorType */
      0x01,                                 /* bInterfaceNumber */
      0x02,                                 /* bAlternateSetting */
      0x01,                                 /* bNumEndpoints */
      1,               /* bInterfaceClass */
      0,        /* bInterfaceSubClass */
      /* 07 byte*/
      
      /* USB Speaker Audio Type III Format Interface Descriptor */
      0x0B,                                 /* bLength */
      AUDIO_INTERFACE_DESCRIPTOR_TYPE,      /* bDescriptorType */
      AUDIO_STREAMING_FORMAT_TYPE,          /* bDescriptorSubtype */
      0x01,                /* bFormatType */ 
      0x01,                                 /* bNrChannels */
      0x02,                                 /* bSubFrameSize :  2 Bytes per frame (16bits) */
      0x10,                                   /* bBitResolution (16-bits per sample) */ 
      0x01,                                 /* bSamFreqType only one frequency supported */ 
      AUDIO_SAMPLE_FREQ(USBD_AUDIO_FREQ),         /* Audio sampling frequency coded on 3 bytes */
      /* 11 byte*/
      
      /* Endpoint 1 - Standard Descriptor */
      AUDIO_STANDARD_ENDPOINT_DESC_SIZE,    /* bLength */
      USB_DESC_TYPE_ENDPOINT,               /* bDescriptorType */
      0x81,                         /* bEndpointAddress 1 out endpoint*/
      USBD_EP_TYPE_ISOC,                    /* bmAttributes */
      AUDIO_PACKET_SZE(USBD_AUDIO_FREQ),    /* wMaxPacketSize in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord)) */
      0x01,                                 /* bInterval */
      0x00,                                 /* bRefresh */
      0x00,                                 /* bSynchAddress */
      /* 09 byte*/
      
      /* Endpoint - Audio Streaming Descriptor*/
      AUDIO_STREAMING_ENDPOINT_DESC_SIZE,   /* bLength */
      AUDIO_ENDPOINT_DESCRIPTOR_TYPE,       /* bDescriptorType */
      AUDIO_ENDPOINT_GENERAL,               /* bDescriptor */
      0x80,                                 /* bmAttributes */
      0x00,                                 /* bLockDelayUnits */
      0x00,                                 /* wLockDelay */
      0x00,
      /* 07 byte*/
    } ;
    
    /* USB Standard Device Descriptor */
    __ALIGN_BEGIN static uint8_t USBD_AUDIO_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END=
    {
      USB_LEN_DEV_QUALIFIER_DESC,
      USB_DESC_TYPE_DEVICE_QUALIFIER,
      0x00,
      0x02,
      0x00,
      0x00,
      0x00,
      0x40,
      0x01,
      0x00,
    };
    
    /**
      * @}
      */ 
    
    /** @defgroup USBD_AUDIO_Private_Functions
      * @{
      */ 
    
    /**
      * @brief  USBD_AUDIO_Init
      *         Initialize the AUDIO interface
      * @param  pdev: device instance
      * @param  cfgidx: Configuration index
      * @retval status
      */
    static uint8_t  USBD_AUDIO_Init (USBD_HandleTypeDef *pdev, 
                                   uint8_t cfgidx)
    {
      USBD_AUDIO_HandleTypeDef   *haudio;
      
      USBD_LL_OpenEP(pdev,
                     0x81,
                     USBD_EP_TYPE_ISOC,
                     AUDIO_OUT_PACKET);
    	
      pdev->pClassData = USBD_malloc(sizeof (USBD_AUDIO_HandleTypeDef));
      
      if(pdev->pClassData == NULL)
      {
        return USBD_FAIL; 
      }
      else
      {
        haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData;
        haudio->alt_setting = 0;
        haudio->offset = AUDIO_OFFSET_UNKNOWN;
        haudio->wr_ptr = 0;
        haudio->rd_ptr = 0;
        haudio->rd_enable = 0;
    		
    		int16_t *ps = (int16_t*)haudio->buffer;
    		for(uint16_t i = 0; i < AUDIO_TOTAL_BUF_SIZE / 2; i ++)
    		{
    			ps[i] = i * 10;
    		}
        
        /* Initialize the Audio output Hardware layer */
        /*if (((USBD_AUDIO_ItfTypeDef *)pdev->pUserData)->Init(USBD_AUDIO_FREQ, AUDIO_DEFAULT_VOLUME, 0) != USBD_OK)
        {
          return USBD_FAIL;
        }*/
        
        /* Prepare Out endpoint to receive 1st packet */ 
        /*USBD_LL_PrepareReceive(pdev,
                               0x81,
                               haudio->buffer,                        
                               AUDIO_OUT_PACKET);*/
    		
    		HAL_StatusTypeDef hal_status = HAL_PCD_EP_Transmit(pdev->pData, 0x81, haudio->buffer, AUDIO_OUT_PACKET);
    		printf("HAL_PCD_EP_Transmit returns %d\n", hal_status);
      }
      return USBD_OK;
    }
    
    /**
      * @brief  USBD_AUDIO_Init
      *         DeInitialize the AUDIO layer
      * @param  pdev: device instance
      * @param  cfgidx: Configuration index
      * @retval status
      */
    static uint8_t  USBD_AUDIO_DeInit (USBD_HandleTypeDef *pdev, 
                                     uint8_t cfgidx)
    {
      
      /* Open EP OUT */
      USBD_LL_CloseEP(pdev, 0x81);
      
      return USBD_OK;
    }
    
    /**
      * @brief  USBD_AUDIO_Setup
      *         Handle the AUDIO specific requests
      * @param  pdev: instance
      * @param  req: usb requests
      * @retval status
      */
    static uint8_t  USBD_AUDIO_Setup (USBD_HandleTypeDef *pdev, 
                                    USBD_SetupReqTypedef *req)
    {
      USBD_AUDIO_HandleTypeDef   *haudio;
      uint16_t len;
      uint8_t *pbuf;
      uint8_t ret = USBD_OK;
      haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData;
      
    	printf("%x\n", req->bmRequest & USB_REQ_TYPE_MASK);
      switch (req->bmRequest & USB_REQ_TYPE_MASK)
      {
      case USB_REQ_TYPE_CLASS :  
        switch (req->bRequest)
        {
        case AUDIO_REQ_GET_CUR:
          AUDIO_REQ_GetCurrent(pdev, req);
          break;
          
        case AUDIO_REQ_SET_CUR:
          AUDIO_REQ_SetCurrent(pdev, req);   
          break;
          
        default:
          USBD_CtlError (pdev, req);
          ret = USBD_FAIL; 
        }
        break;
        
      case USB_REQ_TYPE_STANDARD:
    		printf("   %x\n", req->bRequest);
        switch (req->bRequest)
        {
        case USB_REQ_GET_DESCRIPTOR:      
          if( (req->wValue >> 8) == AUDIO_DESCRIPTOR_TYPE)
          {
            pbuf = USBD_AUDIO_CfgDesc + 18;
            len = MIN(USB_AUDIO_DESC_SIZ , req->wLength);
            
            
            USBD_CtlSendData (pdev, 
                              pbuf,
                              len);
          }
          break;
          
        case USB_REQ_GET_INTERFACE :
          USBD_CtlSendData (pdev,
                            (uint8_t *)&(haudio->alt_setting),
                            1);
          break;
          
        case USB_REQ_SET_INTERFACE :
    			printf("		%d %d\n", req->wValue, USBD_MAX_NUM_INTERFACES);
          if ((uint8_t)(req->wValue) <= USBD_MAX_NUM_INTERFACES)
          {
            haudio->alt_setting = (uint8_t)(req->wValue);
          }
          else
          {
            /* Call the error management function (command will be nacked */
            USBD_CtlError (pdev, req);
          }
          break;      
          
        default:
          USBD_CtlError (pdev, req);
          ret = USBD_FAIL;     
        }
      }
      return ret;
    }
    
    
    /**
      * @brief  USBD_AUDIO_GetCfgDesc 
      *         return configuration descriptor
      * @param  speed : current device speed
      * @param  length : pointer data length
      * @retval pointer to descriptor buffer
      */
    static uint8_t  *USBD_AUDIO_GetCfgDesc (uint16_t *length)
    {
      *length = sizeof (USBD_AUDIO_CfgDesc);
      return USBD_AUDIO_CfgDesc;
    }
    
    /**
      * @brief  USBD_AUDIO_DataIn
      *         handle data IN Stage
      * @param  pdev: device instance
      * @param  epnum: endpoint index
      * @retval status
      */
    static uint8_t  USBD_AUDIO_DataIn (USBD_HandleTypeDef *pdev, 
                                  uint8_t epnum)
    {
    
      USBD_AUDIO_HandleTypeDef   *haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData;
    	HAL_PCD_EP_Flush(pdev->pData, 0x81);
    	HAL_PCD_EP_Transmit(pdev->pData, 0x81, haudio->buffer, AUDIO_OUT_PACKET); //buffµÄ´óСÊÇAUDIO_OUT_PACKET * AUDIO_OUT_PACKET_NUM = (48000*2*2/1000) * 80
    	printf("UAIn %d %d %d %d\r\n", AUDIO_OUT_PACKET, ((int16_t*)haudio->buffer)[0], ((int16_t*)haudio->buffer)[1], ((int16_t*)haudio->buffer)[2]);
      return USBD_OK;
    }
    
    /**
      * @brief  USBD_AUDIO_EP0_RxReady
      *         handle EP0 Rx Ready event
      * @param  pdev: device instance
      * @retval status
      */
    static uint8_t  USBD_AUDIO_EP0_RxReady (USBD_HandleTypeDef *pdev)
    {
      /*USBD_AUDIO_HandleTypeDef   *haudio;
      haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData;
      
      if (haudio->control.cmd == AUDIO_REQ_SET_CUR)
      {// In this driver, to simplify code, only SET_CUR request is managed
    
        if (haudio->control.unit == AUDIO_OUT_STREAMING_CTRL)
        {
         ((USBD_AUDIO_ItfTypeDef *)pdev->pUserData)->MuteCtl(haudio->control.data[0]);     
          haudio->control.cmd = 0;
          haudio->control.len = 0;
        }
      } */
    
      return USBD_OK;
    }
    /**
      * @brief  USBD_AUDIO_EP0_TxReady
      *         handle EP0 TRx Ready event
      * @param  pdev: device instance
      * @retval status
      */
    static uint8_t  USBD_AUDIO_EP0_TxReady (USBD_HandleTypeDef *pdev)
    {
      /*USBD_AUDIO_HandleTypeDef   *haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData;
    	printf("USBD_AUDIO_EP0_TxReady %x %x %x\r\n", haudio->control.cmd, haudio->control.len, haudio->control.unit);
    	haudio->control.len = 64;*/
      return USBD_OK;
    }
    /**
      * @brief  USBD_AUDIO_SOF
      *         handle SOF event
      * @param  pdev: device instance
      * @retval status
      */
    static uint8_t  USBD_AUDIO_SOF (USBD_HandleTypeDef *pdev)
    {
      return USBD_OK;
    }
    
    /**
      * @brief  USBD_AUDIO_SOF
      *         handle SOF event
      * @param  pdev: device instance
      * @retval status
      */
    void  USBD_AUDIO_Sync (USBD_HandleTypeDef *pdev, AUDIO_OffsetTypeDef offset)
    {
      int8_t shift = 0;
      USBD_AUDIO_HandleTypeDef   *haudio;
      haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData;
      
      haudio->offset =  offset; 
      
      
      if(haudio->rd_enable == 1)
      {
        haudio->rd_ptr += AUDIO_TOTAL_BUF_SIZE/2;
        
        if (haudio->rd_ptr == AUDIO_TOTAL_BUF_SIZE)
        {
          /* roll back */
          haudio->rd_ptr = 0;
        }
      }
      
      if(haudio->rd_ptr > haudio->wr_ptr)
      {
        if((haudio->rd_ptr - haudio->wr_ptr) < AUDIO_OUT_PACKET)
        {
          shift = -4;
        }
        else if((haudio->rd_ptr - haudio->wr_ptr) > (AUDIO_TOTAL_BUF_SIZE - AUDIO_OUT_PACKET))
        {
          shift = 4;
        }    
    
      }
      else
      {
        if((haudio->wr_ptr - haudio->rd_ptr) < AUDIO_OUT_PACKET)
        {
          shift = 4;
        }
        else if((haudio->wr_ptr - haudio->rd_ptr) > (AUDIO_TOTAL_BUF_SIZE - AUDIO_OUT_PACKET))
        {
          shift = -4;
        }  
      }
    
      if(haudio->offset == AUDIO_OFFSET_FULL)
      {
        ((USBD_AUDIO_ItfTypeDef *)pdev->pUserData)->AudioCmd(&haudio->buffer[0],
                                                             AUDIO_TOTAL_BUF_SIZE/2 - shift,
                                                             AUDIO_CMD_PLAY); 
          haudio->offset = AUDIO_OFFSET_NONE;           
      }
    }
    
    /**
      * @brief  USBD_AUDIO_IsoINIncomplete
      *         handle data ISO IN Incomplete event
      * @param  pdev: device instance
      * @param  epnum: endpoint index
      * @retval status
      */
    static uint8_t  USBD_AUDIO_IsoINIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum)
    {
    
      return USBD_OK;
    }
    /**
      * @brief  USBD_AUDIO_IsoOutIncomplete
      *         handle data ISO OUT Incomplete event
      * @param  pdev: device instance
      * @param  epnum: endpoint index
      * @retval status
      */
    static uint8_t  USBD_AUDIO_IsoOutIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum)
    {
    
      return USBD_OK;
    }
    /**
      * @brief  USBD_AUDIO_DataOut
      *         handle data OUT Stage
      * @param  pdev: device instance
      * @param  epnum: endpoint index
      * @retval status
      */
    static uint8_t  USBD_AUDIO_DataOut (USBD_HandleTypeDef *pdev, 
                                  uint8_t epnum)
    {  
      return USBD_OK;
    }
    
    /**
      * @brief  AUDIO_Req_GetCurrent
      *         Handles the GET_CUR Audio control request.
      * @param  pdev: instance
      * @param  req: setup class request
      * @retval status
      */
    static void AUDIO_REQ_GetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
    {  
      USBD_AUDIO_HandleTypeDef   *haudio;
      haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData;
      
      memset(haudio->control.data, 0, 64);
      /* Send the current mute state */
      USBD_CtlSendData (pdev, 
                        haudio->control.data,
                        req->wLength);
    }
    
    /**
      * @brief  AUDIO_Req_SetCurrent
      *         Handles the SET_CUR Audio control request.
      * @param  pdev: instance
      * @param  req: setup class request
      * @retval status
      */
    static void AUDIO_REQ_SetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
    { 
      USBD_AUDIO_HandleTypeDef   *haudio;
      haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData;
      
      if (req->wLength)
      {
        /* Prepare the reception of the buffer over EP0 */
        USBD_CtlPrepareRx (pdev,
                           haudio->control.data,                                  
                           req->wLength);    
        
        haudio->control.cmd = AUDIO_REQ_SET_CUR;     /* Set the request value */
        haudio->control.len = req->wLength;          /* Set the request data length */
        haudio->control.unit = HIBYTE(req->wIndex);  /* Set the request target unit */
      }
    }
    
    
    /**
    * @brief  DeviceQualifierDescriptor 
    *         return Device Qualifier descriptor
    * @param  length : pointer data length
    * @retval pointer to descriptor buffer
    */
    static uint8_t  *USBD_AUDIO_GetDeviceQualifierDesc (uint16_t *length)
    {
      *length = sizeof (USBD_AUDIO_DeviceQualifierDesc);
      return USBD_AUDIO_DeviceQualifierDesc;
    }
    
    /**
    * @brief  USBD_AUDIO_RegisterInterface
    * @param  fops: Audio interface callback
    * @retval status
    */
    uint8_t  USBD_AUDIO_RegisterInterface  (USBD_HandleTypeDef   *pdev, 
                                            USBD_AUDIO_ItfTypeDef *fops)
    {
      if(fops != NULL)
      {
        pdev->pUserData= fops;
      }
      return 0;
    }
    /**
      * @}
      */ 
    
    
    /**
      * @}
      */ 
    
    
    /**
      * @}
      */ 
    
    /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
    

    修改USB设备描述符

    这部分内容参考了别的项目,具体差异可在附件中查看,结构体名称是USBD_AUDIO_CfgDesc。

    注意:每次修改后,最好都吧windows设备管理器中STM32 Audio的声卡驱动卸载,然后从新安装,否则很多配置无法生效。

    修改数据传输配置

    修改USBD_AUDIO_Init,把PC到STM32的数据传输节点改为STM32到PC的数据传输节点,并在这个函数中吧buffer初始化为固定的数据(仅用于demo)。

    修改USBD_AUDIO_DeInit,也是修改数据传输节点。

    无需修改USBD_AUDIO_Setup,只是加了些日志。

    无需修改USBD_AUDIO_GetCfgDesc

    修改USBD_AUDIO_DataIn这里DataIn是指PC接收数据,需要调用HAL_PCD_EP_Flush和HAL_PCD_EP_Transmit两个函数,如果真的有数据才调用第二个函数,这里没有做判断是否有数据,只用于demo。

    修改USBD_AUDIO_EP0_RxReady,这各函数是PC给STM32传数据时才有用,这里直接return就行。

    修改USBD_AUDIO_EP0_TxReady,这个函数目前也是空的,可以不使用。

    修改USBD_AUDIO_DataOut这里DataOut是指PC输出数据,不改也没关系,为节省代码空间直接清空。

    其余的函数都没有改动。

    声卡测试

    进入属性,修改级别为10左右(另一个项目的声卡不受级别的影响,目前没找到解决方案。另外本声卡在Linux&Android平台,不会有这个级别的影响,说明和Windows的驱动有关)。

    录制到的数据符合预期,只是在STM32程序中的数据基础上做了一个增益,如果在Linux&Android平台录制,则和原始数据一致。这里原始数据就是0 10 20 30 40 ... 1910 0 10 20的循环,即一个三角波。

    展开全文
  • C#写的读取USB HID设备的测试软件

    热门讨论 2015-07-17 13:05:33
    是用C#写的读取USB HID设备的测试软件,输入VID、PIV,查找HID设备是否存在,如果存在,则读取指定的HID设备发来的数据。软件已测试,可以直接使用。(不可读取键盘、鼠标),只能读取自定义HID设备,同时可以自定义...
  • STM32F10X开发板中有个USB上位机工具很有用,可以直接与下位机HID设备进行通讯,类似于串口调试助手,但没有源代码。在csdn上找了好几个,下载后发现有点号称与呀呀类似,但实际与呀呀有很大的不同,尤其是不能自动...
  • USB协议入门

    千次阅读 2020-06-15 15:27:46
    文章目录USB是什么USB解决什么问题USB-OTGUSB的特点USB的拓扑结构USB的电气特性USB的插入检测机制USB描述符USB设备的枚举过程USB包结构和传输过程包的结构包的分类令牌包数据包握手包特殊包USB的四种传输类型USB事务...

    USB是什么

    • 说法一:you sb,你是沙雕
    • 说法二:美国USA的弟弟USB
    • 说法三:通用串行总线(universal serial bus)

    USB解决什么问题

    简化PC与外围设备的连接,增加易用性

    因为外围设备是各种各样的,所以的PC有很多种接口,比如早期键盘鼠标的PS/2,9针串口,23针并口,DVI,VGA,RJ45,RJ11,HDMI,SATA,PCIE等等,很多接口还是不支持热拔插的

    在比较老的PC中,连接外围设备时,要断电,甚至要打开机箱,而且因为接口的不同,想要支持这些外围设备,主板就得做各种接口出来,非常的麻烦

    如果能够实现一种统一的接口,主板上不需要做N种接口就能接入任何外围设备,而且支持热拔插,传输速度也很快,那无疑是帮大忙了

    USB是基于此而实现,支持即插即用(plug and play),并且支持热拔插(hot plug)

    USB-OTG

    由于USB是主从模式,只能由主机发起通信,从机响应,因而两个主机或者两个从机是无法通信的,因此提出了OTG(on to go),同一个设备,在不同场合下,可以在主从之间切换

    USB的特点

    • USB1.0和USB1.1版本中,支持低速(1.5Mbps)和全速(12Mbps)
    • USB2.0加入高速模式(480Mbps),高速模式是可选的,不一定所有USB芯片都支持
    • USB3.0(5.0Gbps)

    注:bps是每秒多少位

    USB的拓扑结构

    USB是主从机构,主机叫host,从机叫device
    一个主机具有一个或者多个USB主控制器(host controller)和根集线器(root hub)
    主控制器负责数据处理,根集线器提供一个连接主控制器与设备的接口和通路
    USB集线器(usb hub)对原有的USB口在数量上扩展,但是并不增加带宽,每一个usb集线器下,又可以接入新的USB集线器,因此可以层层拓展,但是总数是有限制的

    通常情况下,一个PC具有多个主控制器,每个主控制器下面有一个根集线器,根集线器下通常具有1-N个USB口,如果希望插入的几个USB设备具有较大的传输速度,可以考虑连接到不同的USB主控上

    USB的电气特性

    标准USB是四线:5V电源VCC,地GND,差分数据线正D+,差分数据线D-
    OTG中多一根线(ID),用于身份识别,判断是主还是从

    USB2.0的三种传输速度:低速(1.5Mpbs)、全速(12Mpbs)、高速(480Mpbs)

    USB数据的编码:NRZI,数据为0时,电平翻转;数据为1时,电平不翻转

    位填充:根据上述,可能存在长时间电平不变化的情况,因此数据出现连续6个1时,强制插入一个0后编码发送,在接收端,需要检测并去掉这个0,才能恢复数据

    USB的插入检测机制

    主机端:D+和D-分别接15K电阻下地,当悬空时保持为低电平
    从机端:D+或D-接1.5K电阻上拉,具体接到D+还是D-,由速度决定

    全速&高速:D+
    低速:D-

    因此从机接入到主机后,主机端的集线器能检测到D+或D-的电平出现变化,随后报告给USB主控制器

    USB描述符

    USB主机如何知道一个设备的功能、行为呢,需要通过描述符实现,描述符中记录了设备的类型、厂商ID、产品ID、端点情况、版本号等众多信息

    qualifier descriptor 和 other speed configuration descriptor 以及一些特殊的描述符不做介绍

    如果有特殊描述符,它跟在相应接口描述符之后

    • 设备描述符:Device descriptor
      一个USB设备只有一个设备描述符,设备描述符里决定了该设备有多少在种配置,每种配置都对应一个配置描述符
      设备描述符主要记录信息:USB协议版本号、设备类型、端点0的最大包大小、厂商ID、产品ID、设备版本号、厂商字符串、产品字符串、设备序列号、可能的配置数等

    • 配置描述符:configuration descriptor
      每个配置描述符中,定义了该配置里有多少个接口,每个接口对应一个接口描述符
      配置描述符主要记录的信息:配置所含接口数,配置的编号、供电方式、是否支持远程唤醒、电流需求等

    • 接口描述符:interface descriptor
      接口描述符里定义了该接口有多少个端点,每个端点对应一个端点描述符
      接口描述符主要记录的信息:接口的编号、接口的端点数、接口所使用的类、子类、协议

    • 端点描述符:endpoint descriptor
      端点描述符定义了端点的大小、类型等
      端点描述符主要记录的信息:端点号及方向、端点的传输类型、最大包长度、查询时间间隔等

    • 字符串描述符:string descriptor
      提供一些方便人们阅读的信息,它不是必须的

    在主机获取描述符时,首先获取设备描述符,接着获取配置描述符,然后根据配置描述符中的配置集合的总长度,一次将配置描述符、接口描述符、类特殊描述符、端点描述符一次读回,对于字符串描述符则是单独获取的

    USB设备的枚举过程

    枚举:从设备读取各种描述符信息

    USB主机检测到USB设备插入后,进行枚举,根据获取的信息,加载合适的驱动程序

    在设备的枚举过程中,使用控制传输,控制传输分为三个过程:建立过程、可选的数据过程、状态过程

    • 建立过程:它开始于一个setup令牌包,后面紧跟一个data0数据包,后面就是数据过程
    • 数据过程:输入数据或者输出数据,数据过程后是状态过程
    • 状态过程:与数据过程相反,是输出数据或者输入数据,用来确认所有的数据是否都已经正确传输完成

    枚举的详细过程:

    • 主机检测到设备插入,对设备复位
      设备复位后地址为0,主机通过0地址和刚插入的设备通信,主机往0地址的设备的端点0发送获取设备描述符的标准请求(这是一个标准传输的建立过程),设备收到请求后,返回设备描述符给主机(8字节),主机收到设备描述符确认无误后,返回一个0长度的确认数据包给设备,进入设置地址阶段

    • 主机再次对设备复位,设置地址
      再一次复位后,进入设置地址阶段,USB主机往0地址的设备端点0发出一个设置地址的请求(控制传输的建立过程),新的设备地址在建立过程的数据包中,因此没有数据过程,具体的地址由USB主机管理,分配一个唯一的地址给刚接入的设备。USB设备在接收到请求后,就进入状态过程,主机会再次发送一个请求状态返回,这时USB设备返回0长度的状态数据包,主机收到后,经过确认,发送应答包ACK给USB设备,设备收到ACK后,启用新的设备地址

    • 主机再次获得设备描述符
      主机使用新设置的地址访问USB设备,这次获取全部的18字节的设备描述符

    • 主机获取配置描述符
      配置描述符共9个字节,主机获取到配置描述符后,根据配置描述符中所描述的配置集合总长度,获取配置集合。
      配置集合包括配置描述符、接口描述符、类特殊描述符、端点描述符等

    • 获取字符串描述符
      如果有字符串描述符的话,可以获取这个

    USB包结构和传输过程

    包的结构

    USB总线上传输数据是以包为基本单位,一个包被分为不同的域,包的类型不同,包含的域也不同
    包有个共同特点,那就是以同步域开始,紧跟一个包标识符,最终以包结束符来收尾

    • 同步域:用于告诉USB的串行接口引擎数据就要开始传输了,请做好准备,除此之外,同步域还可以用来同步主机端和设备端的数据时钟
    • 包结束符:对于高速设备,用故意的填充错误来表示,此时CRC校验仍然可以通过,因此可以判断是故意的错误填充,而不是数据传输错了;对于全速和低速设备,将D+和D-都保持低电平,时间为2个数据位宽度
    • 包标识符:用来表示一个包的类型,共有8位,只前4位是有效数据,后4位是前4位的取反,用于校验

    包的分类

    包的类型:令牌包(token packet)、数据包(data packet)、握手包(handshake packet)、特殊包(special packet)

    PID类型PID名PID[3:0]说明
    令牌类OUT0001通知设备将要输出数据
    令牌类IN1001通知设备将要输入数据
    令牌类SOF0101通知设备这是一个帧起始包
    令牌类SETUP1101通知设备将要开始一个控制传输
    数据类DATA00011数据包
    数据类DATA11011数据包
    数据类DATA20111数据包
    数据类MDATA1111数据包
    握手类ACK0010确认
    握手类NAK1010不确认
    握手类STALL1110挂起
    握手类NYET0110未准备好
    特殊类PRE1100前导(这是一个令牌包)
    特殊类ERR1100错误(这是一个握手包)
    特殊类SPLIT1000分裂事务(这是一个令牌包)
    特殊类PING0100PING测试(这是一个令牌包)
    特殊类-0000保留

    令牌包

    令牌包用来启动一次USB传输,USB是主从结构,数据传输由主机发起,主机发送一个令牌包,通知哪个设备进行响应,如何响应
    令牌包分四种:输出、输入、建立、帧起始

    • 输出:通知设备将要输出一个数据包
    • 输入:通知设备返回一个数据包
    • 建立:只用在控制传输中,通知设备将要输出一个数据包,但是只是用DATA0数据包,且只能发送到设备的控制端点,设备必须接收
    • 帧起始:在每帧开始时发送,以广播的形式发送,所有USB设备均可接收到

    令牌包结构:

    • OUT、IN、SETUP
      | 同步域 | 8位包标识符PID | 7位地址 | 4位端点号 | 5位CRC校验 | EOP |

    • SOF
      | 同步域 | 8位包标识符PID | 11位帧号 | 5位CRC校验 | EOP |

    数据包

    用来传输数据,数据包都具有同样的结构
    | 同步域 | 8位包标识符PID | 字节0 | 字节1 | … | 字节N | 16位CRC校验 | EOP |

    为什么同样用于传输数据,会有不同类型的数据包,是因为传输错误时需要纠错
    例如:主机向设备发送了一个包,设备接收到并返回确认信号ACK,但是这个ACK在传输过程中受到干扰而损坏,主机无法正确获取ACK,就没办法判断是否传输成功
    解决办法:主机和设备都维护自己的一个数据包类型切换机制,发送或接收成功时切换数据包类型,正常情况下,主机和设备的数据包类型保持一致,如果检测到包的类型不一致,则认为发生了错误,例如当发生上述情况时,主机无法获取ACK导致主机的数据包切换少了一次,下一次获取设备发送的包时,就会检测到包的类型不一致

    握手包

    握手包用来表示一个传输是否被对方确认,握手包只有同步域、PID、EOP,是最简单的一种数据包
    握手包的类型:

    • ACK:正确接收数据,并且有足够的空间来容纳数据,主机和设备都可以用ACK来确认,其它3种只能用于设备返回
    • NAK:没有数据需要返回,或者数据正确但是没有足够的空间容纳,主机接到NAK时,会尝试重传,NAK并不代表数据出错,如果是数据出错,则什么都不会返回,等待方会因获取不到返回而等待超时
    • STALL:设备无法执行这个请求,或端点已被挂起,表示一种错误的状态,需要主机进行干预才能解除
    • NYET:设备本次数据接收成功,但是没有足够的空间容纳下一次数据,主机下一次输出时,应先使用ping试探设备是否有足够空间

    特殊包

    特殊包是一些在特殊场合使用的包,总共4种:PRE、ERR、SPLIT、PING,其中ERR是握手包,其余是令牌包
    特殊包的类型:

    • PRE:通知集线器打开其低速端口的一种前导包,只用于全速模式中,一般情况下,为了防止全速信号使低速设备误动作,集线器不会将全速信号送给低速设备,当收到PRE令牌包时,才会打开低速端口,接着以低速模式给低速设备发送其它包
    • ERR:在分裂事务中表示错误
    • SPLIT:高速事务分裂令牌包,通知集线器将高速数据包转化为全速或低速数据包发送给下面的端口
    • PING:该令牌包不发送数据,而是等待设备返回ACK或NAK,用于判断是否能传输数据,它只用于批量传输和控制传输的输出事务中

    USB的四种传输类型

    虽然已经定义了基本传输单位为包,但是还需要按照一定的关系将不同的包组织成事务才能传输数据

    USB事务

    事务通常由两个或三个包组成:令牌包、数据包、握手包

    • 令牌包:由主机发送,用于启动一个事务
    • 数据包:存放数据,可以由主到从,也可以由从到主,方向由令牌包决定
    • 握手包:由数据接收者发送,将数据接收状态反馈给发送方

    USB协议规定了4中传输类型:批量传输、同步传输、中断传输、控制传输
    其中批量、同步、中断每次传输都是一个事务,而控制包括三个过程,建立和状态过程分别是一个事务,数据过程可能包含多个事务

    批量传输

    批量传输通常用于数据量大、对数据的实时性要求不高的场合,例如USB打印机、扫描仪、大容量存储设备等
    批量传输使用批量事务传输数据,一次批量事务有三个阶段:令牌包阶段、数据包阶段、握手包阶段

    批量输出事务:

    • 主机发送一个OUT令牌包,这个令牌包包含了设备地址、端点号
    • 主机发送一个DATA包,这时指定的设备接收DATA包
    • 主机切换到接收模式,等到设备返回握手包
    • 设备的返回情况
      1. 设备正确接收数据,返回ACK或NYET
      2. 设备没有足够的空间接收,返回NAK
      3. 设备的端点处于挂起状态,返回SALLL
      4. 设备检测到有错误,不返回,让主机等待超时

    批量输入事务:

    • 主机发送一个IN令牌包,这个令牌包包含了设备地址、端点号
    • 主机切换到接收模式,等到设备返回数据包
    • 设备返回的情况
      1. 设备未检测到错误,将数据包放到总线上
      2. 设备没有数据需要返回,则使用NAK握手包响应主机
      3. 设备的端点处于挂起状态,返回SALLL握手包
      4. 设备检测到有错误,不返回,让主机等待超时
    • 主机返回的情况
      1. 主机未检测到错误,使用ACK握手包应答
      2. 主机检测到错误,不做任何响应,让设备检测超时

    PING事务:

    • 主机发出PING令牌包
    • 设备根据情况返回ACK、NAK、STALL握手包

    中断传输

    • 中断传输通常用在数据量不大,但是对时间要求严格的设备中,例如鼠标、键盘等,中断传输也可以用于检测某个标志位,当条件满足时进行批量传输
    • 这里的中断,并不是硬件意义上的中断,而是指由主机按照一定的频率去发出中断传输请求
    • 设备的端点描述符将会报告它的查询间隔,主机会保证在小于这个时间间隔内安排一次中断传输事务
    • 中断传输和批量传输结构上基本一样,只是中断传输没有PING和NYET两种包

    同步传输

    用于数据量大、对实时性要求高的场合,例如音视频设备,但是同步传输不保证数据100%正确,因为它没有应答包

    控制传输

    控制传输分为三个过程:建立过程、可选的数据过程、状态过程

    • 建立过程:建立事务是一个输出数据的过程,令牌包是SETUP,数据包只能是DATA0,握手包为ACK或者不应答
    • 数据过程:数据过程是可选的,也可以没有,如果有的话,可以包含多个方向相同的数据事务,数据过程的第一个包必须是DATA1,正确传输一个包后,进行包类型切换
    • 状态过程:状态过程只使用DATA1包

    端点类型与传输类型的关系

    一个具体的端点,只能工作在一种传输模式下,例如:控制端点、批量端点、中断端点
    端点0是每个USB设备都必须具备的默认控制端点,非0端点要设置后才能使用

    展开全文
  • USB-SERIAL-CH340驱动,解决USB2.0-Ser!

    热门讨论 2014-06-12 09:32:04
    USB-SERIAL-CH340驱动,在win7-x64安装成功,解决USB2.0-Ser!问题。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 407,785
精华内容 163,114
关键字:

usb