USB设备编程(一)

目录

前言

USB系统硬件框架和软件框架

1.实验现象

2.硬件框架

3.软件框架

USB电气信号

1.USB设备状态切换图

2.硬件线路

3.电子信号

4.低速/全速信号电平

5.高速信号电平

6.设备连接与断开

(1) 连接

(2) 断开

7.复位 

8.设备速率识别

(1) 低速/全速

(3) 高速

9.数据信号 

(1) 低速/全速的 SOP 和 EOP

(2) 高速的 SOP(了解即可)

(3) NRZI 与位填充

USB协议层数据格式

1.硬件拓扑结构

2.协议层

3.字节/位传输顺序

4.SYNC 域

5.包格式

(1) PID域

(2) 令牌包(Token)

(3) 数据包

(4) 握手包

6.传输细节

(1) 传输(Transfer)和事务(Transaction)

(2) 过程(stage)和阶段(phase)

(3) 批量传输

(4) 中断传输

(5) 实时传输

(6) 控制传输

(7) 使用工具体验数据格式


前言

USB 本身是一个很庞大、复杂的体系。本文的目的在于:能理解 USB 的一些概念,能使用 USB 传输数据。由于知识点较多,所以分成两个博客讲,本文讲原理,后面会教大家移植USBX并改造成虚拟串口来使用

在学习之前,先记住几个术语,这在后面的代码会经常看到
HCD(Host Controller Driver)主机控制器驱动程序
DCD(Device Controller Driver)设备控制器驱动程序
PCD(Low layer USB Peripheral Control Driver)底层USB外设控制驱动程序
CDC(Communication Device Class)通信设备类


USB系统硬件框架和软件框架

1.实验现象

现象:把 USB 设备比如 Android 手机接到 PC
① 右下角弹出"发现 android phone"
② 跳出一个对话框,提示你安装驱动程序

问 1:USB 设备插到电脑上去,接触到的对方设备是什么?
答 1:是 USB 控制器,是 USB 控制器内嵌的 root hub

问 2. 既然还没有"驱动程序",为何能知道是"android phone"?
答 2. windows 里已经有了 USB 的总线驱动程序,接入 USB 设备后,是"总线驱动程序"知道你是"android phone"、提示你安装的是"设备驱动程序"。USB 总线驱动程序负责:识别 USB 设备, 给 USB 设备找到对应的驱动程序

问 3. 为什么一接入 USB 设备,PC 机就能发现它?
答 3. PC 的 USB 口内部,D- 和 D+ 接有 15K 的下拉电阻,未接 USB 设备时为低电平。USB设备的 USB 口内部,D- 或 D+ 接有 1.5K 的上拉电阻;它一接入 PC,就会把 PC USB 口的 D- 或D+ 拉高,从硬件的角度通知 PC 有新设备接入。

问 4. USB 设备种类非常多,为什么一接入电脑,就能识别出来它的种类?
答 4. PC 和 USB 设备都得遵守一些规范。比如:USB 设备接入电脑后,PC 机会发出"你是什么"?USB 设备就必须回答"我是 xxx", 并且回答的格式是固定的。USB 总线驱动程序会发出某些命令想获取设备信息(描述符),USB 设备必须返回"描述符"给 PC。

问 5. PC 机上接有非常多的 USB 设备,怎么分辨它们?
答 5. 每一个 USB 设备接入 PC 时,USB 总线驱动程序都会给它分配一个编号。PC 机想访问某个 USB 设备时,发出的命令都含有对应的编号(地址)。

