2

我正在开发一个新的 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 匹配并在预期下一次非设置传输/事务时翻转它?

如果我遵循我读过的意见,除了设备返回 STALL 之外,没有任何解决方案。

对此问题的一些帮助将不胜感激,因此在此先感谢。

编辑:

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

4

2 回答 2

1

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

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

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