打印
[ZLG-ARM]

zlg 的 USBDMA 可以传送可变长度的数据吗

[复制链接]
2289|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liwenz|  楼主 | 2010-12-13 13:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
zlg的usbDMA 传送数据例子很好,但他是传送固定长度的数据3072, 我觉得要把它的长度改为1024也可以,只要改
#define DATALENGTH   3072   /* 定义DMA传输的长度
即可。
我的问题是我要传送可变长度的数据,是否可行?
在arm这边怎么得到数据的长度?

相关帖子

沙发
liwenz|  楼主 | 2010-12-13 18:42 | 只看该作者
设置函数usbDevDMASetTransLength可以改变接收长度,就是要求事先知道接收的数据长度
问题是10长度是不是很稳定,有时会死掉pc端的程序。
pc端代码:
发送:int ret = zyUSB_WriteData(1,sendbuf,10,1000);
//通过逻辑端点1的OUT端口发送10字节数据
接收: ret = zyUSB_ReadData(0,recbuf,10,1000);        //通过逻辑端点1的IN端口接收10字节数据

发送:int ret = zyUSB_WriteData(1,sendbuf,3072,1000);
//通过逻辑端点1的OUT端口发送10字节数据
接收: ret = zyUSB_ReadData(0,recbuf,3072,1000);
//逻辑端点1的IN端口接收10字节数据

arm端代码:
#define DATALENGTH    3072                             /* 定义DMA传输的长度            */
#define DATALENGTH2   10   
{
ulSetLen = usbDevDMASetTransLength(4, DATALENGTH);  /* 配置物理端点4 DMA传输长度 */
ulSetLen = usbDevDMASetTransLength(2, DATALENGTH2);      //配置物理端点2 DMA传输长度
    while(1) {
        usbDevServe();                                                  /* 处理USB事件                  */
        if (bEPPflags.bits.configuration == 1) {
            if (bEPPflags.bits.ep2_rxdma == 1) {                    /* 物理端点4 DMA接收数据完成    */
                USB_ENTER_CRITICAL_SECTION();
                bEPPflags.bits.ep2_rxdma = 0;
                USB_EXIT_CRITICAL_SECTION();
                pucSrc = usbDevDMAGetBuffer(4);
                pucDst = usbDevDMAGetBuffer(5);
                memcpy(pucDst, pucSrc, DATALENGTH);             /* 拷贝数据到目标缓冲区         */
                ulSetLen = usbDevDMASetTransLength(5, DATALENGTH);
                                                                        /* 设置物理端点5缓冲区大小      */
                usbDevDMAStartIN(5);                                    /* 启动物理端点5 DMA传输        */
                ulSetLen = usbDevDMASetTransLength(4, DATALENGTH);
                                                                        /* 设置物理端点4缓冲区大小      */
            }
  if (bEPPflags.bits.ep1_rxdma == 1) {                        /* 物理端点4 DMA接收数据完成    */
                USB_ENTER_CRITICAL_SECTION();
                bEPPflags.bits.ep1_rxdma = 0;
                USB_EXIT_CRITICAL_SECTION();
                pucSrc = usbDevDMAGetBuffer(2);
                pucDst = usbDevDMAGetBuffer(3);
                memcpy(pucDst, pucSrc, DATALENGTH2);       /* 拷贝数据到目标缓冲区         */
                ulSetLen = usbDevDMASetTransLength(3, DATALENGTH2);
                                                                        /* 设置物理端点3缓冲区大小      */
                usbDevDMAStartIN(3);                                    /* 启动物理端点3 DMA传输        */
                ulSetLen = usbDevDMASetTransLength(2, DATALENGTH2);
                                                                        /* 设置物理端点2缓冲区大小      */
            }
        }

使用特权

评论回复
板凳
liwenz|  楼主 | 2010-12-14 18:09 | 只看该作者
看来通过设置usbDevDMASetTransLength(4, DATALENGTH); 就可以改变长度,不知道长度有什么要求或限制不,比如128长度。
不好的地方就是要开始设置好长度。 读取的时候,不知怎么确定接到数据的长度

使用特权

评论回复
地板
liwenz|  楼主 | 2010-12-19 20:45 | 只看该作者
有人用过吗

使用特权

评论回复
5
amini| | 2010-12-28 10:10 | 只看该作者
这个还真没用过。帮你顶上去。

使用特权

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

本版积分规则

12

主题

107

帖子

0

粉丝