原文地址:www.beyondlogic.org/usbnutshell…
原文作者:
发布时间:
端点类型
通用串行总线规范定义了四种传输/端点类型。
控制传输
控制传输通常用于命令和状态操作。它们是设置USB设备的必要条件,所有枚举功能都使用控制传输来执行。它们通常是突发的、随机的数据包,由主机发起,采用尽力传递。低速设备中控制传输的数据包长度必须为8字节,高速设备允许数据包大小为8、16、32或64字节,全速设备的数据包大小必须为64字节。
一个控制传输最多可以有三个阶段。
- 设置阶段是发送请求的地方。这包括三个数据包。首先发送设置令牌,其中包含地址和端点号。接下来发送数据包,数据包的PID类型总是data0,并包含一个设置包,详细说明请求的类型。我们在后面详细介绍设置包。最后一个数据包是一个握手包,用于确认成功接收或指示错误。如果函数成功地接收到设置数据(CRC和PID等OK),它就用ACK来响应,否则它就忽略数据,不发送握手包。函数不能发出STALL或NAK数据包来响应设置数据包。
- 可选数据阶段由一个或多个IN或OUT传输组成。设置请求指示了该阶段要传输的数据量。如果它超过了最大数据包大小,数据将以多次传输的方式发送,除了最后一个数据包外,每次传输的数据都是最大数据包长度。
数据阶段根据数据传输的方向有两种不同的情况。
- IN:当主机准备接收控制数据时,它会发出一个IN令牌。如果函数收到IN令牌时出现错误,例如PID与倒数PID位不匹配,那么它就会忽略这个数据包。如果正确接收到令牌,设备可以回复一个包含要发送的控制数据的DATA数据包,一个表示端点出错的停顿数据包,或者一个向主机表示端点正在工作,但暂时没有数据可发送的NAK数据包。
- OUT。当主机需要向设备发送控制数据包时,会发出一个OUT令牌,后面跟着一个包含控制数据的数据包作为有效载荷。如果OUT令牌或数据包的任何部分损坏,那么函数就会忽略该数据包。如果函数的端点缓冲区是空的,并且它已经将数据时钟化到端点缓冲区中,它就会发出一个ACK,通知主机它已经成功地接收到数据。如果端点缓冲区由于处理了前一个数据包而不是空的,那么函数返回一个NAK。然而,如果端点发生了错误,并且它的停止位已经被设置,那么它就返回一个STALL。
- 状态阶段报告整个请求的状态,这又一次由于传输方向的不同而不同。状态报告始终由函数执行。
- IN:如果主机在数据阶段发送IN令牌来接收数据,那么主机必须确认成功接收该数据。这是通过主机发送一个OUT令牌和一个零长度的数据包来实现的。现在函数可以在握手阶段报告其状态。ACK表示函数已经完成了命令,现在可以接受另一个命令。如果在处理这个命令的过程中发生了错误,那么函数将发出一个STALL。但如果函数仍在处理,则会返回一个NAK,指示主机稍后重复状态阶段。
OUT。如果主机在数据阶段发送了OUT令牌来传输数据,函数将通过发送一个零长度的数据包来响应IN令牌来确认数据的成功接收。但是,如果发生了错误,它应该发出STALL,或者如果它仍然在忙于处理数据,它应该发出NAK,要求主机稍后重试状态阶段。
控制传输:大局观
现在,所有这些是如何结合在一起的呢?比如说,Host在枚举过程中想请求一个设备描述符。发送的数据包如下。
主机将发送Setup token,告诉函数下面的数据包是Setup数据包。Address字段将保存主机向其请求描述符的设备地址。端点号应该为零,指定默认管道。然后,主机将发送一个 DATA0 数据包。这将有一个8字节的有效载荷,这是USB规范第9章中概述的设备描述符请求。然后,USB功能确认设置数据包已被正确读取,没有错误。如果收到的数据包是损坏的,设备就会忽略这个数据包。然后主机将在短暂的延迟后重新发送数据包。
-
设置令牌
Sync PID ADDR ENDP CRC5 EOP地址和端点号码 -
数据0包
Sync PID Data0 CRC16 EOP设备描述符请求 -
Ack握手
Sync PID EOP设备Ack。设置数据包
以上三个数据包代表了第一个USB事务。现在,USB设备将对收到的8个字节进行解码,并确定是否是设备描述符请求,然后设备将尝试发送设备描述符,这将是下一个USB事务。然后设备将尝试发送设备描述符,这将是下一个USB事务。
-
输入令牌
Sync PID ADDR ENDP CRC5 EOP地址和端点号码 -
数据1包
Sync PID Data1 CRC16 EOP设备描述符的前8个字节 -
Ack握手
Sync PID EOP主机确认数据包 -
输入令牌
Sync PID ADDR ENDP CRC5 EOP地址和端点号码 -
数据0包
Sync PID Data0 CRC16 EOP最后4个字节+填充 -
Ack握手
Sync PID EOP主机确认数据包
在这种情况下,我们假设最大有效载荷大小为8个字节。主机发送IN令牌,告诉设备现在可以为这个端点发送数据。由于最大数据包大小是8个字节,我们必须将12个字节的设备描述符分成若干块来发送。除了最后一个事务外,每个分块必须是8个字节。主机会对我们发送给它的每个数据包进行确认。
一旦设备描述符被发送,一个状态事务就会随之而来。如果事务成功,主机会发送一个零长度的数据包,表示整体事务成功。然后,函数会回复这个零长度的数据包,表示其状态。
-
输出令牌
Sync PID ADDR ENDP CRC5 EOP地址和端点号码 -
数据1包
Sync PID Data1 CRC16 EOP零长度数据包 -
Ack握手
Sync PID EOP设备Ack。整个交易
中断传输
有过微控制器上中断请求经验的人都知道,中断是设备产生的。然而在USB下,如果一个设备需要主机的关注,它必须等到主机对它进行轮询后,才能报告它需要紧急关注!
中断传输
- 保证延迟
- 单向流管
- 错误检测和下期重试。
中断传输是典型的非周期性、小型设备 "发起 "的通信,需要有约束的延迟。中断请求由设备排队,直到主机向USB设备发送数据请求。
- 低速设备的最大数据有效载荷大小为8字节。
- 全速设备的最大数据有效载荷大小为64字节。
- 高速设备的最大数据有效载荷大小为1024字节。
上图显示了一个中断IN和中断OUT事务的格式。
- IN:主机将定期对中断端点进行轮询。这个轮询的速率是在端点描述符中指定的,后面会讲到。每次轮询都需要主机发送一个IN令牌。如果IN令牌损坏,该函数将忽略该数据包,并继续监视总线上的新令牌。
如果一个中断已经被设备排成队列,则该函数在收到IN令牌时,将发送一个包含与中断相关数据的数据包。在主机成功接收后,主机将返回一个ACK。但如果数据损坏,主机将不返回任何状态。如果另一方面,当主机用IN令牌轮询中断端点时,没有出现中断条件,那么该函数就会通过发送NAK来发出这种状态信号。如果在该端点上发生了错误,则发送一个STALL来代替IN令牌的回复。
- OUT。当主机要发送设备中断数据时,它发出一个OUT令牌,后面跟着一个包含中断数据的数据包。如果OUT令牌或数据包的任何部分损坏,那么函数将忽略该数据包。如果函数的端点缓冲区是空的,并且它已经将数据时钟化到端点缓冲区中,它就会发出一个ACK,通知主机它已经成功地接收到数据。如果端点缓冲区由于处理了前一个数据包而不为空,那么函数返回一个NAK。然而,如果端点因此发生了错误,并且它的停止位被设置,那么它将返回一个STALL。
同步传输
同步传输是连续和周期性地进行的,通常包含时间敏感信息,如音频或视频流。它们通常包含时间敏感信息,如音频或视频流。如果音频流中的数据有延迟或重试,那么你会期待一些不稳定的音频,其中包含故障。节奏可能不再同步。然而,如果一个数据包或帧每时每刻都被丢弃,那么听众就不太可能注意到。
同步传输提供
- 保证对USB带宽的访问。
- 有限制的延迟。
- 流管 - 单向
- 通过CRC检测错误,但不重试或保证交付。
- 只有全速和高速模式。
- 没有数据切换。
异步端点的端点描述符中指定了最大大小的数据有效载荷。对于全速设备来说,最大可达到1023字节,对于高速设备来说,最大可达到1024字节。由于最大数据有效载荷大小将影响总线的带宽要求,因此指定一个保守的有效载荷大小是明智的。如果您使用的是大的有效载荷,那么指定一系列具有不同等时有效载荷大小的替代接口也可能对您有利。如果在枚举过程中,主机由于带宽限制而无法启用您首选的等时端点,那么它就有了可以依靠的东西,而不是完全失败。在等时端点上发送的数据可以小于预先协商的大小,并且在不同的事务中可能会有不同的长度。
上图显示了异步IN和OUT事务的格式。异步事务没有握手阶段,不能报告错误或STALL/HALT条件。
批量传输
批量传输可用于大型突发数据。这类例子可包括发送到打印机的打印作业或从扫描仪生成的图像。批量传输以数据有效载荷上的CRC16字段和错误检测/重传机制的形式提供纠错功能,确保数据的传输和接收没有错误。
批量传输将在所有其他事务分配完毕后使用总线上未分配的空闲带宽。如果总线上的异步和/或中断很忙,那么批量数据可能会在总线上缓慢地流动。因此,批量传输只能用于对时间不敏感的通信,因为不能保证延迟。
批量传输
- 用于传输大突发数据。
- 通过CRC进行错误检测,保证传输。
- 不保证带宽或最小延迟。
- 流管 - 单向
- 只支持全速和高速模式。
只有全速和高速设备才支持批量传输。对于全速端点,最大批量数据包大小为8、16、32或64字节长。对于高速端点,最大数据包大小可以达到512字节长。如果数据有效载荷不足最大数据包大小,则不需要用零来填充。当传输了所要求的准确数据量、传输了小于最大端点大小的数据包或传输了一个零长度的数据包时,就认为批量传输完成了。
上图显示了一个批量IN和OUT事务的格式。
-
IN:当主机准备接收批量数据时,它会发出一个IN令牌。如果函数收到IN令牌时出现错误,则忽略该数据包。如果令牌接收正确,函数可以回复一个包含要发送的批量数据的DATA数据包,或者回复一个表示端点出错的停顿数据包,或者回复一个向主机表示端点正在工作,但暂时没有数据可发的NAK数据包。
-
OUT。当主机要给函数发送一个批量数据包时,会发出一个OUT令牌,后面跟着一个包含批量数据的数据包。如果OUT令牌或数据包的任何部分损坏,那么函数就会忽略这个数据包。如果函数的端点缓冲区是空的,并且它已经将数据时钟化到端点缓冲区中,它就会发出一个ACK,通知主机它已经成功地接收到数据。如果端点缓冲区由于处理了之前的数据包而不是空的,那么函数返回一个NAK。然而,如果端点发生错误,并且它的停止位已被设置,它将返回一个STALL。
带宽管理
主机负责管理总线的带宽。这是在配置异步和中断端点时以及在总线的整个运行过程中进行的。该规范对总线进行了限制,在全速总线上,允许不超过90%的任何帧被分配用于周期性传输(中断和异步)。在高速总线上,这个限制减少到不超过80%的微帧可以分配给周期性传输。
因此,你可以很快地看到,如果你有一个周期性传输的高度饱和的总线,剩下的10%用于控制传输,一旦这些传输被分配,批量传输将得到剩余的部分。
通过www.DeepL.com/Translator(免费版)翻译