我正在开发一个新的 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)?