netpk
驱动牛犊
驱动牛犊
  • 注册日期2002-08-23
  • 最后登录2010-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3041回复:33

USB答疑――jinghuiren请进

楼主#
更多 发布于:2003-01-22 10:51
我使用的是Cypress的2131QC系列,时钟12M(可以使用24M),集成的51是加强版,333ns一个周期,Bulk时可以使用快速传输方式,内置地址AutoPoint,可以把buffer当作FIFO使用,按照大侠的意思,把两个Bufferpair,使用Cypress的generaldriver,App中不断发DeviceIo,取数据,这个样子速度应该是最快的了,但是我的速度还是不够理想,不知道为什么,我使用的Ad 12位的,采样速率200K,请指教,谢谢!

最新喜欢:

wcimzdwcimzd
netpk
驱动牛犊
驱动牛犊
  • 注册日期2002-08-23
  • 最后登录2010-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-11 12:44
还是非常感谢jinghuiren兄,清算结题,呵呵……
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-10 13:45
那我也没什么招了,我的全是理论上的东西,具体的传输我还真没做过,因此里面有什么问题我还真不知道,哎,没办法,我无法解除你的郁闷了,真是抱歉!

只好帮你顶一下,希望有那位高人能指点一下!
netpk
驱动牛犊
驱动牛犊
  • 注册日期2002-08-23
  • 最后登录2010-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-09 15:21
1ms一个包是我对于64K速度的猜测,具体我也不知道怎么回事,因为我没有办法看到具体的传输过程,呵呵,我在固件的主程序中不停地轮询端点的空闲位(Busy位),一旦发现可以用就直接写传输字节寄存器为64,Arm端点传输,只开了端点0的几个必要的中断(满足setup包的),其余的都关闭了,应该是没有问题的,不知道怎么回事,郁闷死了……
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-09 13:17
那就奇怪了,你要使用的bulk方式没道理1ms只能进行一次传输呀。
netpk
驱动牛犊
驱动牛犊
  • 注册日期2002-08-23
  • 最后登录2010-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-09 09:39
各位新年好!!
感谢jinghuiren兄,我也是放假今天才回来,呵呵
看了jinghuiren兄的建议觉得有点道理,可是我觉得我已经是使用的Bulk方式了,不知道那个地方没有做对,还是请给个思路吧
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-08 12:05
哦,你要先读一下.c文件,里面有说明:
/开始计时处调用SetBeginPoint(),返回BOOL
//结束计时片调用SetEndPoint(),返回BOOL
//需要得到时间消耗处调用GetTimeLapse(),返回double,单位为ms

例如:你要计算一个读取一个512字节数据包所需要的时间,可以这样用

double nTimes;
SetBeginPoint();
ioctl();//读取数据的函数
SetEndPoint();
nTimes = GetTimeLapse();

nTimes 就是所用的时间,
然后你再在ioctl();之前加上一个for(int i = 0; i<n; i++)循环,得到的就是读取n个512数据包所用的时间了。
hemu
驱动小牛
驱动小牛
  • 注册日期2002-04-10
  • 最后登录2004-06-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-08 11:32
jinghuiren 你的测试程序好像有问题,不少变量不知怎么弄,最后我自己做了个近似测试,速度竟然只有200k/s,与我想象相差不少,不过基本满足我们的需求了。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-02-07 19:10
哎,之前放假回家去了,今天才回来,太早了!!!

我看你用的方法好像还是使用的中断传输吧,那样的话,1.1协议规定最多1ms进行一次64B的bulk传输。我想你需要使用bulk方式,这样在一个frame里面传输的数据包才能达到你的要求。
netpk
驱动牛犊
驱动牛犊
  • 注册日期2002-08-23
  • 最后登录2010-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-01-29 15:33
怎么没有人回答啊,急死了……
jinghuiren兄快来帮忙啊
感激中……
netpk
驱动牛犊
驱动牛犊
  • 注册日期2002-08-23
  • 最后登录2010-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-01-27 09:51
