USB:Universal Serial Bus(通用串行总线)
USB网络采用阶梯式星形拓扑结构。一个USB网络中只能有一个主机。主机内设置了一个根集线器,提供了主机上的初始附属点。
主机定时对集线器的状态进行查询。当一个新设备接入集线器时,主机会检测到集线器状态改变,主机发出一个命令使该端口有效并对其进行设置。位于这个端口上的设备进行响应,主机收到关于设备的信息,主机的操作系统确定对这个设备使用那种驱动程序,接着设备被分配一个唯一标识的地址,范围从0~127,其中0为所有的设备在没有分配惟一地址时使用的默认地址。主机向它发出内部设置请求。当一个设备从总线上移走时,主机就从其可用资源列表中将这个设备删除。
USB主机
USB的所有数据通信(不论是上行通信还是下行通信)都由USB主机启动,所以USB主机在整个数据传输过程中占据着主导地位。在USB系统中只允许有一个主机。
从开发人员的角度看,USB主机可分为三个不同的功能模块:
- 客户软件
- USB系统软件
- USB总线接口
(1) 客户软件
客户软件负责和USB设备的功能单元进行通信,以实现其特定功能。一般由开发人员自行开发。客户软件不能直接访问USB设备,其与USB设备功能单元的通信必须经过USB系统软件和USB总线接口模块才能实现。客户软件一般包括USB设备驱动程序和界面应用程序两部分。
USB设备驱动程序负责和USB系统软件进行通信。通常,它向USB总线驱动程序发出I/O请求包(IRP)以启动一次USB数据传输。此外,根据数据传输的方向,它还应提供一个或空或满的数据缓冲区以存储这些数据。
界面应用程序负责和USB设备驱动程序进行通信,以控制USB设备。它是最上层的软件,只能看到向USB设备发送的原始数据和从USB设备接收的最终数据。
(2) USB系统软件
USB系统软件负责和USB逻辑设备进行配置通信,并管理客户软件启动的数据传输。USB逻辑设备是程序员与USB设备打交道的部分。USB系统软件一般包括USB总线驱动程序和USB主控制器驱动程序这两部分。这些软件通常由操作系统提供,开发人员不必掌握。
(3) USB总线接口
USB总线接口包括主控制器和根集线器两部分。根集线器为USB系统提供连接起点,用于给USB系统提供一个或多个连接点(端口)。主控制器负责完成主机和USB设备之间数据的实际传输,包括对传输的数据进行串行编解码、差错控制等。该部分与USB系统软件的接口依赖于主控制器的硬件实现,开发人员不必掌握。
USB设备
一个USB设备由三个功能模块组成:USB总线接口、USB逻辑设备和功能单元。这里的USB总线接口指的是USB设备中的串行接口引擎(SIE);USB逻辑设备被USB系统软件看作是一个端点的集合;功能单元被客户软件看作是一个接口的集合。SIE、端点和接口都是USB设备的组成单元。为了更好地描述USB设备的特征,USB提出了设备架构的概念。从这个角度来看,可以认为USB设备是由一些配置、接口和端点组成的,即一个USB设备可以含有一个或多个配置,在每个配置中可含有一个或多个接口,在每个接口中可含有若干个端点。其中,配置和接口是对USB设备功能的抽象,实际的数据传输由端点来完成。在使用USB设备前,必须指明其采用的配置和接口。这个步骤一般是在设备接入主机时设备进行自举时完成的,我们在后面会进一步介绍。USB设备使用各种描述符来说明其设备架构,包括设备描述符、配置描述符、接口描述符、端点描述符以及字符串描述符,它们通常被保存在USB设备的固件程序中。
①设备
设备代表一个USB设备,它由一个或多个配置组成。设备描述符用于说明设备的总体信息,并指明其所含的配置的个数。一个USB设备只能有一个设备描述符。
②配置
一个USB设备可以包含一个或多个配置,如USB设备的低功耗模式和高功耗模式可分别对应一个配置。在使用USB设备前,必须为其选择一个合适的配置。配置描述符用于说明USB设备中各个配置的特性,如配置所含接口的个数等。USB设备的每一个配置都必须有一个配置描述符。
③接口
一个配置可以包含一个或多个接口,如对一个光驱来说,当用于文件传输时使用其大容量存储接口;而当用于播放CD时,使用其音频接口。接口是端点的集合,可以包含一个或多个可替换设置,用户能够在USB处于配置状态时,改变当前接口所含的个数和特性。接口描述符用于说明USB设备中各个接口的特性,如接口所属的设备类及其子类等。USB设备的每个接口都必须有一个接口描述符。
④端点
端点是USB设备中的实际物理单元,USB数据传输就是在主机和USB设备各个端点之间进行的。端点一般由USB接口芯片提供,例如Freescale的MC68HC908JB8。USB设备中的每一个端点都有唯一的端点号,每个端点所支持的数据传输方向一般而言也是确定的:或是输入(IN)或是输出(OUT),也有些芯片提供的端点的数据方向是可以配置的,例如MC68HC908JB8包含有两个用于数据收发的端点:端点1和端点2。其中端点1只能用于数据发送,即支持输入(IN),端点2既能用于数据发送也可用于数据接收,即支持输入(IN)和输出(OUT)操作。需要注意的是,在这里数据的传输方向是站在主机的立场上来看得。比如端点1只能发送数据,在主机看来是端点1向主机输入数据,即IN操作;当端点2配置为接收数据时,主机向端点2输出数据,即OUT操作。这一点是初学者比较容易产生混淆的地方。 利用设备地址、端点号和传输方向就可以指定一个端点,并和它进行通信。 0号端点比较特殊,它有数据输入IN和数据输出OUT两个物理单元,且只能支持控制传输。
⑤字符串
在USB设备中通常还含有字符串描述符,以说明一些专用信息,如制造商的名称、设备的序列号等。它的内容以UNICODE的形式给出,且可以被客户软件所读取。对USB设备来说,字符串描述符是可选的。
⑥管道
在USB系统结构中,可以认为数据传输是在主机软件(USB系统软件或客户软件)和USB设备的各个端点之间直接进行的,它们之间的连接称为管道。管道是在USB设备的配置过程中建立的。管道是对主机和USB设备间通信流的抽象,它表示主机的数据缓冲区和USB设备的端点之间存在着逻辑数据传输,而实际的数据传输是由USB总线接口层来完成的。 管道和USB设备中的端点一一对应。一个USB设备含有多少个端点,其和主机进行通信时就可以使用多少条管道,且端点的类型决定了管道中数据的传输类型,如中断端点对应中断管道,且该管道只能进行中断传输。传输类型在后面会介绍。不论存在着多少条管道,在各个管道中进行的数据传输都是相互独立的。
USB接口
USB使用一根屏蔽的4线电缆与网络上的设备进行互联。数据传输通过一个差分双绞线进行,这两根线分别标为D+和D-,另外两根线是Vcc和Ground,其中Vcc向USB设备供电。使用USB电源的设备称为总线供电设备,而使用自己外部电源的设备叫做自供电设备。为了避免混淆,USB电缆中的线都用不同的颜色标记,如表16-1所示。
引脚编号 |
信号名称 |
缆线颜色 |
1 |
Vcc |
红 |
2 |
Data-(D-) |
白 |
3 |
Data+(D+) |
绿 |
4 |
Ground |
黑 |
从一个设备连回到主机,称为上行连接;从主机到设备的连接,称为下行连接。为了防止回环情况的发生,上行和下行端口使用不同的连接器所以USB在电缆和设备的连接中分别采用了两种类型的连接头,即图16-2所示的A型连接头和B型连接头。每个连接头内的电线号与图16-2的引脚编号是一致的。A型连接头,用于上行连接,即在主机或集线器上有一个A型插座,而在连接到主机或集线器的电缆的一端是A型插头。在USB设备上有B型插座,而B型插头在从主机或集线器接出的下行电缆的一端。采用这种连接方式,可以确保USB设备、主机/集线器和USB电缆始终以正确的方式连接,而不出现电缆接入方式出错,或直接将两个USB设备连接到一起的情况。
差分信号技术特点
传统的传输方式大多使用“正信号”或者“负信号”二进制表达机制,这些信号利用单线传输。用不同的信号电平范围来分别表示1和0,它们之间有一个临界值,如果在数据传输过程中受到中低强度的干扰,高低电平不会突破临界值,那么信号传输可以正常进行。但如果遇到强干扰,高低电平突破临界值,由此造成数据传输出错。差分信号技术最大的特点是:必须使用两条线路才能表达一个比特位,用两条线路传输信号的压差作为判断1还是0的依据。这种做法的优点是具有极强的抗干扰性。倘若遭受外界强烈干扰,两条线路对应的电平同样会出现大幅度提升或降低的情况,但二者的电平改变方向和幅度几乎相同,电压差值就可始终保持相对稳定,因此数据的准确性并不会因干扰噪声而有所降低。
USB通信的格式
USB的数据包使用反向不归零编码(NRZI)。图16-3描述了在USB电缆段上传输信息的步骤。反向不归零编码由传送信息的USB代理程序完成;然后,被编码的数据通过差分驱动器送到USB电缆上;接着,接收器将输入的差分信号进行放大,将其送给解码器。使用该编码和差动信号传输方式可以更好地保证数据的完整性并减少噪声干扰。
使用反向不归零编码方式可以保证数据传输的完整性,而且不要求传输过程中有独立的时钟信号。反向不归零编码不是一个新的编码方式。它在许多方面都有应用。图16-4给出了一个数据流和编码之后的结果。在反向不归零编码时,遇到“0”转换,遇到“1”保持。反向不归零码必须保持与输入数据的同步性,以确保数据采样正确。反向不归零码数据流必须在一个数据窗口被采样,无论前一个位时间是否发生过转换。解码器在每个位时间采样数据以检查是否有转换。
若重复相同的“1”信号一直进入时,就会造成数据长时间无法转换,逐渐的积累,而导致接收器最终丢失同步信号的状况,使得读取的时序会发生严重的错误。因此,在NRZI编码之间,还需执行所谓的位填充的工作。位填充要求数据流中如果有连续的六个“1”就要强行转换。这样接收器在反向不归零码数据流中最多每七个位就检测到一次跳转。这样就保证了接收器与输入数据流保持同步。反向不归零码的发送器要把“0”(填充位)插到数据流中。接收器必须被设计成能够在连续的六个“1”之后识别一个自动跳转,并且立即扔掉这六个“1”之后的“0”位。
图16-5的第一行是送到接收器的原始数据。注意数据流包括连续的八个“1”。第二行表示对原始数据进行了位填充,在原始的第六个和第七个“1”之间填入了一个“0”。第七个“1”延时一个位时间让填充位插入。接收器知道连续六个“1”之后将是一个填充位,所以该位就要被忽略。注意,如果原始数据的第七个位是“0”,填充位也同样插入,在填充过的数据流中就会有两个连续的“0”。
检测设备连接和速度
在USB设备连接时,USB系统能自动检测到这个连接,并识别出其采用的数据传输速率。USB采用在D+或D-线上增加上拉电阻的方法来识别低速和全速设备。USB支持三种类型的传输速率:1.5Mb/s的低速传输、12Mb/s的全速传输和480Mb/s的高速传输。如图16-6和图16-7所示。当主控制器或集线器的下行端口上没有USB设备连接时,其D+和D-线上的下拉电阻使得这两条数据线的电压都是近地的(0V);当全速/低速设备连接以后,电流流过由集线器的下拉电阻和设备在D+/D-的上拉电阻构成的分压器。由于下拉电阻的阻值是15KΩ,上拉电阻的阻值是1.5KΩ,所以在D+/D-线上会出现大小为(Vcc*15/(15+1.5))的直流高电平电压。当USB主机探测到D+/D-线的电压已经接近高电平,而其它的线保持接地时,它就知道全速/低速设备已经连接了。
c
USB的通讯协议
包
包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。USB包由五部分组成,即同步字段(SYNC)、包标识符字段(PID)、数据字段、循环冗余校验字段(CRC)和包结尾字段(EOP),包的基本格式如下图:
同步字段(SYNC) |
PID字段 |
数据字段 |
CRC字段 |
包结尾字段(EOP) |
1、SYNC字段:由8位组成,作为每个数据封包的前导,用来产生同步作用,使USB设备与总线的包传输率同步,它的数值固定为00000001。
2、PID字段:用来表示数据封包的类型。包标识符中的校验字段是通过对类型字段的每个位求反码产生的, PID字段如下图所示:
PID0 |
PID1 |
PID2 |
PID3 |
PID0 |
PID1 |
PID2 |
PID3 |
表16-2中列出了信息包的类型,包括令牌、数据、握手或特殊四种信息包类型。
封包类型 |
PID名称 |
PID编码 |
意义 |
令牌 |
OUT |
0001B |
从主机到设备的数据传输 |
IN |
1001B |
从设备到主机的数据传输 |
|
SOF |
0101B |
帧的起始标记与帧码 |
|
SETUP |
1101B |
从主机到设备。表示要进行控制传输 |
|
数据 |
DATA0 |
0011B |
偶数数据封包 |
DATA1 |
1011B |
奇数数据封包 |
|
握手 |
ACK |
0010B |
接收器收到无错误的数据封包 |
NAK |
1010B |
接收器无法接收数据或发射器无法送出数据 |
|
STALL |
1110B |
端点产生停滞的状况 |
|
特殊 |
PRE |
1100B |
使能下游端口的USB总线的数据传输切换到低速的设备 |
3、数据字段:是用来携带主机与设备之间要传递的信息,其内容和长度根据包标识符、传输类型的不同而各不相同。在USB包中,数据字段可以包含设备地址、端点号、帧序列号以及数据等内容。在总线传输中,总是首先传输字节的最低位,最后传输字节的最高位。
(1) 设备地址(ADDR)数据域 ADDR数据域由7位组成,可用来寻址多达127个外围设备。
(2) 端点(ENDP)数据域 ENDP数据域由4位组成。通过这4个位最多可寻址出32个端点。这个ENDP数据域仅用在IN、OUT与SETUP令牌信息包中。对于慢速设备可支持端点0以及端点1作为中断传输模式,而全速设备则可以拥有16个输入端点(IN)与16个输出端点(OUT)共32个端点。
(3) 帧序列号 当USB令牌包的PID为SOF时,其数据字段必须为11位的帧序列号。帧序列号由主机产生,且每个数据帧自动加一,最大数值为0x7FF。当帧序列号达到最大数时将自动从0开始循环。
(4) 数据 它仅存于DATA信息包内,根据不同的传输类型,拥有不同的字节大小,从0到1023字节(实时传输)。
4、循环冗余码CRC字段由不同数目的位所组成。根据不同的信息包类型,CRC数据域由不同数目的位所组成。其中重要的数据信息包采用CRC16的数据域(16个位),而其余的信息包类型则采用CRC5的数据域(5个位)。其中的循环冗余码校验CRC,是一种错误检测技术。由于数据在传输时,有时候会发生错误,因此CRC可根据数据算出一个校验值,然后依此判断数据的正确性
5、包结尾字段即发送方在包的结尾发出包结尾信号。USB主机根据EOP判断数据包的结束。
信息包格式
1.令牌(token)包 在USB系统中,只有主机才能发出令牌包。令牌包定义了数据传输的类型,它是事务处理的第一阶段。令牌包中较为重要的是SETUP、IN和OUT这三个令牌包。它们用来在根集线器和设备端点之间建立数据传输。一个IN包用来建立一个从设备到根集线器的数据传送,一个OUT包用来建立从根集线器到设备的数据传输。令牌包格式如下:
8位 |
8位 |
7位 |
4位 |
5位 |
|
SYNC |
PID |
PID |
ADDR |
ENDP |
CRC5 |
2.数据(data)包 数据封包含有4个域:SYNC、PID、DATA与CRC16。DATA数据域的位值是根据USB设备的传输速度及传输类型而定,且须以8字节为基本单位。也就是,若传输的数据不足8字节,或传输到最后所剩余的也不足8字节,仍须传输8字节的数据域。格式如下:
8位 |
8位 |
0~1023位 |
16位 |
|
SYNC |
PID |
PID |
DATA |
CRC16 |
3. 握手(Handshake)包 握手信息包是最简单的信息包类型。在这个握手信息包中仅包含一个PID数据域而已,它的格式如下所列:
事务
在USB上数据信息的一次接收或发送的处理过程称为事务处理(Transaction)。事务处理的类型包括输入(IN)事务处理、输出(OUT)事务处理、设置(SETUP)事务处理和帧开始、帧结尾等类型。在输出(OUT)事务处理和设置(SETUP)事务处理中,紧接着SETUP和OUT包后的是DATA包,DATA0和DATA1包是交替地发送的,在DATA包后面,设备将回应一个握手信号,如果设备可以接收数据,就回应ACK包,如果设备忙,就回应NAK包,如果设备出错,则回应STALL包;在IN事务中,IN包后面是设备发来的DATA包或NAK包或STALL包,若设备忙或出错,就发NAK包或STALL包给主机,若设备数据准备好发送,则发DATA包,DATA0和DATA1包也是交替地发送的,紧接着DATA包后面是主机发给设备的握手包,ACK表示主机可以接收数据,NAK包代表主机忙,STALL包代表主机出错。
1.输入(IN)事务处理
①正常的输入事务处理
输入事务处理表示USB主机从总线上的某个USB设备接收一个数据包的过程。 ①正常的输入事务处理
②设备忙时的输入事务处理
③设备出错时的输入事务处理
输出(OUT)事务处理
①正常的输出事务处理
②设备忙时的输出事务处理
③设备出错时的输入事务处理
设置(SETUP)事务处理
①正常的设置事务处理
②设备忙时的设置事务处理
③设备出错时的设置事务处理
USB传输类型
在USB的传输中,制定了4种传输类型:控制传输、中断传输、批量传输以及等时传输。控制传输类型分为2~3个阶段:设置阶段、数据阶段(无数据控制没有此阶段)以及状态阶段。根据数据阶段的数据传输的方向,控制传输又可分为3种类型:控制读取(读取USB描述符)、控制写入(配置USB设备)以及无数据控制。
1.控制传输 控制传输是USB传输中最重要的传输。它包含3种类型:控制读取、控制写入以及无数据控制。这3种控制传输类型又分为2~3个阶段:设置阶段、数据阶段(无数据控制没有此阶段)以及状态阶段。
阶段一:设置阶段
主机从USB设备获取配置信息,并设置设备的配置值。 设置阶段的数据交换包含了SETUP令牌封包、紧随其后的DATA0数据封包以及ACK握手封包。它的作用是执行一个设置(概念含糊)的数据交换,并定义此控制传输的内容。
阶段二:数据传输阶段
数据传输阶段用来传输主机与设备之间的数据。控制读取是将数据从设备读到主机上,读取的数据USB设备描述符。该过程如图16-8所示。对每一个数据信息包而言,首先,主机会发送一个IN令牌信息包,表示要读数据进来。然后,设备将数据通过DATA1数据信息包回传给主机。最后,主机将以下列的方式加以响应:当数据已经正确接收时,主机送出ACK令牌信息包;当主机正在忙碌时,发出NAK握手信息包;当发生了错误时,主机发出STALL握手信息包。 控制写入则是将数据从主机传到设备上,所传的数据即为对USB设备的配置信息,该过程如图16-9所示。对每一个数据信息包而言,主机将会送出一个OUT令牌信息包,表示数据要送出去。紧接着,主机将数据通过DATA0数据信息包传递至设备。最后,设备将以下列方式加以响应:当数据已经正确接收时,设备送出ACK令牌信息包;当设备正在忙碌时,设备发出NAK握手信息包;当发生了错误时,设备发出STALL握手信息包。
参考:https://wenku.baidu.com/view/136a3bc44a7302768f993963.html?from=search