【问题标题】:Please clarify when a USB device resets or changes it's Data toggle请说明 USB 设备何时重置或更改其数据切换
【发布时间】:2013-07-30 18:50:00
【问题描述】:

我正在开发一个新的 USB 设备,我正在尝试了解如何跟踪/管理数据切换。网络上存在相互矛盾的信息,但大多数意见/经验是设备在枚举后从不更改其数据切换,某些设置传输除外。

这似乎与我对规范的阅读相冲突。

关于批量传输 USB2.0 规范第 8.5.2 节说“主机始终使用配置事件将总线传输的第一个事务初始化为 DATA0 PID。第二个事务使用 DATA1 PID,并且连续的数据传输交替批量传输的剩余部分。”

我没有得到这里(也许我误解了)是似乎没有像批量传输这样的东西,至少在这个协议级别没有;只有批量事务 --> IN/OUT-DATA0/1-HANDSHAKE ...如果是这样,数据切换何时会根据第 8.5.2 节进行切换?

此外,在第 8.5.3 节中,它说“SETUP 始终使用 DATA0 PID 作为 SETUP 事务的数据字段。”

在同一部分中进一步说“状态阶段由前一阶段的数据流方向的变化来描述,并且始终使用 DATA1 PID。”

现在,假设我在开始的设置传输中做出响应

SETUPTOKEN|DATA0|握手,

然后是一大堆以

开头的交易

IN|DATA1|HANDSHAKE 并在状态阶段之前以 IN|DATA1|HANDSHAKE 结尾。

此时我希望我的数据切换为 0(在发送 DATA1 并接收到 ACK 之后,我的切换从 1 切换到 0 以预期下一个数据包中的 DATA0...我知道,我应该期待状态阶段,但我试图说明这一点)。

现在状态阶段符合 USB 2.0 规范

输出|数据1|但我的数据切换为 0。

但如果我从不干扰切换,我会被卡住,因为我必须忽略 DATA1 并且不响应,并且主机将不得不一遍又一遍地重新发送。

所以,我是否必须通过忽略切换不匹配、发送 ACK 并将切换保持在 0 来进行干预(即假装我的数据切换与 Data1 匹配并翻转它以期待下一个非 SETUP 传输/事务?

如果我遵循我所阅读的意见,除了设备返回 STALL 之外,没有任何解决办法。

我们将不胜感激,在此先感谢您。

编辑:

也许我应该重新表述这个问题 - 我是否误读了第 8.5.2 节,它们只是指任何控制传输而不是“总线传输”吗?任何人都可以确认主要操作系统(如果有的话)是否在控制传输的重置阶段强制执行 Data1 事务,而不管在前一个事务中使用了哪种数据包类型(Data0 或 Data1)?

【问题讨论】:

    标签: usb data-synchronization


    【解决方案1】:

    批量端点的数据切换会针对该端点上的每个批量事务进​​行切换。如图 8-35 所示。第 8.5.2 节仅涉及批量交易,而不是控制转移。数据切换只会针对特殊事件重新初始化。

    控制传输的数据切换规则不同,控制传输的最后一个事务(一个传输由多个事务组成)总是将其数据切换设置为 1。这在图 8-37 中最清楚。

    【讨论】:

      【解决方案2】:
      • 数据切换是 PER ENDPOINT。
      • 有 32 个可能的端点,每个端点都由“端点编号”和方向 (IN/OUT) 组合寻址。
      • 不要混淆“端点”和“端点编号”这两个术语!
      • 控制传输使用一对具有相同编号的 2 个端点。
      • 通常只在编号为 0 的端点对上执行控制传输。
      • 当在 OUT 端点上接收到编号为 X 的 SETUP 令牌时,编号为 X 的两个端点都会将其数据切换重置为 DATA0(这意味着该端点上的下一个 DATA 数据包必须是 DATA1)。
      • 现在再次阅读第一条规则:数据切换是 PER ENDPOINT。
      • 这意味着如果数据阶段使用了一堆 IN 事务,这只会触发编号为 X 的 IN 端点的 DATAx 切换。OUT 端点保持不变,这意味着无论有多少 IN 事务,它都需要一个 DATA1发生。这同样适用于另一个方向。如果数据阶段使用一堆 OUT 事务,则只有 OUT 端点被切换。因为 Data 阶段只能去一个方向,而 Status 阶段总是去另一个方向,所以 Status 阶段总是使用 DATA1 数据包。这没有什么特别的。这只是数据切换是每个端点的结果,而不是每个端点编号!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        • 2021-07-30
        • 2013-05-14
        • 2012-08-07
        • 2014-06-23
        • 2011-02-28
        相关资源
        最近更新 更多