jinghuiren兄,那个不能识别的问题已经解决,呵呵,我用Keil重新建立一个工程,把源文件导入,重新编译就可以了,我猜想可能是Samples中的工程是Keil早些版本建立的,和现在的版本不是很兼容,呵呵,害了我改了很多天的程序,呵呵
一个问题请教:我按照你的思路做了程序,也参考了BulkPerformance的思路(它说一个Frame可以容纳13个Bulk),先是在固件中使用Poll的方法,测试速度是1s大概1000个包(64B),就是64k的速度,换成端口中断(设置INnBC)只有32k的速度了,我使用的Ep2,pair with Ep3,为测试速度,没有填写端点缓冲区,只要发现Ep2可用就设置In2Bc为64,上层App不停循环发DeviceIo,返回非零就加成功计数变量,应该远远不止这个速度才对啊,感觉一个Frame(1ms)才读成功一次Bulk包(64B),真是想不通那个环节出了问题……
如何编写App或者Driver才能让一个Frame中能够容纳n(至少>3)个Bulk包?
jinghuiren、Hemu兄以及看到这个帖子的朋友们有没有什么建议?
谢谢……
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-01-24 22:09
我用的方法只是在读端点缓冲区的ioctl命令前面加了一个调用cpu指令的命令,然后在读出来并存到文件中后有调用了一次,两者相减再出一当前的cpu周期数就是消耗的时间,其实64k还是太少,我是让这个ioctl循环了1000次(也就是64M数据)测出的时间。为了测这个时间,我同学专门为我编了一个小函数,贴出来让你看看:
附件名称/大小 下载次数 最后更新
2003-01-24_TimeLapse.rar (1KB)  0
netpk
驱动牛犊
驱动牛犊
  • 注册日期2002-08-23
  • 最后登录2010-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-01-24 15:42
我也知道是固件问题,呵呵,我就是不知道是怎么回事,那可是Cypress的原版Samples程序啊
hemu
驱动小牛
驱动小牛
  • 注册日期2002-04-10
  • 最后登录2004-06-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-01-24 15:14
jinghuiren
\"测的时间是8051读外部ram填充端点然后再传输到主机方这段时间\"
我一直很困惑,这个速度怎么测,要用仪器吗?还是用软件测阿
netpk
那应该是固件的问题了,特别是设置pipe一段。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-01-24 14:08
这个偶不知道,也很想知道,你搞出来了记着贴出来呀。
netpk
驱动牛犊
驱动牛犊
  • 注册日期2002-08-23
  • 最后登录2010-09-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-01-24 13:17
非常感谢大家的帮助,呵呵
我可是使用的Cypress的Samples啊,驱动也是使用的Cypress的Gernal driver,就是想试一下,就出现了那个奇怪的问题,我现在还是改我以前的成功的固件程序,编译可以找到Pipes,感觉应该是固件程序问题,下去后,GetPipe,好像程序根本就没有跑一样,我看了一下我那个成功的程序的Keil设置,也没有发现什么不一样的设置,真是邪门了……呵呵
对了,不会是我打了固件程序后,没有ReNum吧??
服务器
驱动牛犊
驱动牛犊
  • 注册日期2002-07-18
  • 最后登录2004-09-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-01-24 12:19
我想,你应该好好看看你的驱动,在select Device 的时候,你需要
enable 你的device,

Interface->Pipes.MaximumTransferSize =
                                USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE;

看看你的驱动中有没有这么一句,你把USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE;改成64*1024-1,你就可以每次读64K,希望你的是这个问题,大家一起学习。
hemu
驱动小牛
驱动小牛
  • 注册日期2002-04-10
  • 最后登录2004-06-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-01-24 11:46
“偶就是把固件程序下载进去了后,才会出现那么奇怪的问题”
正如jinghuiren所说,应该是软件问题了,我好像也出现过这样的错误,我想是当时我运行了好几个用于设置端口的应用程序,设置的很乱才导致的。
hemu
驱动小牛
驱动小牛
  • 注册日期2002-04-10
  • 最后登录2004-06-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-01-24 11:43
\"Cypress在BulkPerformance里提过一个叫做CATC USB Bus Analyzer,不知道是软件还是硬件,呵呵……\"
我想应该是硬件把,还有那扩充板把引脚牵出来,可能就是分析用的。
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-01-23 21:39
呵呵,经验是没有,不过如果你的keilc设置不对的话,那你的描述符也不会正确返回了,我看你还是检查一下你的端点设置是否正确,高速bulk端点最大为512字节,可是设成单、双、三、和四重缓冲,其他的也按协议来设定,如果设置错误的话就不会正确返回的。
上一页
游客

返回顶部