目录
1. USB系统组成
主机:提供USB接口和接口管理功能的硬件、软件、固件的复合体。PC机或OTG设备,一个USB系统只能有一个主机
设备:1.集线器HUB:扩展主机接口,设备可以通过其接入主机 2.功能设备
物理连接:即USB电缆,USB使用差分信号传输数据,全速/高速模式电缆必须外层屏蔽铜质传输线,且差分数据线双绞。一条USB的传输线分别由地线、电源线、D+、D-四条线构成,D+、D-是差分输入线,使用的是3.3V电压,而电源线与地线可向设备提供5V电压,最大电流500mA。
2.USB拓扑结构
每个系统只允许有一个HOST(主机)。允许的最大层数为6层(出去主机);每层的电缆最大长度为5米,电缆总长度为30米;每层最大允许接5个DEVICE(设备);
3.USB系统程序
1. 应用程序:应用程序运行与USB设备所连接的主机上。部分应用程序会由操作系统的主机提供,大部分应用程序由USB设备供应商提供。
2. 驱动程序:驱动程序服务于特定的操作系统,为USB设备提供支持。驱动程序通常由操作系统提供,独立于特定的应用程序和USB设备。
3. 主机端控制程序:包括硬件和软件,使USB设备能够被主机识别。
4.USB速度选择
全速模式是在D+线上上拉1.5K的电阻。
低速模式是在D-线上上拉1.5K的电阻。
5.USB信号描述
差分信号:1:D+ > Voh(2.8V) and D- < Vol(0.3V)
0:D- > Voh and D+ < Vol
J状态: Low Speed :Differential(差分信号) 0
Full Speed :Differential(差分信号) 1
K状态: Low Speed :Differential(差分信号) 1
Full Speed :Differential(差分信号) 0
6.USB协议
6.1 USB基本规范
USB在逻辑上被分为三层:信号层、协议层、数据传输层。
6.2 信号层
6.2.1设备速度的检测
6.2.2 信号的编码
USB中的数据采用反向不归零编码方式(NRZI:none-return to zero inverted),并对D+和D-线所处的不同状态定义成J和K两种状态。
数据状态 | D+ | D- |
低速J状态 | 0 | 1 |
低速K状态 | 1 | 0 |
数据的编码/解码(反向不归零码)
说明:遇到0的边沿进行状态改变,如果是1保持原有状态
注:在数据进行NRZI编码前,每6个连续的1信号之后都会插入一个0信号,以免丢失同步。比如,若是1000个1信号,很有可能被解析成999个1或是1001个1,这样就丢失了同步。
所以,在没有同步时钟的背景下,usb通过编码弥补了同步这一点,通过JK状态的翻转来表示01数据。
6.3 协议层
包是USB系统中信息传输的基本单位,所有的数据都是经过打包后再总线上传输的。
每个包由6部分组成:同步字段(SYNC)、包标识符(PID)、地址字段(ADDR)、数据字段(DATA,包括帧号)、检验字段(CRC)、包结束(EOP)。
6.3.1 usb包
包的组成:
包的内容:
1、PID(Packet Identifier):
这里只用(PID0~4),PID4~7是PID0~4的取反,用来校验PID
PID1~0:01 令牌包、11 数据包、10 握手包、00 特殊包
2、地址:
3、帧号:
4、数据:
5、CRC:
6.3.2 packet
Packet分四大类: 命令 (Token) 、Packet 帧首 (Start of Frame) 、Packet 数据 (Data) 、Packet 握手 (Handshake) 。不同类型的packet包,以上的组成部件有所不同。
1、四种Packet类型之令牌包(Token Packet):
令牌包用来启动一次USB传输。
输出(OUT)令牌包:用来通知设备将要输出一个数据包
输入(IN)令牌包:用来通知设备返回一个数据包
建立(SETUP)令牌包:只用在控制传输中,和输出令牌包作用一样,也是通知设备将要输出一个数据包,两者区别在于:
SETUP令牌包后只使用DATA0数据包,且只能发送到设备的控制端点,并且设备必须要接收,而OUT令牌包没有这些限制
例子:
2、四种Packet类型之SOF Packet
帧起始包:在每帧(或微帧)开始时发送,以广播的形式发送,所有USB全速设备和高速设备都可以接收到SOF包。
例子:
0xA5:1010 0101:对应上面PID表可知是帧起始包
3、四种Packet类型之Data Packet
例子:
4、四种Packet类型之Handshake Packet
例子:
7.USB 设备枚举及描述符介绍
当一个USB设备插入主机后,会有以下活动:
在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。设备通常有一个或多个配置,配置通常有一个或多个接口,接口通常有零个或多个端点。
8.USB数据传输过程
8.1 基本概念
- 一个【传输(Transfer)】(控制、批量、中断、等时):由多个【事务(Transaction)】组成
- 一个【事务(Transaction)】(IN、OUT、SETUP):由一多个【Packet】组成。
USB数据在【主机软件】与【USB设备特定的端点】间被传输。【主机软件】与【USB设备特定的端点】间的关联叫做【pipes】。一个USB设备可以有多个管道(pipes)。
8.2 枚举
-
上电状态(usb device插入host)
插入host后,host的每个hub对应端口上都有供电,连接着的设备就进入供电状态 -
host检测到device插入
hub检测到它的一根数据线是高电平,就认为是有设备插入,检测到设备后,hub继续给设备供电,但并不急于与设备进行USB传输。 -
Host了解连接的设备
hub通过检测USB总线空闲(Idle)时差分线的高低电压来判断所连接设备的速度类型 -
host复位设备(不是正的复位设备,是复位USB通信)
hub通过驱动数据线到复位状态(D+和D-全为低电平 ),并持续至少10ms -
主机发送Get_Descriptor请求获取默认管道的最大包长度
默认管道(Default Pipe)在设备一端来看就是端点0。主机此时发送的请求是默认地址0,端点0,设备描述符的第8字节代表设备端点0的最大包大小 -
设置地址
主机给设备分配一个地址,在完成这次传输之后,设备进入地址状态(Address state),之后就启用新地址继续与主机通信。 -
获取设备配置
主机获取设备的信息
枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就已经成功大半了。
一旦获悉有新设备连接上来,主机就会发送一系列的请求(Resqusts)给设备所挂载到的hub,再由hub建立起一条连接主机(Host)和设备(Device)之间的通信通道。然后主机以控制传输(Control Transfer)的方式,通过端点0(Endpoint 0)对设备发送各种请求,设备收到主机发来的请求后回复相应的信息,进行枚举(Enumerate)操作。所有的USB设备必须支持标准请求(StandardRequests),控制传输方式(Control Transfer)和端点0(Endpoint 0)。
在讲解枚举之前,先大概说说USB的一种传输模式——控制传输。这种传输在USB中是非常重要的,它要保证数据的正确性,在设备的枚举过程中都是使用控制传输的。控制传输分为三个阶段:①建立阶段。②数据阶段。③确认阶段。 建立(setup)阶段:都是由USB主机发起,它是一个setup数据包,里面包含一些数据请求的命令以及一些数据。如果建立阶段是输入请求,那么数据阶段就要输入数据;如果建立阶段是输出请求,那么数据阶段就要输出数据。如果在数据阶段,即便不需要传送数据,也要发一个0长度的数据包。数据阶段过后就是确认阶段。确认阶段刚好跟数据阶段相反,如果是输入请求,则它是一个输出数据包;如果是输出请求,则它是一个输入数据包。确认阶段用来确认数据的正确传输。
8.3 数据传输
usb host与usbfunction之间采用的是一种“非对称”的传输,也就是说,无论usb接受数据还是发送数据,都是由usbhost首先发起。
首先,主机发第1个packet给从机,声明数据传送方向,数据传输地址,数据传输类型。
其次,主机发第2个至第n个packet载有实际数据
最后,从机返回一个packet是一个ACK包,报告数据传输的结果,比如接受出错或成功等信息,这样主机就可以借此了解到这次传输情况,从而有可能来作出相应措施如决定是否重发。
控制传输
一个Usb的控制式传输分为两个或三个阶段进行传输:setup stage,data stage(视情况而定),status stage。 首先发起setup,之后发起以data0为起始的setup data,最后usb function回应ack结束一次交互
————————————————
版权声明:本文为CSDN博主「coding life」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_38134493/article/details/102505259
————————————————
版权声明:本文为CSDN博主「coding life」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_38134493/article/details/102505259
9.例程分析
我们插上鼠标后后出现如下的信息,我们先来分析第一个传输:
我们看到第一个是控制传输,它包含了4个事物,分别是:1个setup事务,3个in事务,1个out事务,我们先打开setup事务:
我们看到这个事务里包含了3个包
第一个包是令牌包,它由主控制器发送给目标设备的0号端口,用于设置目标设备的地址和端口号,我们看到后面两个包都缺省了地址与端口号。在usb系统中,所有的通信都是由主机发出相应的令牌所引起的。
第二个是数据包,由主控器发送给目标设备,其中数据的内容表示:
80:表示要求设备向主机发送信息
06:表示GET_DESCRIPTOR,即设备向主机发送设备描述符
00与01:Word-sized field that varies according to request
00与40:Word-sized field that varies according to request; typically used to pass an index or offset
00:Number of bytes to transfer if there is a:Data stage
总结一下第二个包就是向默认地址0 发送GET_DESCRIPTOR 指令包,请求设备发送设备描述符
第三个是应答包:设备接收到主机发送的数据后会给出应答
接着我们看第一个in事务
我们看到这个事务里也有三个包
第一个是in包:由主机发送给设备,表示要设备向主机发送上面请求的设备描述符
第二个是数据包:由设备发送给主机,当然是发送设备描述符,我们来分析一下:
12:表示接下来要求主机向设备发送信息
01:CLEAR_FEATURE、
第三个是应答包,由主机发送给设备
接着我们来看第二个in事务
这个事务里依旧是3个包
第一个是in包:由主机发送给设备,表示需要输入
第二个是数据包:由设备发送给主机,我们来解析一下:
6D:表示要求主机发给设备数据
04:Reserved for future use
第三个是主机给设备的应答包
最后来看out事务
第一个是out包:由主机发给设备
第二个是数据包:由主机发给设备,无数据
第三个包是设备给主机的应答包
————————————————
版权声明:本文为CSDN博主「浩雪峰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leho666/article/details/88532614