[技术问答] NUC505 USB Mass Storage SD例程DMA数据丢失或错乱问题

[复制链接]
1849|6
 楼主| mxzwish 发表于 2017-10-20 14:15 | 显示全部楼层 |阅读模式
本帖最后由 mxzwish 于 2017-10-20 14:17 编辑

硬件:NUC505官方开发板
软件:BSP包3.02
例程:USBD Mass Storage SD

在官方例程上仅做如下修改,新增TMR0定时器,以PERIODIC周期模式工作,频率10000Hz。TMR0的中断处理函数什么都不做,仅给一个全局变量TickCount++
该例程就立即不能工作了!主机不能识别MassStorage。
wireshark抓usb包分析发现,HOST发出的READ命令收到的回复报文异常。
例如主机请求read 长度65536,nuc505只回复了 65523,少了13个字节!
还有很多种异常的可能性,我上面的例如只是其中一种。
最终发现数据包异常的表现其实就是数据包被莫名其妙打散或粘连了。

下面我通过串口打印USB包的TAG和DMA请求传输数据的长度,以及时间戳
read命令回复的数据,DMA请求是正确的,有16个0x1000长度的DMA提交,和一个CSW回复报文
主机上wireshark抓到的回复被打散了。
是一个539 和一个 65064字节 这样两个USB报文
正确的回应包应该是 65563字节的read返回数据,和一个40字节的 CSW 回复

539+65064 = 65603
65563 + 40 = 65603
很明显
数据包被莫名其妙打散,和粘连了。

这是为什么,怎么解决呢?
usbd.png


643757107 发表于 2017-10-20 18:25 | 显示全部楼层
没玩过USB,看看谁用过这个功能。
yiyigirl2014 发表于 2017-10-21 21:21 | 显示全部楼层
 楼主| mxzwish 发表于 2017-10-23 09:45 | 显示全部楼层
数据包粘连这个不是问题,是正常的。
另外官方例程还有2个坑:
1.g_u8MscOutPacket 这个标志有问题,导致在中断来临后有概率无法进入接收流程,典型的状态机标志覆盖问题,导致了Host->Device方向数据丢失
2.MSC_ActiveDMA 这个流程有问题,但是我不知道问题出在哪,问题的表现就是,配置了DMA缓冲,并启用DMA传输后,DMA传输迟迟未能结束。导致Device->Host方向数据丢失。

第一个比较好解决,第二个不知道怎么解决。
 楼主| mxzwish 发表于 2017-10-23 13:00 | 显示全部楼层
仔细研究了下。Device->Host方向的传输必须等待InToken才能发送,而不是像例程那样直接循环发送,这样是不行的。
总体来说。这个官方例程,过于简陋,坑太多,没法直接应用。
 楼主| mxzwish 发表于 2017-11-9 16:12 | 显示全部楼层
重写了USB状态机部分,主要是USB中断处理代码。
MSC部分,官方的代码逻辑混乱,也全重写了……
至此问题解决。
in token到来的时候写数据
out token到来的时候读数据
sblpp 发表于 2020-2-21 12:22 | 显示全部楼层
mxzwish 发表于 2017-11-9 16:12
重写了USB状态机部分,主要是USB中断处理代码。
MSC部分,官方的代码逻辑混乱,也全重写了……
至此问题解 ...

您好,能分享下您的NUC505的USB程序吗?非常感谢~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

60

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部