STM32和AT32 USB PID (DATA0/DATA1)不匹配导致数据丢包
如下以Bulk传输举例:
正常在最开始的传输会设置为DATA0,如下是一个示例Toggle翻转的示例:
1. 发送方发DATA0,接收方成功收到之后将Toggle翻转为1,表示下一次接收DATA1
2. 发送方接收到ACK之后,将Toggle翻转为1,表示下一次发送DATA1
3. 发送方发DATA1,接收方成功收到之后将Toggle翻转为0,表示下一次接收DATA0
4. 发送方接收到ACK之后,将Toggle翻转为0,表示下一次发送DATA0
在这里就会存在一个问题:如果发送方和接收方的Toggle位不匹配,此时应该如何处理?
下图是以这个示例toggle不匹配的处理:
1. 发送方发DATA0,接收方成功收到之后将Toggle翻转为1,表示下一次接收DATA1
2. 发送方由于某些原因没有收到接收方返回的ACK,因此toggle不会翻转,下一次继续发送DATA0
3. 发送方继续发送DATA0,此时接收方发现toggle不匹配,就忽略数据,toggle 也不翻转,但此时会正常回复发送方ACK
4. 发送方接收到ACK之后,将Toggle翻转为1,表示下一次发送DATA1
5. 发送方发DATA1,接收方成功收到之后将Toggle翻转为0,表示下一次接收DATA0
6. 发送方接收到ACK之后,将Toggle翻转为0,表示下一次发送DATA0
我们来看一个在实际应用中碰到的丢数据的情况,问题的现象就是每次打印数据都会丢掉一个数据包。
如下是打印机打印数据抓包的数据:
Transfer 0 是主机发送的第一个数据包,发送DATA0
Transfer 3 是主机发送的第二个数据包,发送DATA0
分析两次发送可以发现,设备端在接收到Transfer 0的DATA0之后,会将toggle翻转为1,表示下一次接收DATA1.主机第二次依旧发送了DATA0,按照前面图示的处理,会把Transfer 3第二次发送的DATA0数据丢掉,这样就造成了数据的丢包。
解决方法:
分析抓到的数据包,在Trasnfer 0和Transfer 3中间有还有两个Transfer。
在收到SET_INTERFACE的时候,我们将打印机的toggle 翻转为0.
这样就和主机端的toggle匹配,就不会丢数据
|