打印
[AT32F403/403A]

STM32和AT32 USB PID (DATA0/DATA1)不匹配导致数据丢包

[复制链接]
1267|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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匹配,就不会丢数据


使用特权

评论回复
沙发
muyichuan2012| | 2020-8-19 19:42 | 只看该作者
AT32的USB和STM32的兼容性还是很高的。

使用特权

评论回复
板凳
zeshoufx| | 2020-8-20 09:12 | 只看该作者
谢谢分享

使用特权

评论回复
地板
rose嘉| | 2020-8-20 09:48 | 只看该作者
感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

24

帖子

0

粉丝