前面写了一些SPI/I2C/RS-有朋友留言分享485等文章。USB今天,我们将从系统标准层面进行梳理和总结。看看有没有朋友喜欢。首先从系统层面进行梳理。个人学习习惯于先从整体上触摸一般,然后逐渐深化感兴趣的细节。
USB这是一个复杂的协议栈。如果文章中发现错误,请帮助纠正。
注:本文主要参考USB2.0规范第4章,尽可能清楚地总结标准中的一些重要点。我觉得很多朋友可能对阅读英语标准有点抵触,所以整理这篇文章也是一个原因,希望对朋友有所帮助。
总线拓扑
说到总线拓扑,大家一定看过这张图:
USB标准上说USB总线拓扑是一种,拓扑图延申请的一些要点:
所谓星型是针对的Hub一个Hub下面可以挂Hub或者设备,顶层是USB主机控制器
USB主机控制器通常伴随着根集线器Root Hub。
Hub级联最多5层
总线上最大允许连接127个设备。
Hub级联遵循向下兼容,USB2.0主机或高速Hub可以连接USB1.1Hub。
一个USB分层星型结构,只有一个USB主机控制器
电缆最长不超过5米
这种最大的7层星形结构代表一个USB总线,一个USB分层星型结构,只有一个USB主机控制器,但并不是说一台电脑只有一台USB例如,我的电脑内部有两条总线USB主控制器 Root Hub,从Windows可见设备管理器:
七层拓扑图中的第二层只画了一个Hub,这并不意味着真正的第二层只能有一层Hub,但是这张图不能显示更详细的总线连接关系USBTrace看软件:
第一条总线有4个端口,第二条总线的根集线器有18个端口,其中计算机内部有8、9、10个端口USB设备占用了。我这台笔记本对外有两个USB界面,U盘分别插入这两个端口,然后使用USBTrace可以推断这两个端口都属于第二条总线Port 3以及Port 4:
那么Hub长什么样?比如下面是7口USB Hub来源于示意图USB2.0标准:
物理接口
电气概览
USB 信号和电源通过四线电缆传输。信号发生在每个点对点网段的两条线上。
VBUS/GND:供电
D /D-:USB差分信号线。
有三种数据速率:
高速模式 high-speed:480 Mb/s,常缩写为HS模式
全速模式 full-speed:12 Mb/s,常缩写为FS模式
低速模式 low-speed:1.5 Mb/s,常缩写为LS模式
至于数据编码模式,这里就不管了。
机械概览
机械部分的主要定义USB电缆的颜色定义和线号是什么尺寸的连接器。电缆的抗拉强度等。主要从以下几个方面进行标准化:
主要连接器类型规范,主要分为A、B系列。定义公头、母头。
电缆规范。高速/全速电缆由信号双绞线制成,VBUS、GND 它由整个屏蔽组成。当高速/全速电缆与低速设备一起使用时,电缆必须满足所有低速设备的要求。双绞线不能用于低速设备。双绞线能有效抵抗共模噪声。
机械尺寸及材料要求。
连接器脚号 | 信号名 | 线芯颜色 |
---|---|---|
1 | VBUS | 红色 |
2 | D- | 白色 |
3 | D | 绿色 |
4 | GND | 黑色 |
外壳 | 屏蔽 | 屏蔽层 |
-
A/B系列插座规范
A/B系列插头规范
电缆尺寸材料规范,这里就不罗列了,知道在哪里查就可以了。
电气、机械和环境合规性标准
接地规范,屏蔽层必须焊接在插头的外壳接地。
插座PCB尺寸规格。因此,如果需要绘制连接器,请参考6.9节的尺寸。
Logo位置
线芯颜色规格。
USB Logo尺寸规范。
协议概述
USB采用主从通信模式,是轮询总线。所有数据传输都是由主机控制器启动的。USB这里不总结标准中最难啃的部分。
健壮设计
标准关于协议的健壮性,又称鲁棒性,设计了以下几个方面:
从信号完整性的角度来看:使用差分驱动器、差分接收器和信号电缆的屏蔽处理。差分收发策略在抗共模干扰方面具有显著作用,屏蔽层具有两个作用:一是有效减少USB线通过无线电波干扰外界;二是能有效隔离外界无线干扰USB干扰信号线和电源线。
CRC报纸验证。如果报纸中的数据出现错误,可以检测到并进行相应的处理。
热插拔检测及相应硬件设备的系统配置管理。该设计有助于改善用户体验,用户可以随时插入,而无需关闭插入。
通信自恢复机制是利用对数据丢失或数据损坏的超时检测来实现的,以增强协议的强度。
对流数据进行流量控制,确保硬件缓冲区管理同步和底层收发。
数据管与控制管分离
配置管理
USB支持热插拔。所谓热插拔,就是系统需要正确识别设备的加载驱动程序。断开后,系统需要从软件层面识别到设备已从总线移除。这里所谓的系统可能是带操作系统的计算机,也可能是没有操作系统的嵌入式设备。
例如,以下U盘插入移除过程:
连接检测
所有的USB设备必须通过集线器USB端口连接到总线。从总线拓扑图可以看出,总线上有一个位于金字塔顶部的主控制器。从上图也可以看出,即使在计算机内部USB设备也是通过的Hub当端口连接到总线时,计算机内的许多设备也将被使用USB主线互联,如内置蓝牙设备。
主控制器位于顶部,设备通过集线器端口连接到总线,那么主控制器如何知道设备插入呢?这是因为集线器有报告USB设备在其端口之一上的连接或移除的状态位。主控制器查询集线器检索这些状态位。在设备插入时,主控制器启用端并通过设备的控制管道在默认地址对USB设备进行寻址。主机为设备分配一个唯一的USB地址,然后确定新连接的USB设备是集线器还是功能设备。主机使用分配的USB地址和端点编号0为USB设备建立其控制管道的端点。
如果新连接的USB设备是集线器,如果这个新连接的集线器的端口上有USB 设备,则对每个连接的USB设备执行上述识别操作。
如果连接的USB设备是一个功能设备,则连接通知将由适用于该功能的主机软件处理。如果是基于通用操作系统的计算机系统,则由一般驱动程序处理,如果主机控制器是单片机类嵌入式设备,则由单片机程序负责处理。
断开检测
同样移除时,从标准设计角度来看,也需要考虑两种情况。
如果是设备从集线器移除,集线器会禁用该端口并向主机提供设备移除的指示。然后主机控制器从软件层面做相应的移除处理。
如果是集线器移除,需要从软件层面移除该集线器所有端口的USB设备或级联集线器,当然如果集线器又连集线器,则有点递归的意思。
总线枚举
由于USB允许USB设备随时连接到USB总线或从USB总线断开,因此总线枚举是 USB的持续进行的过程。USB总线枚举还包括移除的检测和处理。
传输模式
。管道Pipe是一个底层软件及硬件逻辑概念,数据就像水一样从管道中的一侧流向另一侧,就对应着主机控制器与设备的两个端点endpoint。endpoint就像管道的两头,也是软件逻辑概念。将主机与设备侧的端点逻辑关联起来,就是所谓的管道了。当然这管道之所以能传输数据,是因为主端、设备端两侧相应的代码配合芯片内部硬件实现的。
数据流经由一侧的端点通过逻辑管道传输到另一侧端点,USB架构包含四种基本类型的数据传输:
控制传输
批量传输
中断传输
同步传输
下表是这四类传输在不同速度模式下支持的最大包长度,放在这里有一个整体概念:
速度模式 | 低速 | 全速 | 高速 |
---|---|---|---|
控制传输 | 8 | 8/16/32/64 | 64 |
同步传输 | 不支持 | 1023 | 1024 |
中断传输 | 0~8 | 0~64 | 0~1024 |
批量传输 | 不支持 | 8/16/32/64 | 512 |
控制传输
控制传输,;并可用于其他设备自定义的传输目的,比如控制设备上的其他管道。
USB系统软件在设备首次连接时使用控制传输进行设备配置。其他驱动程序软件也可以选择以自定义方式使用控制传输。控制传输主要使用管道0,数据传输是无损的。
每个USB设备都必须有控制端点,支持控制传输来进行命令和状态的传输。此外,控制传输是双向传输。
批量传输
批量传输Bulk Transfer就像其名字一样,数据量相对较大,具有突发性。这种突发性可能来源于用户对USB设备的操作,比如对U盘的读写操作就会触发批量传输。批量传输这种突发性也就意味着是非周期性的,一般用于没有实时性要求、数据量比较大设备。比如用于打印机或扫描仪的数据。批量传输数据是连续的。通过在硬件中使用错误检测并采用前面所说的错误重传机制,可以在硬件级别确保可靠的数据交换。此外,大量数据占用的带宽可能会有所不同,具体取决于其他总线活动,这是由主机控制器动态仲裁管理的。
批量传输是单向的,使用单向大容量端点来实现。
中断传输
一般用于需要实时可靠的传输场景。此类数据可随时由设备传输,并以不低于设备指定的速率进行传输。中断数据通常由一个或多个字节的事件通知、字符或坐标组成。比如USB鼠标就是一个采用中断传输的实例。
同步传输
占用预先约定好的USB带宽以及传输延迟,也称为流式实时传输。所需要的带宽以及延迟要求,与特定设备的相关数据吞吐率以及端点的缓冲管理有关,比如用于音频会议USB耳麦,对于音频的采样率是有参数要求的。
带宽分配
USB标准定义了如何允许每种传输类型访问总线的规则。带宽分配主要在从两个方面进行规定:
带宽在管道之间分配。当管道建立时,USB会为一些管道分配带宽。USB底层软硬件需要提供数据缓冲,带宽需求大的场景需要提供更大的缓冲区。
带宽可以在许多不同的数据流之间分配。从而能实现将各种设备连接到USB总线。此外,可以同时支持具有宽动态范围的不同设备比特率需求。所谓宽动态范围是指其带宽需求是随着使用场景在动态变化的。
好了,先总结这么多,继续慢慢啃~。
推荐阅读 点击图片即可跳转
嵌入式入门必看,看看老鸟如何华丽蜕变!(干货分享帖)
C语言如何使用断言避免踩坑
6步!教你写一个mqtt调试助手