问 6. USB 设备刚接入 PC 时,还没有编号;那么 PC 怎么把"分配的编号"告诉它?
答 6. 新接入的 USB 设备的默认编号是 0,在未分配新编号前,PC 使用 0 编号和它通信。(也就是说,如果同时有多个 USB 设备接入PC,那么PC只能先给一个设备编号,因为默认只能使用编号0

2.硬件框架

在 USB 系统中,有 2 个硬件概念:
① USB Host:它跟处理器相连,处理器通过 USB Host 跟各类 USB 设备通信。USB Host 中集成有一个 root hub
② USB Device:这分为两类设备
        a. Hub:用来扩展 USB 接口
        b. Function:就是普通的 USB 设备,比如 U 盘、声卡等

3.软件框架

APP 可以通过 USB 设备驱动程序访问 USB 设备,也可以绕过 USB 设备驱动,直接通过 USB 控制器驱动访问 USB 设备。 


USB电气信号

1.USB设备状态切换图

        USB 2.0 协议支持 3 种速率:低速(Low Speed,1.5Mbps)、全速(Full Speed, 12Mbps)、高速(High Speed, 480Mbps)。
        USB Hub、USB 设备,也分为低速、全速、高速三种类型。一个 USB 设备,可能兼容低速、全速,可能兼容全速、高速,但是不会同时兼容低速、高速。

2.硬件线路

下图是兼容高速模式的 USB 收发器电路图:

USB 连接涉及 Hub Port 和 USB 设备,硬件连接如下: 

注意:对于USB设备,上拉电阻有可能接在D+,也有可能接在D-,根据这个来区分UBS设备支持那种速率。 对于全速和高速设备,上拉电阻接在D+,低速设备上拉电阻接在D-。

当有USB设备接入Hub,设备里的上拉电阻会导致Hub某个引脚的电平发生变化,Hub检测电平跳变是否有设备插入。

3.电子信号

        USB 连接线有 4 条:5V、D+、D-、GND。数据线 D+、D-,只能表示 4 种状态。USB 协议中,很巧妙地使用这两条线路实现了空闲(Idle)、开始(SOP)、传输数据(Data)、结束(EOP)等功能。

4.低速/全速信号电平

注意:看上图虚线部分,对于不同速率的设备,J状态和K状态的差分信号不同。J/K状态只是差分信号的别名而已。

5.高速信号电平


6.设备连接与断开

(1) 连接

        Hub 端口的 D+ 、D- 都有 15K 的下拉电阻,平时为低电平。全速设备内部的 D+ 有 1.5K 的上拉电阻,低速设备内部的 D- 有 1.5K 的上拉电阻,连接到 Hub 后会导致 Hub 的 D+ 或 D- 电平变化,Hub 根据变化的引脚分辨接进来的是全速设备还是低速设备。
        高速设备一开始也是作为全速设备被识别的。
        全速设备、高速设备连接时,D+引脚的电平由低变高:

        低速设备连接时,D-引脚的电平由低变高:

(2) 断开

        对于低速、全速设备,接到 Hub 时导致 D- 或 D+ 引脚变为高电平,断开设备后,D- 或 D+ 引脚变为低电平:

         对于高速设备,它先作为全速设备被识别出来,然后再被识别为高速设备。工作于高速模式时,D+的上拉电阻是断开的,所以对于工作于高速模式的 USB 设备,无法通过 D+的引脚电平变化监测到它已经断开。
        工作于高速模式的设备,D+、D-两边有 45 欧姆的下拉电阻,用来消除反射信号:

        当断开高速设备后,Hub 发出信号,得到的反射信号无法衰减,Hub 监测到这些信号后就知道高速设备已经断开,内部电路图如下:

7.复位 

        从状态切换图上看,一个 USB 设备连接后,它将会被供电,然后被复位。当软件出错时,我们也可以发出复位信号重新驱动设备。
        那么,USB Hub 端口或 USB 控制器端口如何发出复位信号?发出 SE0 信号,并维持至少10ms。
        USB 设备看到 Reset 信号后,需要准备接收"SetAddress()"请求;如果它不能回应这个请求,就是"不能识别的设备"。

8.设备速率识别

(1) 低速/全速

        Hub 端口的 D+、D-都有 15K 的下拉电阻,平时为低电平。全速设备内部的 D+有 1.5K 的上拉电阻,低速设备内部的 D-有 1.5K 的上拉电阻,连接到 Hub 后会导致 Hub 的 D+或 D-电平变化,Hub 根据变化的引脚分辨接进来的是全速设备还是低速设备。

(3) 高速

        高速设备必定兼容全速模式,所以高速设备内部 D+也有 1.5K 的上拉电阻,只不过这个电阻是可以断开的:工作于高速模式时要断开它。 

高速设备首先作为全速设备被识别出来,然后 Hub 如何确定它是否支持高速模式?
Hub 端口如何监测一个新插入的 USB 设备能否工作于高速模式?流程如下:

① 对于低速设备,Hub 端口不会监测它能否工作于高速模式。低速设备不能兼容高速模式。
② Hub 端口发出 SE0 信号,这就是复位信号
③ USB 设备监测到 SE0 信号后,会发出"a high-speed detection handshake"信号表示自己能支        持高速模式,这可以细分为一下 3 种情景:
        a. 如果 USB 设备原来处于"suspend"状态,它检测到 SE0 信号后,就发出"a high-speed detection handshake"信号。
        b. 如果 USB 设备原来处于"non-suspend"状态,并且处于全速模式,它检测到 SE0 信号后,就发出"a high-speed detection handshake"信号。这个情景,就是一个设备刚插到 Hub 端口时的情况,它一开始工作于全速模式。
        c. 如果 USB 设备原来处于"non-suspend"状态,并且处于高速模式,它会切换回到全速模式(重新连接 D+的上拉电阻),然后发出"a high-speed detection handshake"信号。

"a high-speed detection handshake"信号,就是"高速设备监测握手信号",既然是握手信号,自然是有来有回:
① USB 设备维持 D+的上拉电阻,发出"Chirp K "信号,表示自己能支持高速模式
② 如果 Hub 没监测到"Chirp K "信号,它就知道这个设备不支持高速模式
③ 如果 Hub 监测到"Chirp K "信号后,如果 Hub 能支持高速模式,就发出一系列的 "Chirp K " 、 "Chirp J"信号,这是用来通知 USB 设备:Hub 也能支持高速模式。发出一系列的"Chirp  K "、 "Chirp J"信号后,Hub 继续维持 SE0 信号直到 10ms。
④ USB 设备发出"Chirp K "信号后,就等待 Hub 回应一系列的"Chirp K"、"Chirp J"信号
        a.收到一系列的"Chirp K"、"Chirp J"信号:USB 设备端口 D+的上拉电阻,使能高速模式
        b. 没有收到一系列的"Chirp K"、"Chirp J"信号:USB 设备转入全速模式

9.数据信号 

(1) 低速/全速的 SOP 和 EOP

        SOP:Start Of Packet,Hub 驱动 D+、D-这两条线路从 Idle 状态变为 K 状态。SOP 中的 K 状态就是 SYNC 信号的第 1 位数据,SYNC 格式为 3 对 KJ 外加 2 个 K。
        EOP:End Of Packet,由数据的发送方发出EOP,数据发送方驱动D+、D-这两条线路,先设为 SE0 状态并维持 2 位时间,再设置为 J 状态并维持 1 位时间,最后 D+、D-变为高阻状态,这时由线路的上下拉电阻使得总线进入 Idle 状态。

(2) 高速的 SOP(了解即可)

        高速模式中,Ide 状态为:D+、D-接地。SOP 格式为:从 Idle 状态切换为 K 状态。SOP 中的 K 状态就是 SYNC 信号的第 1 位数据。
        高速模式中的 SYNC 格式为:KJKJKJKJ KJKJKJKJ KJKJKJKJ KJKJKJKK,即 15 对 KJ,外加 2 个 K。

(3) NRZI 与位填充

参考文章:USB 的 NRZI 信号格式, https://zhuanlan.zhihu.com/p/460018993
NRZI:Non Return Zero Inverted Code,反向不归零编码。NRZI 的编码方位为:对于数据 0,波形翻转;对于数据 1,波形不变。

        使用 NRZI,发送端可以很巧妙地把"时钟频率"告诉接收端:只要传输连续的数据 0 即可。在下图中,低速/全速协议中"Sync Pattern"的原始数据是"00000001",接收端从前面的 7 个 0 波形就可以算出"时钟频率"。

        使用 NRZI 时,如果传输的数据总是"1",会导致波形维持不变。如果电平长时间维持不变,比如传输 100 位 1 时,如果接收方稍有偏差,就可能认为接收到了 99 位 1、101 位1。
        而 USB 中采用了 Bit-Stuffing 位填充处理,即在连续发送 6 个 1 后面会插入 1 个 0,强制翻转发送信号,从而让接收方调整频率,同步接收。而接收方在接收时只要接收到连续的 6 个 1 后,直接将后面的 0 删除即可恢复数据的原貌。 


USB协议层数据格式

1.硬件拓扑结构

compound device :多个设备组合起来,通过 HUB 跟 Host 相连 
composite device :一个物理设备有多个逻辑设备(multiple interfaces)

物理设备:指的是实际连接到计算机或其他主机设备上的USB硬件设备,比如USB闪存驱动器、打印机、键盘、鼠标等。
逻辑设备:是指在一个物理USB设备内部,可以独立运行和管理的多个功能模块或接口。每个逻辑设备可以执行不同的功能,并在系统中表现为独立的设备。
例如,一个USB打印机可能内部有多个逻辑设备:
        打印功能:作为打印机的主要功能。
        扫描功能:如果打印机是多功能设备,还可能包括扫描功能。
        传真功能:如果打印机还具备传真功能。

在软件开发过程中,我们可以忽略 Hub 的存在,硬件拓扑图简化如下:

一个物理设备里面可能有多个逻辑设备,Hos 可以外接多个逻辑设备,硬件拓扑图如下:

2.协议层

要理解协议层、理解数据如何传输,带着这几个问题:
① 如何寻址设备?
② 如何表示数据方向(读、还是写)
③ 如何确认结果? 

提前罗列出答案:
① USB 系统是一个 Host 对应多个设备,要传输数据首先要通知设备:
        发出 IN 令牌包:表示想读数据,里面含有设备地址
        发出 OUT 令牌包:表示想写数据,里面含有设备地址
② 数据阶段:
        Host 想读数据:前面发出 IN 令牌包后,现在读取数据包
        Host 想发出数据:前面发出 OUT 令牌包后,现在发出数据包
③ 结果如何?有握手包
        Host 想读数据,设备可能未就绪,就会回应 NAK 包
        Host 想写数据,它发出数据后,设备正确接收了,就回复 ACK 包

3.字节/位传输顺序

        先传输最低位(LSB)。在后续文档中,描述数据时按照传输顺序从左到右列出来。

4.SYNC 域

        Host 发出 SOP 信号后,就会发出 SYNC 信号:它是一系列的、最大传输频率的脉冲,接收方使用它来同步数据。
对于低速/全速设备,SYNC信号是8位数据(从左到右是00000001);
对于高速设备,SYNC信号是32位数据(从左到右是00000000000000000000000000000001)。使用 NRZI 编码时,前面每个"0"都对应一个跳变。
        有时把 SOP 和 SYNC 统一称为"SYNC",它的意思是"SYNC"中含有"SOP"。

5.包格式

USB 总线上传输的数据以包为单位。USB 包里含有哪些内容("")? 
SOP:用来表示包的起始
SYNC:用来同步时钟
PID:表示包的类型
④ 地址:在 USB 硬件体系中,一个 Host 对应多个 Logical Device,那么 Host 发出的包,如何确定发给谁?
        a. 发给所有设备:包里不含有设备地址
        b. 发给某个设备:包里含有设备地址、端点号
⑤ 帧号、数据等跟 PID 相关的内容
⑥ CRC 校验码

        发起一次完整的传输,可能涉及多个包。那么,第 1 个包里含有设备地址、端点号,后续的包就没必要包含设备地址、端点号。

(1) PID域

注意:所有的 USB 文档提到的"输入"、"输出",都是基于 Host 的角度,"输出"表示从Host 输出到设备,"输入"表示 Host 从设备得到数据。

有哪些 USB 包?
根据包数据里的 PID 的 bit1, bit0 可以分为 4 类:
① 令牌包(Token):01B(表示二进制)
② 数据包(Data):11B
③ 握手包(Handshake):10B
④ 特殊包(Special):00B

PID 有 4 位,使用 bit1,bit0 确定分类,使用 bit3,bit2 进一步细分。

在 USB 包中,PID 域使用 8 位来表示,格式如下:

        前 4 位表示 PID,后 4 位是对应位的取反。接收方发现后 4 位不是前 4 位的取反的话,就认为发生了错误。 

(2) 令牌包(Token)

        令牌类的 PID,起"通知作用",通知谁?SOF 令牌包被用来通知所有设备,OUT/IN/SETUP 令牌包被用来通知某个设备。
        对于 OUT、IN、SETUP 令牌包,它们都是要通知到具体的设备,格式如下:

USB 设备的地址有 7 位,格式如下:

USB 设备的端点号有 4 位,格式如下:

        对于 SOF 包,英文名为"Start-of-Frame marker and frame number"。对于 USB 全速设备,Host 每 1ms 产生一个帧;对于高速设备,每 125us 产生一个微帧,1 帧里有 8 个微帧。Host 会对当前帧号进行累加计数,在每帧或每微帧开始时,通过 SOF 令牌包发送帧号。对于高速设备,每 1 毫秒里有 8 个微帧,这 8 个微帧的帧号是一样的,每 125us 发送一个SOF 令牌包。
        SOF 令牌包格式如下:

(3) 数据包

        Host 使用 OUT、IN、SETUP 来通知设备:我要传输数据了。数据通过"数据包"进行传输。
        数据包也有 4 种类型:DATA0、DATA1、DATA2、MDATA。其中 DATA2、MDATA 在高速设备中使用。对软件开发人员来说,我们暂时仅需了解 DATA0、DATA1

为什么要引入 DATA0、DATA1 这些不同类型的数据包?
        为了纠错。Host 和设备都会维护自己的数据包切换机制,当数据包成功发送或者接收时,数据包类型切换。当检测到对方使用的数据包类型不对时,USB 系统认为发生了错误。
        比如:
① Host 发送 DATA0 给设备,设备返回 ACK 表示成功接收,设备期待下一个数据是 DATA1
② 但是 Host 没有接收到 ACK,Host 认为数据没有发送成功,Host 继续使用 DATA0 发送上一次  的数据
③ 设备再次接收到 DATA0 数据包,它就知道:哦,这是重传的数据包

数据包格式如下:

(4) 握手包

        握手包有 4 类:ACK、NAK、STALL、NYET
① ACK:数据接收方用来回复发送方,表示正确接收到了数据并且有足够的空间保存数据。
② NAK:Host 发送数据给设备时,设备可以回应 NAK 表示"我还没准备好,没办法接收数据"; Host 想读取设备的数据时,设备可以回复 NAK 表示"我没有数据给你"。
③ STALL:表示发生了错误,比如设备无法执行这个请求(不支持该断点等待)、端点已经挂起。设备返回 STALL 后,需要主机进行干预才能接触 STALL 状态。
④ NYET:仅适用于高速设备。Host 可以发出 PING 包用来确认设备有数据,设备可以回应NYET表示"还没呢"。Hub 也可以回应 NYET 表示低速/全速传输还没完结。

6.传输细节

(1) 传输(Transfer)和事务(Transaction)

        USB 传输的基本单位是包(Packet),包的类型由 PID 表示。一个单纯的包,是无法传输完整的数据。

为什么?
        
比如想输出数据,可以发出 OUT 令牌包,OUT 令牌包可以指定目的地。
但是数据如何传输呢?
        
还需要发出 DATA0 或 DATA1 数据包。设备收到数据后,还要回复一个 ACK 握手包。
        所以,完整的数据传输,需要涉及多个包:令牌包、数据包、握手包。这个完整的数据传输过程,被称为事务(Transaction)

        有些事务需要握手包,有些事务不需要握手包,有些事务可以传输很大的数据,有些事务只能传输小量数据。
        有四类事务
① 批量事务:用来传输大量的数据,数据的正确性有保证,时效没有保证。
② 中断事务:用来传输周期性的、小量的数据,数据的正确性和时效都有保证。
③ 实时事务:用来传输实时数据,数据的正确性没有保证,时效有保证。
④ 建立事务:跟批量事务类似,只不过令牌包是 SETUP 令牌包。

        有四类传输(Transfer)
① 批量传输:就是使用批量事务实现数据传输,比如 U 盘。
② 中断传输:就是使用中断事务实现数据传输,比如鼠标。
③ 实时传输:就是使用实时事务实现数据传输,比如摄像头。
④ 控制传输:由建立事务、批量事务组成,所有的 USB 设备都必须支持控制传输,用于"识别/枚举"

        暂时记住这个关系:
① BIT 组成域(Field)
② 域组成包(Packet)
③ 包组成事务(Transaction)
④ 事务组成传输(Transfer)

(2) 过程(stage)和阶段(phase)

        事务由多个包组成,比如 Host 要发送数据给设备,这就会涉及很多个包:
① Host 发出 OUT 令牌包,表示要发数据给哪个设备
② Host 发出 DATA0 数据包
③ 设备收到数据后,回应 ACK 包

        这个完整的事务涉及 3 个包(Packet),分为 3 个阶段(Phase):
① 令牌阶段(Token phase):由令牌包实现
② 数据阶段(Data phase):由数据包实现
③ 握手阶段(Handshake phase):由握手包实现

        事务由包组成,这些包分别处于 3 个阶段(phase):令牌阶段,数据阶段,握手阶段。
        对于批量传输、中断传输、实时传输,它们分别由一个事务组成,不再细分为若干个过程。

        但是控制传输由多个事务组成,这些事务分别处于 3 个过程:建立过程(stage)、数据过程(stage)、状态过程(stage)。

        总结起来就是:
① 控制传输由多个过程(stage)组成,每个过程由一个事务来实现
② 每个事务由多个阶段(phase)组成,每个阶段有一个包来实现

(3) 批量传输

        批量传输用批量事务来实现,用于传输大量的数据,数据的正确性有保证,时效没有保证。
        批量事务由 3 个阶段(phase)组成:令牌阶段、数据阶段、握手阶段。每个阶段都是一个完整的包,含有 SOP、SYNC、PID、EOP。
        下图中各个矩形框就对应一个完整的包。

示例:

(4) 中断传输

        中断传输用中断事务来实现,用于传输小量的、周期性的数据,数据的正确性和时效都有保证。
        中断事务由 3 个阶段(phase)组成:令牌阶段、数据阶段、握手阶段。每个阶段都是一个完整的包,含有 SOP、SYNC、PID、EOP。
        下图中各个矩形框就对应一个完整的包。

        中断事务跟批量事务非常类似,Host 使用它来周期性地读数据、写数据。 
        以鼠标为例,我们需要及时获得鼠标的数据,不及时的话你会感觉鼠标很迟钝。但是USB 协议中并没有中断功能,它使用"周期性的读、写"来实现及时性。具体过程如下:
① Host 每隔 n 毫秒发出一个 IN 令牌包
② 鼠标有数据的话,发出 DATA0 或 DATA1 数据包给 Host;鼠标没有数据的话,发出 NAK 给Host。

        中断事务的优先级比批量事务更高,它要求实时性,而批量事务不要求实时性。

(5) 实时传输

        实时传输用实时事务来实现,用于传输实时数据,对数据的正确性没有要求。
        实时事务由 2 个阶段(phase)组成:令牌阶段、数据阶段。每个阶段都是一个完整的包,含有 SOP、SYNC、PID、EOP。
        实时事务不需要握手阶段,一个示例的场景是:为了传输摄像头的实时数据,偶尔的数据错误是可以忍受的,大不了出现短暂的花屏。如果为了解决花屏而重传数据,那就会导致后续画面被推迟,实时性无法得到保证。
        下图中各个矩形框就对应一个完整的包。

        实时事务跟中断事务非常类似,Host 也会周期性的发起实时事务,主要区别在于: 
① 实时事务不要求准确性,没有握手阶段
② 实时事务传输的数据量比较大,中断事务传输的数据量比较小

(6) 控制传输

        在使用批量传输时,使用 IN 令牌包或 OUT 令牌包表示数据传输方向。

控制传输的令牌包永远是 SETUP,怎么分辨是读数据,还是写数据?
        发出 SETUP 令牌包后,还要发出 DATA0 数据包,根据数据的内容来确定后续是读数据,还是写数据。这个过程称为"建立事务"(SETUP Transaction)

        但是控制传输由多个事务组成,这些事务分别处于 3 个过程:建立过程(stage)、数据过程(stage)、状态过程(stage)。
① 建立过程(stage),使用 SETUP 事务:Host 发出 SETUP 令牌包、DATA0 数据包、得到 ACK握手包
② 数据过程(stage),使用批量事务:
        a. 对于输出:Host 发出 OUT 令牌包,发出 DATA0、DATA1 数据包、得到 ACK 握手包
        b. 对于输入:Host 发出 IN 令牌包,读到 DATA0、DATA1 数据包、发出 ACK 握手包
③ 状态过程(stage),使用批量事务:
        a. 对于输出:Host 发出 IN 令牌包,读到 DATA1 数据包,发出 ACK 握手包
        b. 对于输入:Host 发出 OUT 令牌包,发出 DATA1 数据包,等待 ACK 握手包

        上图中的每一个方框,都是一个完整的事务,含有:Token Packet、Data Packet、Handshake Packet。

(7) 使用工具体验数据格式

        LeCroy(力科)成立于 1964 年,是一家专业生产示波器厂家。旗下生产有数字示波器、SDA 系列数字示波器、混合信号示波器、模块化仪器、任意波形发生器。
        可以在搜索引擎里搜"usbprotocolsuite"。安装"usbprotocolsuite"后,可以在文档目录里找打很多示程序(后缀名为 usb):

使用"usbprotocolsuite"打开这些文件,即可体验 USB 数据传输:


后面会讲USB描述符等相关知识,这也是Host能识别不同USB硬件的核心,再教大家移植USBX实现虚拟串口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sakabu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值