【发布时间】: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)?
【问题讨论】: