USB 2.0
速度分类
低速:1.5Mb/s(USB 1.0 Low Speed)
全速:12Mb/s(USB 1.0 Full Speed、USB 1.1(即USB 1.0 Full Speed)、USB 2.0 Full Speed(兼容USB 1.1))
高速:480Mb/s(USB 2.0 Hi Speed)
超级速度:5Gb/s(USB 3.0)
......
设备检测
外围设备会通过拉高D+或D-告知主机设备插入
总线电流
完全配置前,允许从总线获取最大100mA电流,完全配置后,最大500mA电流。
总线状态
下图显示了USB低速和全速总线信号1、信号0、SE0状态、SE1状态、J状态、K状态、空闲IDLE状态下D+、D-线分别对应的电平信号范围。
J状态和空闲状态的总线电压一样,不过空闲状态的高电平是上拉电阻控制的,J状态是主机或设备控制的。
low speed和full/high spped J状态 / K状态相反。
枚举
设备插入主机后,主机获取设备信息、设置设备地址的过程叫枚举。
USB枚举过程用的控制传输方式与USB从机的端点0进行通信的。
描述符
设备通过描述符的形式存放设备的信息(设备类型、供应商字符串等)
设备描述符
每一个USB设备只有一个设备描述符,主要向主机说明设备类型、端点0最大包长、设备版本、配置数量等等;
字符串描述符
所有字符串都存储在字符串描述符中,需要哪个字符串,指定其索引即可。
端点描述符
先介绍下什么是端点,端点分为输入端点和输出端点,端点是实现USB设备功能的物理缓冲区实体,USB主机和设备是通过端点进行数据交互的
每个端点都有地址,存储于端点描述符中(bEndpointAddress)
接口描述符
每一个USB配置下至少有一个或者多个接口描述符,接口描述符主要说明设备类型、此接口下使用的端点数(不包括0号号端点),一个接口就是实现一种功能,实现这种功能可能需要端点0就够了,可能还需要其它的端点配合;
接口描述符中的class指定了该接口是什么类型设备,比如音频、打印机等,在 https://www.usb.org/defined-class-codes 有列出已定义的class码
配置描述符
每一个USB设备至少有一个或者多个配置描述符,但是主机同一时间只能选择某一种配置,标准配置描述符主要向主机描述当前配置下的设备属性、所需电流、支持的接口数、配置描述符集合长度等等;
以下是带有鼠标触摸屏的键盘设备
能看出配置描述符的一些特点:
上层描述符如果包含下层描述符,那么下层描述符的实现必须紧挨着上层描述符
一个上层描述符如果包含了多个下层描述符,那多个下层描述符的实现按照顺序紧挨着上层描述符
一个配置描述符中可以有多个接口描述符
一个接口描述符可以包含多个端点描述符
多个接口描述符通过接口关联描述符整合
主机会先读取9字节配置描述符,再根据配置描述符的第三、第四域读取随后的所有描述符(除设备描述符和字符串描述符)
其他描述符
报告描述符(Report Descriptors
):USB设备类可能需要扩展的描述符信息。开发者必须确保USB设备类所需的任何额外描述符信息包含在描述符文件中。例如,对于HID类,开发者必须包括进一步定义设备属性的报告描述符。
传输类型
传输类型在端点描述符中指定
鼠标
音频
U盘
帧和调度
低速和全速USB设备
- 对于低速和全速USB设备,帧周期定义为1毫秒(ms)。在这个时间间隔内,USB总线上的通信被划分为多个微小的时间片,但并不细分为明确的子帧或时隙。
- 每个帧周期以一个Start Of Frame (SOF) 包开始,它包含了帧号,用于同步目的,并标志着新一帧数据传输的开始。
- 在每个帧内,设备可以根据需要发送和接收数据包,这些数据包按照令牌包、数据包和握手包的顺序进行。
中断和同步拥有优先获得传输的资格,如果没有中断和同步,批量占用所有时间片
高速USB设备
- 高速USB设备使用更复杂的帧结构。高速USB总线在一个微帧(microframe)的基础上组织其活动,而1个帧周期包含8个连续的微帧,即每个微帧持续时间为125微秒(μs)。
- 微帧内部进一步划分为若干个时间槽(slots),每个时间槽可以容纳一个或多个数据包的传输。
- 每个微帧的起始位置都有一个专门的时间槽用来发送SOF包(被称为微帧起始包Micro Start of Frame, MSOF),用于高速设备的精确同步。
无论是低速/全速设备还是高速设备,帧周期都是USB总线调度和同步数据传输的基本单位,确保所有连接到总线上的设备能够有序且高效地共享带宽资源。对于高速USB而言,通过将帧细化为微帧并分配时隙,实现了更高的数据传输速率和更精确的时间管理。
事务(transaction)
以传输 10KB 数据块为例,10KB被分到多个事务中传输
一个事务包含几个包
令牌包包括 IN、OUT、SETUP、PING 等。
在USB帧或微帧周期内,数据传输是以令牌包、数据包和握手包的形式进行的。令牌包指示数据传输的方向(IN或OUT)以及目标端点;数据包携带实际的数据内容;而握手包则用来确认数据传输的成功与否。
包是数据传输的最小单位,不能被打断或干扰,否则会引发错误;若干个包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成;一次传输由一次到多次事务传输构成,可以跨帧完成;
包(packet)
包的分类
根据 PID 区分
包的各个域分析
不同类型包详解
主机和设备都可以用ACK来确认,而NAK、STALL、NYET只有设备能够返回,主机不能使用这些握手包。
当主机收到NAK时,知道设备还没有准备好,主机会在以后合适的时机进行重试传输;
NYET只在USB2.0的高速设备输出事务中使用,它表示设备本次数据成功接收,但是没有足够的空间来接收下一次数据。主机在下一次输出数据时,将使用PING令牌包来试探设备是否有空间接收数据,以避免不必要的带宽浪费;
当USB主机或者设备检测到数据出错时(如CRC校验出错、PID校验出错、位填充出错等),将什么都不返回,这时等待接收握手包的一方就会收不到握手包从而等待超时;
PING包:
PING令牌包与OUT令牌包具有一样的结构,但是PING令牌包后并不发送数据,而是等待设备返回ACK或者NAK,以判断设备是否能够传送数据。只有在USB2.0高速环境中才会使用PING令牌包,它只被使用在批量传输和控制传输的输出事务中。直接使用OUT令牌包发送数据时,不管设备是否有空间接收数据,都会在OUT令牌包之后跟着发送一个数据包,如果设备没有空间接收数据,就会返回一个NAK。当设备返回NAK时,数据以及发送出去了,浪费了总线带宽,白白发送了数据,如果在发送数据前先发送一个小包来探测设备是否有空间来接收数据,然后主机再决定是否发送数据,这样就可以提供总线带宽的利用率。因此在高速USB总线中,增加PING机制,主机先用PING令牌包试试设备是否有空间接收数据,而不用事先把数据发送出去。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2018-03-02 Matlab ------ 打开MATLAB,设置默认打开的文件夹