USB设备

张开发
2026/4/20 3:18:55 15 分钟阅读

分享文章

USB设备
学习笔记-----USB相关基础 Date2026/4/18 PS一些关于USB2.0的学习笔记 VersionFirst published date 2025.4.18PC如何识别USB设备根据电气状态进行识别USB接口的数据线D和D-上在主机端有下拉电阻保持低电平而设备端有上拉电阻设备插入后会强制拉高一条数据线主机通过识别这个型号进行判断。对于USB设备的传输速度信息主机通过被拉高的信号线是哪根进行判断D-被拉高说明是一个低速设备D被拉高说明是一个全速设备进一步的如果设备和主机都支持2.0标准那么它们通过后续的握手信号切换到高速模式全速设别识别如下所示Host或者Hub端的两根信号线都被下拉电阻拉到低而全速设备的D有上拉接入后拉高整条线同理的低速设备识别如第二张图。对于高速设备要多出一个步骤在检测设备为全速设备后hub端口发出一个复位信号设备的回复中会包含自己是否支持高速模式的信息。硬件层面的握手结束后进行软件层面的枚举过程首先默认分配为地址0进行通信依次读取设备中存储的各种描述符USB设备的电气结构下图是USB2.0官方文档中的USB设备状态轮转图一个USB设备的从插入到被识别运行的整个过程都包含在下图中从USB设备插入Attached开始USB hub识别到插入并对其供电也就是进入Powered状态然后Hub对其发出标准的复位信号Reset从而使其进入Default状态进一步就是地址的设置Address Assigned然后就可以通过驱动程序进行Device Configured下图是通过D和D-两根信号线表示的信号逻辑两条信号线通过差分分别表示出Differential“1”和Differential“0”两种状态进一步又定义出J和K状态可以看到低速和全速设备的J和K状态是相反的低速设备的J状态是差分0全速设备的J状态是差分1这也是由于两种设备的上拉电阻不在同一根信号线上的原因。这里又定义了一个SOP信号也就是包开始信号——数据线从IDLE状态跳变为K状态。同样的SYNC同步信号也可以通过JK状态来组成根据文档SYNC是通过3组KJ信号以及2个K信号组成的The SYNC pattern used for low-/full-speed transmission is required to be 3 KJ pairs followed by 2 K’s for a total of eight symbols.数据的编码格式NRZIUSB使用的是反向不归零编码如下图需要注意的是USB虽然用了4根线但是是没有时钟线的因此需要同步就需要按一定的速度发出同步信号也就是上面说的SYNC然后双方就可以知道数据的发送周期就和串口的波特率一样在一定的时间进行采样读取就能知道传输的是1还是0。那么在NRZI编码下如果信号和之前相比没有发生变化表示我在这一个信号周期内传输的是1反之传输的是0那么就有一个问题如果我要传输非常多的1信号线就一直不变了导致长时间的信号线上无跳变而NRZI正是通过信号跳变来传输信息的因此就引入了bit stuffing方法进行位填充每6个1后强制插入一个0如下图需要注意的是位填充是在原始数据上进行的在NRZI编码之前。USB协议层事务-包-域首先是一个USB系统的物理拓扑结构如下图在上面已经说过了向设备发送任何数据前都需要进行一个SYNC同步然后才是具体的内容具体内容的第一个就是PID,PID决定了这个数据包的类型一个PID由8位组成其中4位决定了类型剩下4位用于检验正确性PID类型如下可以看到决定PID类型的4位中bit[0:1]决定了PID type, bit[2:3]决定了PID name进一步决定了这个数据包的作用注意所有的通讯都是由HOST主动发起的那么在PID后就是设备的地址以及端点号最后是校验和CRC。设备的地址和端点分别用了7位和4位。由此就可知host向device发送数据的整体格式,首先发出一个令牌包并且在令牌包中指定了我要发送数据并紧跟着发出一个数据包而device收到了之后返回握手包┌─────────────────────────────────────────────────────────────────────────────────────┐ │ OUT 令牌包 (Token Packet) │ ├─────────┬─────────┬──────────────────────────┬─────────────┬─────────┬─────────────┤ │ SYNC │ PID │ ADDR (7b) │ ENDP (4b) │ CRC5 │ EOP │ │ (8 bit) │ (8 bit) │ 设备地址 0~127 │ 端点号 0~15 │ (5 bit) │ (包结束) │ ├─────────┴─────────┴──────────────────────────┴─────────────┴─────────┴─────────────┤ │ PID 0x87 (OUT) │ └─────────────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ DATA0 数据包 (Data Packet) │ ├─────────┬─────────┬─────────────────────────────────────┬─────────────┬─────────────┤ │ SYNC │ PID │ PAYLOAD │ CRC16 │ EOP │ │ (8 bit) │ (8 bit) │ 0 ~ 1024 字节数据 │ (16 bit) │ (包结束) │ ├─────────┴─────────┴─────────────────────────────────────┴─────────────┴─────────────┤ │ PID 0xC3 (DATA0) 或 0x4B (DATA1) │ └─────────────────────────────────────────────────────────────────────────────────────┘这里引入一个新的概念事务。上述的这个过程就是一个事务Transaction也就是令牌包数据包握手包多个包组成而一个包又有多个域组成比如令牌包就是SOP,PDI,ADDR/EP,CRC,EOP域组成在域中传输的就是一位一位的数据。进一步的可以认为事务有多个阶段phase在令牌phase传输的就是令牌包以此类推。传输Transfer对于一个事务而言他可以实现不同类型的传输也就是传输是由事务组成的而传输的类型和端点的类型相关一共四种分别为批量BULK中断INTERRUPT,同步ISOCHRONOUS和控制CONTROL下面以批量事务为例看一下上面这些概念的关系批量事务批量事务的框图如下对于host想要进行一次批量传输也就是要开启一次批量事务事务就是由令牌包token数据包data握手包handshake组成。上图中的NYET回应和PING包是专门为高速设备提供的。需要注意的是如果数据包在接收时出现了CRC错误或位填充错误是不会有握手包返回的。下图是批量/控制/中断传输中的主机状态机轮转上图可以概括为开始 │ ▼ Do_token ──(发送OUT或SETUP令牌)──▶ Do_data ──(发送数据包)──▶ Wait_resp │ ▼ Wait_for_packet │ (收到包或超时) │ ▼ Packet_ready │ ┌─────────────┬─────────────┬───────────┴───────────┬─────────────┐ ▼ ▼ ▼ ▼ ▼ ACK NAK STALL 超时/错误 (其他) │ │ │ │ ▼ ▼ ▼ ▼ Do_next_cmd Do_same_cmd Do_halt ErrorCount 3 ? │ │ 重试 报错相较于其他三种传输控制传输是由多个事务组成的他最少由两个事务组成建立Setup和状态Status,其中还有可能有一个数据Data。所谓的Setup就是使用上面PID类型中令牌类中的SETUP(1101B)通知设备要开始一个控制传输。而其中的数据包只能是输出或者输入的这是在setup阶段指定的。USB数据包的具体格式下图是一个USB Control Transfer控制传输的具体内容数据来源是力科usb抓包工具的示例文件对应了第二张图的控制传输的整个过程整个Transfer包含了3个Transaction第一个Trasaction是Setup stage其由3个packet组成第二个Trasaction是Data stage这里是输入IN第三个是Status stage,对应了第二张图中的out过程USB设备如何被描述这里主要有几个概念:配置——》接口——》端点配置一个设备可能有多个配置每个配置对应着不同的功能模式。接口一个设备在某一种配置下提供的不同功能这是可以同时存在的。端点usb数据传输的基本对象所有的数据都是在端点之间进行的。那么对于上面三级概念都会有对应的描述符来具体的描述一个设备的所有信息而每种描述符的具体内容都是由USB标准定义的因此设备插入后能够被电脑识别出功能具体的各类描述符的内容可以看USB2.0标准的第9章这是可以同时存在的。端点usb数据传输的基本对象所有的数据都是在端点之间进行的。那么对于上面三级概念都会有对应的描述符来具体的描述一个设备的所有信息而每种描述符的具体内容都是由USB标准定义的因此设备插入后能够被电脑识别出功能具体的各类描述符的内容可以看USB2.0标准的第9章

更多文章