收藏 分享(赏)

PDIUSBD12使用心得.doc

上传人:fmgc7290 文档编号:7109186 上传时间:2019-05-06 格式:DOC 页数:3 大小:28.50KB
下载 相关 举报
PDIUSBD12使用心得.doc_第1页
第1页 / 共3页
PDIUSBD12使用心得.doc_第2页
第2页 / 共3页
PDIUSBD12使用心得.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

1、PDIUSBD12 使用心得说句实在话,ZLG 团队做的软件包真的非常好,非常专业!基本上不用怎么修改就可以直接使用。不过在使用过程中,还是有些地方需要我们去注意。以下是我们公司在使用过程中出现的情况,请 ZLG 团队及 D12 的用户们多多交流!1 当 MCU 通过 D12 发数据给主机时不能简简单单的调用写函数,如下:D12_WriteEndpoint(5,64,filebuffer);如果您用的是 51 等慢速的单片机可能没什么事情,当用 ARM 等快速的处理器作大量数据传输时可能会出现丢包的现象。在 MCU 连续的给主机发包的过程中,主机还没有将上一个包的数据从 D12 读走(就是 D

2、12 的缓冲区处于满的情况), MCU 又将另一个包写进去时会覆盖掉以前的。因此在每写入一个包时必须先判断 D12 有没有空的缓冲区,如下: while (1) /如果端点的两个缓冲区都为满,则等待outportb(D12_COMMAND,0x85);EndpState = inportb(D12_DATA);EndpState if (EndpState != 0x60) /有空缓冲区, 则发送数据break;D12_WriteEndpoint(5,64,filebuffer);2 同样,在主机给 MCU 发送大量数据时也可能会产生丢包的情况。起初我们的 MCU是直接查询 bEPPflags

3、.bits.ep2_rxdone 来判断 D12 是否收到主机数据,然后读取。下面的代码在主程序中执行,如下:if (bEPPflags.bits.ep2_rxdone = 1) /收到主机下载的数据 for(i=0;i64;i+) /从缓冲区中读走一包数据CheckSum +=EpBuf; /累加校验和*pUsbByte= EpBuf; /保存数据pUsbByte +;RecDataLong += 64; /累加收到的数据长度ARMDisableInt(); /关中断,我觉得没有必要,因为都没有判断该标志bEPPflags.bits.ep2_rxdone = 0; /清空端点 2 收到数据标

4、志ARMEnableInt();有一种很奇怪的现象:当 PC 机打开的应用程序越多且频繁的操作这些程序时,丢包的现象越严重!所以当我要从 PC 机发送一个几十 MByte 的文件到 MCU 时,就不能让 PC 机做其它事情了,否则就出现丢包。起初我们在 PC 机软件做了很多努力,但都失败。后来发现不是 D12 里的缓冲区被覆盖了,而是软件包中的 EpBuf 缓冲区被覆盖。因为 D12 接收到主机发来的一个包后会产生中断,然后将数据放入 EpBuf,而此时如果我们还没有从EpBuf 读走数据时, D12 又从主机收到一个包产生中断,此时读取包数据时就会将 EpBuf原来的数据覆盖掉,因为端点接收

5、数据处理函数便没有去判断 bEPPflags.bits.ep2_rxdone是否等于 0,如下:void ep2_rxdone(void)INT8U len;D12_ReadLastTransactionStatus(4); /清中断标志位len = D12_ReadEndpoint(4,EP2_PACKET_SIZE,EpBuf); /读取缓冲区中的数据if (len != 0)bEPPflags.bits.ep2_rxdone = 1;此时由于已经调用了 D12_ReadEndpoint(4,EP2_PACKET_SIZE,EpBuf)函数,而在该函数中写了清缓冲区的命令,所以主机就会继续

6、往 D12 发送数据,而使 EpBuf 内容被覆盖。我觉得最简单最保险的方法就是从 D12 中读出的数据直接存入自己的缓冲区中,就可以保证在给 D12 写清缓冲区命令前数据都被存放好了,而且也提高了响应速度!修改 ep2_rxdone函数如下:extern unsigned char *pUsbByte; /指向自己定义的缓冲区void ep2_rxdone(void)INT8U len;D12_ReadLastTransactionStatus(4); /清中断标志位if (pUsbByte pUsbByte += len;RecDataLong += len; /累加实际收到的数据长度if (len != 0)bEPPflags.bits.ep2_rxdone = 1;USBTestBack += 1;为什么 PC 机运行的程序越多且在频繁的操作这些程序时,丢包的情况越严重呢?我是这样理解:多任务操作系统(windows 也不例外)的调度是由定时中断触发的,所以两次调度的时间间隔是个定值。在第一次调度时,由于很多优先级更高的任务将 USB 发送任务推迟了。而在第二次调度时,第一次优先级高的任务又被挂起,而使第二次 USB 发送任务没有被推迟。在最坏的情况下两次 USB 发送的时间间隔远比正常情况下的时间间隔短,就使MCU 出现了 EpBuf 包被上一次覆盖的情况。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报