USB学习笔记-协议
一、USB设备枚举过程
1.复位从设备使其设备地址为0
2.先从设备发送读取设备描述符的命令(只读取一次,即使端点0的最大包长小于18字节)
3.设备返回设备描述符
4.主机返回0长度确认数据包给到设备
5.再次对设备进行复位,以进入地址设置阶段
6.主机向0地址设备的0端点发送设置地址的请求(此请求中包含主机发过来的唯一的设备地址)
7.设备直接进入状态过程,向主机返回应答
8.主机收到应答确认OK后就会发送ACK给设备,设备收到ACK后就开始启用新的设备地址,以后主机就通过此地址访问设备。
9.主机再次使用新地址获取设备描述符,获取全部18字节的设备描述符(若端点0的最大包长小于18字节,会多次重复获取)
10.获取配置描述符
11.根据配置描述符中的配置集合的总长度获取整个配置集合
二、USB协议规定了4类包:令牌包(PID1-0:01),数据包(PID1-0:11),握手包(PID1-0:10),特殊包(PID1-0:00),不同的包又
分为几种具体的包:
令牌包:
1.令牌包用来启动一次USB传输,它通知哪个设备进行响应,如何响应。
2.令牌包有4种:输出(OUT),输入(IN),建立(SETUP),帧起始(SOF)
OUT: 用于通知设备将要输出一个数据包
IN :用于通知设备将要读入一个数据包
SETUP:它只使用在控制传输中,它跟OUT令牌包作用一样,也是通知设备要输出一个数据包,但两者的区别是:
①SETUP令牌包后只能使用DATA0数据包,且只能发到设备的控制端点,并且设备必须接受,但是OUT令牌包没有此限制。
SOF:它在每帧(或微帧)开始时发送,而且是以广播的形式发送,所有USB高速和全速设备都能接收到SOF包。USB全速设备每1ms产生一个帧,而高速设备每125us产生一个微帧。USB主机会对当前帧号进行计数,在每次帧开始时(或者微帧开始时,每ms有8个微帧,这8个微帧的帧号是一样的,即相同的SOF)通过SOF包发送帧号。
3.令牌包的结构:
①SOF令牌包: 同步域 8bit包标识PID 11位帧号 5位CRC5校验 EOP
②OUT IN SETUP令牌包结构: 同步域 8bit包标识PID 7位地址 4位端点号 5位CRC校验 EOP
数据包:
1.USB1.1协议中只有2种数据包:DATA0和DATA1。在USB2.0中又增加了DATA2和MDATA包,主要用在高速分裂事务和高速高带宽同步传输中
2.数据包结构:同步域 8位包标识PID 字节0 字节1 ...... 字节N 16位CRC16校验 EOP
3.使用不同类型的数据包的原因是在当握手包出错时纠错:主机和设备都会维护自己的一个数据包类型切换机制:当数据包成功发送或接收时,数据包类型切换。
握手包:
1.握手包用来表示一个传输是否被对方确认。握手包只有同步域、PID和EOP,是最简单的一种数据包
2.握手包类型: 同步域 包标识符 EOP
3.握手包有:
ACK:表示正确接收数据,并且有足够的空间来容纳数据。主机和设备都可以使用ACK来确认,而NAK STALL NYET只有设备能返回,主机 不能使用这些包。
NAK:表示没有数据需要返回,或者数据正确接收但是没有足够的空间来容纳它们。当主机收到NAK时,它知道设备还没有准备好,主机 会在以后合适的时机进行重传。
STALL:表示设备无法执行这个请求或者端点已经被挂起了,它表示一种错误状态。设备返回STALL后,需要主机进行干预才能解除这种 STALL状态。
NYET:只在USB2.0的高速设备输出事务中使用,它表示设备本次数据成功接收,但是没有足够的空间来接收下一次数据。主机在下一次输出数据时,将先使用PING令牌包来试探设备是否有空间接收数据,以避免不必要的带宽浪费。
4.需要注意:返回NAK并不表示数据出错,只是说明设备暂时没有数据传输或者暂时没有能力接收数据。当USB主机或设备检测到数据出错时(如CRC校验错,PID校验错,位填充错)将什么也不返回,这是等待接收握手包的一方就会收不到握手包而等待超时。
特殊包:
1.特殊包在特殊的场合才会使用的包,共4中:PRE ERR SPLIT PING
2.其中PRE SPLIT PING是令牌包,ERR是握手包。ERR SPLIT PING这三个是在USB2.0中新增的。
3.PRE令牌包:是通知集线器打开其低速端口的一种前导包,其只在全速模式中使用,平时为了防止全速信号使低速设备误动作,集线器是没有将全速信号传送给低速设备的,只有当收到PRE令牌包时才打开其低速端口。
PRE令牌包与握手包结构一样,只有同步域,PID和EOP。只有当传送低速事务时,主机首先发送一个PRE令牌包(以全速模式发送)。对于 全速模式将会忽略这个令牌包。集线器在收到这个令牌包后打开其低速设备的端口,接着,主机就会以低速模式给低速设备发送令牌包 数据包等。
4.PING令牌包:与OUT令牌包具有一样的结构,但是PING令牌包后并不会发送数据,而是等待设备返回ACK或者NAK,以判断设备是否能够传送数据。在USB1.1中是没有PING令牌包的,只有在USB2.0的高速环境下才会使用带PING令牌包,它只被使用在批量传输和控制传输的 输出事务中。
5.SPLIT令牌包:是高速事务分裂令牌包,通知集线器将高速数据包转化为全速或者低速数据包发送给其下面的端口。
6.ERR握手包:在分裂事务中表示错误使用
三、USB事务:
1.虽然USB定义了数据在总线上的传输的基本单位是包,但是我们还不能随意地使用包来传输数据,必须按照一定得关系把这些不同的包组成事务(transaction)才能传输数据.
2.事务通常由两个或者三个包组成:令牌包、数据包、握手包
3.令牌包用于启动一个事务,总是由主机发送
4.数据包传输数据,可以从主机到设备也可以从设备到主机,方向由令牌包来指定
5.当数据接收正确后发送握手包,也可以发送NAK表示数据未准备好。
四、USB的四种传输类型:
1.批量传输、等时传输、中断传输每传输一次数据都是一个事务;控制传输包含三个过程:建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务。
2.中断传输是一种保证查询频率的传输。中断端点在端点描述符中要报告它的查询间隔,主机会保证在小于这个时间间隔的范围内安排一次传输。注意这和硬件上的中断不是同一概念哦。
3.中断传输也可以用来不断地检测某个状态,当条件满足后再使用批量传输来传送大量的数据。
4.等时传输是不保证数据100%传输正确的,当数据错误时,并不进行重传操作,因此等时传输没有应答包。
5.控制传输SETUP只能使用DATA0数据包,数据过程是可选的,状态过程只能是DATA1包
6.一个具体的端点只能工作在一种传输模式下,通常把工作在什么模式下的端点就叫做什么端点,例如控制端点、批量端点。其中端点0是每个USB设备都必须具备的默认控制端点,它一上电就存在并且可用。设备的各种描述符和主机发送的一些命令都是通过端点0传输的。非0端点只有在Set Config之后才能使用。
五、传输类型与端点支持的最大包长
每个端点描述符中都规定了端点所支持的最大数据包长,主机发送的数据包长不能超过端点的最大包长。
①对于控制端点:低速模式最大数据包长固定为8字节,高速模式下最大包长固定为64字节,而全速模式可以在8 16 32 64字节中选择。
②等时传输端点:全速模式最大包长上线是1023字节,高速模式最大包长为1024字节,低速模式不支持等时传输!
③中断传输端点:低速模式最大包长上限为8字节,全速模式下最大包长上限为64字节,高速模式下最大包长上限为1024字节.
④批量传输端点:高速模式固定为512字节,全速模式最大包长可以在8 16 32 64字节中选择,低速模式不支持批量传输。
六、笔记
1.USB使用LSB在前的方式串行传输,使用NRZI编码,0:电平发生反转,1:电平不发生反转。
2.USB总线上传输的数据以包为单位的,一个包被分为不同的域,不同类型的包所包含的域是不一样的。但是所有的包有个共同特点就是都要以同步域开始,紧跟着就是一个包标识符PID,最终以包结束符EOP来结束这个包。
3.同步域用来告诉串行接口引擎数据就要开始传输了,请做好准备。除此之外同步域还可以用来同步主机端和设备端的时钟。
对于全速和低速设备,同步域使用的是0000 0001(方向<---,串行接口引擎在检测到一个位的数据没有发生反转后(也即收到了1),就认为包标识符开始了);对于高速设备同步域使用31个0后面跟一个1(这是对发送端的要求,接收端在译码时0的个数可以少于这个数)
4.包结束符EOP,对于高速设备和全速/低速设备也不一样:
①全速/低速设备的EOP是一个大约为2个数据位宽度的单端0(SE0)信号。SE0:D+和D-同时保持为低电平。SE0用来表示一些特殊的意义,比如包结束和复位信号等。
②高速设备的EOP是故意使用位填充错误来表示的。通过CRC校验来判断一个位填充错误是真的位填充错误还是包结束,如果CRC校验正确说明是EOP
5.USB集线器对USB设备进行复位的操作:通过将总线设置为SE0大约10ms来实现的。
6.包标识符PID用来标识一个包的类型,共有8bit,USB协议使用的是前4bit,后4bit是前4bit的取反,用来校验PID。
7.USB插入检测:
在Host端,D+和D-上都接一个15K的下拉电阻,Device若是全速或高速设备,在D+上接一个1.5K的上拉电阻,若是低速设备,在D-上接一个1.5K的上拉电阻。
七、工具软件
1.软件BUS Hound介绍:BUS Hound抓取到的仅仅是数据包,并且在BUS Hound中只能看到成功传输的数据,即只有ACK确认过的数据包
八、接口电阻参数
USB host端:D+和D-各接一个15kΩ的下拉电阻;
USB slave端:高速和全速D+接一个1.5kΩ电阻上拉到3.3V;低速在D-上接一个1.5kΩ电阻上拉到3.3V。高速chirp KJ握手成功后,自动断开D+上的1.5kΩ上拉;
当高速设备进入suspend时,使能D+上的1.5kΩ上拉到3.3V,退出suspend时,断开D+上的1.5k上拉。
TODO:这个网址中列出很多巨好的文章
https://blog.csdn.net/zoosenpin/article/details/73291571
TODO:USB实现 很好的博客
https://blog.csdn.net/u010684585/article/details/64919516
TODO:一些基本的介绍PPT
https://wenku.baidu.com/view/408bea4a192e45361166f510.html
posted on 2018-07-10 02:32 Hello-World3 阅读(904) 评论(0) 编辑 收藏 举报