首页 > 版块 > 物联网 > 帖子正文

USB的四种传输类型之批量传输

蔡琰 发布于 2022-01-10 13:46
收藏 0 回复 0 浏览 634 原创


虽然USB定义数据在总线上传输的基本单位是包,但是我们还不能随意地使用包来传输数据.必须按照一定的关系把这些不同的包组织成事务才能传输数据.

那什么是事务呢?事务通常由两个或者三个包组成:令牌包,数据包和握手包.令牌包用来启动一个事务,总是由主机发送;数据包传送数据,可以从主机到设备,也可以是从设备到主机,方向由令牌包来指定;握手包的发送者通常为数据接收者,当数据接收正确后,发送握手.设备也可以使用NAK握手包来表示数据还未准备好.

USB协议规定了4中传输类型:批量传输,等时传输,中断传输和控制传输.其中,批量传输,等时传输,中断传输每次传输一次数据都是一个事务;控制传输包括三个过程,建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务.下面我们先来说说批量传输.

批量传输是最容易理解的,它使用批量事务传输数据.一次批量事务有三个阶段:令牌包阶段,数据包阶段和握手包阶段.这里的每个阶段都是一个独立的包.批量传输分为批量读和批量写(记住,输入还是输出是以主机为参考的),批量读使用批量输入事务,批量写使用批量输出事务.

批量传输没有规定数据包中的数据的意义和结构,具体的数据结构要由设备自己定义.批量传输通常用在数据量大,对数据的实时性要求不高的场合,例如USB打印机,扫描仪,大容量存储设备等.

首先介绍批量输出事务。主机先发出一个OUT令牌包,这个令牌包中包含了设备地址、端点号。然后,再发送一个DATA(具体是什么类型的DATA,要看数据切换位),这时地址和端点匹配的设备就会收下这个数据包。然后主机切换到接收模式,等待设备返回握手包。设备解码令牌包、数据包都准确无误,并且有足够的缓冲区来保存数据后,就会使用ACK握手包或者NYET握手包来应答主机(只有高速模式才有NYET握手包,它表示本次数据成功接收,但是没有能力接收下一次传输)。如果没有足够的缓冲区来保存数据,那么它就会返回一个NAK握手包,告诉主机目前没有缓冲区可用,主机会在稍后的时间重试该批量输出事务。如果设备检测到数据正确,但是端点处于挂起状态,返回一个 STALL握手包。如果设备检测到有错误(例如校验错误位填充错误等),则不做任何响应,让主机等待超时再来看看批量输入事务。主机首先发出一个IN令牌包,同样IN令牌包中包含了设备地址和端点号然后主机切换到接收数据状态,等待设备返回数据如果设备检测到错误,那么不做任何响应,主机等待超时如果此时有地址和端点匹配的设备,并且没有检测到错误,则该设备要做出响应:如果设备有数据需要返回,那么它把一个数据包放到总线上(具体的数据包类型要看数据切换位);如果设备没有数据需要返回,则它直接使用NAK握手包来响应主机;如果该端点处于挂起状态,设备会返回一个 STALL握手包。如果主机接收到设备发送的数据包并解码正确后,使用ACK握手包应答设备。如果主机检测到错误,则不做任何响应,设备会检测到超时USB协议规定,不允许主机使用NAK握手包来拒绝接收数据包(否则的话,设备会在下面想:你真是USB”!既然你没空间接收数据,你还请求我返回数据给你干啥!浪费表情……)主机在收到NAK握手包后,知道设备暂时无数据返回,主机会在稍后的时间里重试该输入事务。另外,USB2.0高速设备中增加了一个ING令牌包,它不发出数据,直接等待设备的握手包。因此PING事务只有令牌包和握手包。图1.10.1是一个批量事务的流程图。下面对该流程图进行简单地解释,后面几种事务的流程图表示方法是差不多的,就不再一一解释了.

image.png 

平时无数据传输时,总线处于空闲状态。当需要传输一次事务时,主机发送一个令牌包,它可以是OUT令牌包、IN令牌包或者是PING令牌包,如图1.10.1中第一行所示,其中PING令牌包是USB2.0高速模式输出特有的,全速模式和低速模式没有这个令牌包如果设备解码令牌包时出错,则直接进入空闲状态。令牌阶段之后是数据阶段或者握手阶段对于批量输入事务,则由设备返回数据,或者返回应答包NAK握手包或 STALL握手包。这由设备的状态来决定对于批量输出事务,则主机在令牌包后面再发送一个数据包PING令牌用来探测设备是否有空间接收数据,它没有数据阶段,只有握手阶段,设备根据实际的情况返回握手包,AK握手包表示有空间接收数据,NAK握手包表示无空间接收, STALL握手包表示端点挂起。最后是握手阶段。对于批量输入事务,如果主机接收设备返回的数据正确,则由主机返回ACK握手包;否则数据错误,主机什么也不返回。主机必须要能够接收数据,不能用NAK握手包回应设备。对于批量输出事务,如果设备能够接收数据,则返回ACK握手包;如果设备没有空间接收数据包,则返回NAK握手包;如果设备端点挂起,则返回 STALL握手包;如果设备检测到传输错误,则什么都不回应,直接进入到空闲状态图1.10.2和图1.10.3更详细地给出一个传输正确的批量输入事务和批量输出事务的数据包图(传送了2字节数据)

image.png

今天我们就先介绍这么多,get到了吗?

 


0 0
发表评论 侵权投诉
评论 (0)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表乌云踏雪网立场。

文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。