[技术问答] 分不多,问题就是金钱!NUC472的USB-MassStorage采用DMA发送失败

[复制链接]
2367|10
 楼主| jackem 发表于 2014-8-29 13:36 | 显示全部楼层 |阅读模式
本帖最后由 jackem 于 2014-8-29 13:45 编辑

我用的是nuc472芯片,调式MassStorage协议通信,EP接收采用中断方式,EP发送采用DMA方式,现在遇到困难,DMA发送失败啊,就是启用端口DMA传输后,g_usbd_DmaDone得不到置位,导致死在循环内。请问哪些情况会导致DMA完成无法被触发?
 楼主| jackem 发表于 2014-8-29 13:41 | 显示全部楼层
补充一下,MCU端EP中断接收正常。上位机给nuc472发送数据能成功,就是等不到nuc返回的数据,调式发现MCU死在了如下循环里面,一筹莫展啊。。。。。。。
void USBSendDataByDMA(uint32_t u32Addr, uint32_t u32Len)
{
    /* Enable BUS interrupt */
    UBSD_ENABLE_BUS_INT(USBD_BUSINTEN_SUSPENDIEN_Msk | USBD_BUSINTEN_RSTIEN_Msk | USBD_BUSINTEN_VBUSDETIEN_Msk |
                                                USBD_BUSINTEN_DMADONEIEN_Msk);
    /* bulk in, dma read, epnum = 1 */         //BULK-IN端口为EPC
    USBD_SET_DMA_READ(BULK_IN_EP_NUM);
    USBD_SET_DMA_ADDR(u32Addr);
    USBD_SET_DMA_LEN(u32Len);
    g_usbd_DmaDone = 0;
    g_usbd_ShortPacket = 1;
    USBD_ENABLE_DMA();
    while(g_u8MscStart)
        {
        if (g_usbd_DmaDone)
        {
        break;
        }
        if (!USBD_IS_ATTACHED())
        {
         break;
        }
    }
}
haolaishi 发表于 2014-8-29 14:02 | 显示全部楼层
建议你烧官方的程序试试,然后在官方的上面改,比如DMA的时钟,触发,等等,可以参考官方DMA的初始化例程和应用手册

评分

参与人数 1威望 +2 收起 理由
jackem + 2 淡定

查看全部评分

 楼主| jackem 发表于 2014-8-29 15:25 | 显示全部楼层
自己已经解决。必须在main中一直检测,而不能在别的函数中调用USBSendDataByDMA,估计是寄存器端点位置的问题。
haolaishi 发表于 2014-8-30 08:30 | 显示全部楼层
jackem 发表于 2014-8-29 15:25
自己已经解决。必须在main中一直检测,而不能在别的函数中调用USBSendDataByDMA,估计是寄存器端点位置的问 ...

usb一直是我不敢触碰的地方,给你赞一个
zhang..yb 发表于 2014-8-30 11:49 | 显示全部楼层
这芯片的 USB 很难搞,我也卡在这, 用 Bus Hound  发Bulk Out  512 字节, 下位机接收到, 但用 libusb 的 Bulk write 函数发 512 字节,下位机死活不收,libusb 能找到该 USB设备,就是不能收发。
sdnumcu 发表于 2014-8-30 22:49 来自手机 | 显示全部楼层
USB是个硬骨头
zxf0168 发表于 2014-8-30 23:07 来自手机 | 显示全部楼层
我是来接分的
 楼主| jackem 发表于 2014-9-1 14:36 | 显示全部楼层
好样的,这么想要它,那分就给你好了!
le062 发表于 2014-9-12 21:47 | 显示全部楼层
道听途说 ,该usbd的dma有问题
598330983 发表于 2014-9-15 19:40 | 显示全部楼层
楼下的你怎么看?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:没有完美的追求,只有执着的理想!

3

主题

64

帖子

1

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