嵌入式学习小组
直播中

李猛

7年用户 1553经验值
私信 关注

NUC505 USB Mass Storage SD例程DMA数据丢失或错乱问题如何解决?

硬件: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
很明显
数据包被莫名其妙打散,和粘连了。

这是为什么,怎么解决呢?

回帖(1)

王娟

2024-1-17 15:07:06
这个问题可能由于TMR0定时器中断与DMA传输冲突导致。当TMR0中断触发时,如果DMA传输仍在进行中,可能会造成DMA传输的数据丢失或错乱。

解决方法:

1. 禁用TMR0定时器中断,在进行DMA传输期间不使用定时器中断。

2. 在定时器中断处理函数中增加延时等待的代码,等待DMA传输完成后再进行操作。

3. 调整TMR0定时器的中断优先级和DMA通道的优先级,确保DMA传输不会被定时器中断打断。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分