USB2.0令牌、事务及传输抓包分析
+ -

USB2.0 IN/OUT事务ACK错误或丢失的数据翻转(DATA TOGGLE)

2021-12-06 1516 0

前面一节我们讨论了当ACK成功发送并被接收时的数据包PID翻转,但在实际的数据传输过程中,也会出现ACK丢失或者错误的情况,这节我们来讨论这种情况。

同样的,对于IN事务OUT事务,我们分别进行讨论。

IN事务ACK错误或丢失的数据翻转(DATA TOGGLE)

IN事务ACK错误或丢失的数据翻转(DATA TOGGLE)如下图所示:
IN事务ACK错误或丢失的数据翻转(DATA TOGGLE)
USB主机与设备经过一段的数据传输后,开始使用事务i进行IN事务数据传输。

  • USB主机发送IN令牌包,指示这是一个IN事务。USB主机和设备当前的数据包ID均为DATA1.
  • USB设备收到IN令牌包后,向使用当前的数据包DATA1向主机发送数据。
  • USB主机收到据据包DATA1后,确认无误后,将自己的数据包PID从DATA1变为DATA0,并将USB高备发送ACK握手包。
  • 不过由于种种原因,USB设备未收到该ACK握手包或该握手包无效或丢失,USB设备端的令牌包保持不变。
  • USB主机继续使用IN令牌包指明继续接收数据。
  • 由于上一次事务中,USB设备的数据包序列未变化,则USB设备认为上一次数据传输失败,使用原来的令牌包重传上一包数据。
  • USB主机收到数据后,发现收到的数据包PID为DATA0,不等于理论上的DATA1,故认为USB设备上一次没有收到ACK,故USB主机忽略该数据包,并向USB设备发送ACK握手包,让USB设备进行数据包序列同步即从DATA1翻转为DATA0
  • 这次ACK握手包正确无误的传输并且USB设备接收到了,USB设备翻转数据包序列。所以这次事务变成了上一个事务i的重传事务。
  • USB主机继续使用IN令牌接收数据,后续数据传输成功后并且USB设备接收到了主机的ACK,再次进行数据包序列翻转。

    正确返回的ACK数据据序列数据传输可见:http://www.usbzh.com/article/detail-706.html

OUT事务ACK错误或丢失的数据翻转(DATA TOGGLE)

OUT事务ACK错误或丢失的数据翻转(DATA TOGGLE)如下图所示:
OUT事务ACK错误或丢失的数据翻转(DATA TOGGLE)

  • USB主机在发送数据之前,主机和设备的数据包序列均为DATA0
  • USB主机发送OUT令牌包,指示USB设备接收数据
  • USB主机使用DATA0数据包发送数据
  • USB设备接收到数据确认无误后,翻转自己的数据包序列,从DATA0变为DATA1,并向USB主机发送ACK握手包
  • 由于种种原因,ACK握手包发送失败或丢失了,USB主机不进行数据包序列翻转,保持当前数据数据包序列不变,即为DATA0
  • US主机待等超时后,重传OUT事务
  • USB主机发送OUT令牌到设备指明设备接收数据
  • USB主机继续使用DATA0数据包序列发送上一次未收到ACK的数据包
  • USB设备收到数据包后发现和其预期的DATA1数据包序列不一样,而是DATA0,则认为当前事务是重传上一次的OUT事务,则忽略该数据包并向USB主机返回ACK握手包,并保持自身数据包序列不变。
  • USB主机收到ACK握手包后,将自己当前的数据包序列从DATA0番转为DATA1
  • USB主机继续发送数据,使用事务i+1,该次数据传输,ACK正确无误。
HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB2.0 数据包DATA0,DATA1,DATA2
数据包是用于传输数据的,由8位的包标识PID,数据字段和16位的循环冗余校验字段CRC组成。PID字段:用于指明不同的数据包类型。支持 4 种数据包,分别为: DATA0 、 DATA1 、DATA2 和MDATA。 在介绍的数据触发机制中,使用 DATA0 和 DATA1。SPLIT 令牌事......
UAC Feedback端点
下面转一段对USB feedback的理解:这段时间一直在做USB Audio Device(UAC)设备的开发工作。由于UAC采用的是isochronous endpoint来传输数据,对时钟的要求较高。但无奈我们的嵌入式平台的时钟并不准,数据同步就成了问题。经过研究,发现只能使用异步模式来解决这......
USB2.0 NAK握手包
NAK 握手包一般由 USB 设备发出。对于IN数据传输,表示 USB 设备没有计划向 USB 主机发送数据;对于 OUT 数据传输,表示 USB 设备无法接收 USB 主机发送的数据。NAK包的PID的低4位为1010,故高4位的补码为0101,所以其包PID值为0x5a.PID含......
USB2.0 数据包
USB主机发出的包在USB总线上广播,所有在USB总线上的设备需要根据自己的设备地址对由USB主机广播的令牌包进行过滤。如果该令牌包的地址与其自身地址不匹配,USB设备默认不处理即忽略该令牌包。USB包的目标地址只有7位,所以一条US总线上最多可以挂接127个USB设备(地址0用于设备在枚举过程中......
USB超高速设备描述符的bMaxPacketSize0为0x09
USB3的设备中,其USB设备描述符和2.0的结构一致,不过在含义上有的字段稍有区别。比如说在USB3.2的版本中,其设备描述符中的bMaxPacketSize0和USB2.0有就所不同。在USB2.0中bMaxPacketSize0代表的是USB设备默认端点0的最大包的大小,一般为0x40即64字......
USB2.0 ACK握手包
ACK握手包用于当USB数据传输的接收方正确接收到数据包时,接收方将返回 ACK 握手包ACK 握手包表征了一次正确的数据传输,之后才可以进行下一次事务处理。ACK广泛用于通读协议中,一般用于确认从接收方接收到数据正确无误,特别是在TCP/IP协议栈中,ACK的使用更加让人理解深入。我们嘴里......
USB2.0包Packet的组成
USB包由SOP,SYNC,Packet内容和EOP组成.SOP起始包起始包SOP(Start Of Packet),通过将D +和D-线从空闲状态驱动到相反的逻辑电平(K状态),由始发端口发信号通知分组的开始(SOP)。 此开关级别表示SYNC字段的第一位。 当重新传输到小于±5 ns时,集线器......
USB 同步传输端点的数据包PID序列及额外传输端点大小
对于同步传输:如果输入端点提供的负载数据小于端点描述符指定的最大负载数据,则主机端将不再该端点提供进一步的输入事务。这是因为所对USB设备来说,所有的数据传输都是由主机发起的。对于数据输入IN事务,虽然数据的传输方向为设备端到主机,但是该事务却是由主机发起。由于设备的输入端点提供的负载数据小于该......
USB 高速高带宽端点wMaxPacketSize
USB的端点可以设置为高速高带宽端点。我们知道,USB的数据传输类型有4种,分别为控制传输,中断传输,批量传输和同步传输。而端点类型与之要对应。除过控制传输外,其余三种传输使用于应用的数据传输。USB使用端点描述符的wMaxPacketSize来配置端点为高速高带宽端点,主要表现在bit11-12,......
USB数据包的最大响应时间及超时指标
每个 USB 设备都必须响应默认管道上的 Setup 包。Setup包用于设备的检测和配置,并执行一些常用功能,例如设置 USB 设备的地址,请求设备的描述符或检查端点的状态。符合 USB 规范的主机希望所有请求最多在5秒内得到处理。它还为特定请求指定了更严格的时间规定:不包含数据阶段(dat......
USB2.0 握手包
握手包跟随在令牌包或者数据包之后,组成一个完整的事务,是对一次事务完成的确认。USB主机或者USB设备会根据事务的完成状态返回相应的握手包握手包由8位的PID构成,用于数据传输的末位报告本次数据传输的状态。握手包之后使是整个事务处理的结束信号EOP.握手包根据PID的不同,可分为:PI......
USB2.0 STALL握手包
STALL 握手包一般由 USB 功能设备发送,表示该 USB 功能设备不支持这个请求,或者无法发送和接收数据。 STALL 握手包分为以下两种情况。协议 STA LL 握手包:在控制传输中使用。协议 STALL 握手包表明了该 USB 功能设备不支持这个请求协议(如设备限定描述符的获取)。功能......
USB2.0 NYET握手包
在USB2.0高速设备OUT事务中使用,它表示设备本次数据成功接收,但是没有足够的空间来接收下一次数据。主机在下一次输出数据时,将先使用PING命令牌包来探测设备是否有足够的空间接收数据,一面不必要的带宽浪费。如果低速或者全速设备和高速HUB之间的事务一直没有完成,高速HUB也会向主机返回一个NY......
USB2.0 ERR握手包
ERR握手包仅用于高速模式下,其功能是由USB集线器HUB向主机报告挂载其上的低速或全速设备错误。PID含义说明1100特殊用途ERRSPLIT事务中表示出现错误......
USB传输的事物拆分和ACK机制
USB的事务拆分USB每次传输的数据包大小不得超过端点的最大包大小,如果需要传输超过端点的最大包大小,是需要进行事务传输的,即一个事务无法完成的数据长度,会拆分成多个事务,并且提几个事务必须按最大端点大小进行数据传输,最后一个事务按实际剩余数据大小传输。这个我们在USB2.0 事务 一切我们有详细的......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!