clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:8531回复:36

关于USB1.1传输速度的讨论

楼主#
更多 发布于:2003-06-16 17:34
USB1.1传输速度理论上是12Mbps,但是我翻阅过论坛上有关的贴子,在扣除读写命令消耗的时间,一般的(包括使用DSP、较高速MCU、RAM足够大)都在10K--64K byte/s,也就是80K--500K bps。究竟1.1的极限是多少?怎样去实现?各位有没有好的方法和点子?呵呵,大家研究一下。 :D
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-27 18:39
检测状态?什么状态?好象有两个地方可以看到状态,一个是选择端点时,会返回一个字节,最后的一位是Full/empty,另外有个地方可以看到data0、data1是Full/empty,你用的是哪种?

用查询的时候,他的中断依然起作用的,我要怎么样才能关掉,直接去掉中断好象不行!
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-22 08:44
还记得我说过曾经上过750K/byte吗?那就是靠检测状态发送的!其实你的中断来的时间并不长,应该是正常的。之间耗费的时间就是mcu浪费在数据读取的时间。所以想提高速度的话,建议使用高速mcu和dma功能。我使用4M的mcu,算了一下机器周期,远远跟不上d12的速度!对于现在170k速度(转地址后)也就将就着用了。
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-21 16:24
我测试了一下,发现我把64个字节写入D12中的时间是150ums,而我的中断周期是1.2个ms,请问中间的1ms在干什么啊,我程序可什么别的事情都没做,只是循环发送数据啊,难道真的可以用检测端点状态来作为发送数据的条件?
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-21 08:45
呵呵,我的技术没什么可保密的。相关的技术这里很多人都了解比我清楚。其实我的建议在之前给你发的贴子已写得很清楚,也就是你现在提及如何充分利用1ms16贞的问题。仔细考虑一下你的系统如何提高利用率,再作一下试验,结果就很明显。
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-20 11:17
使用d12在特定环境发送数据我最快有750k/byte,如果使用比较特别的片子,上1.1m/s也是可能的。


可以吗?怎么做的,能不能把你的技术交流一下啊?以后大家做的都是2。0了,你的技术用不着那么保密吧,如果能够得到你的指点,真的很感激!
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-20 11:07
呵呵,我说吗,根据协议里面的说明,如果每个包能达到64字节的话,速度能达到1216KB/s,可是我觉得如果能做到600k的话就已经很不错了!


关键是每帧中间怎么放16个数据包啊,一般可以作到1.2ms传一帧,如果每帧有16个数据包,800-900K也可以实现的。
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-19 10:02
使用d12在特定环境发送数据我最快有750k/byte,如果使用比较特别的片子,上1.1m/s也是可能的。
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-07-18 18:00
[quote]前几天刚讨论过!最快也就1.1byte/s

不好意思是1.1M byte/s

我现在自己用软件完成的可以达到650K byte/s(read)!
如果用硬件完成可以达到1M byte/s [/quote]

用的是什么片子?cypress吗?有谁用D12能够达到这么高的速度的吗?
一天到晚游泳的鱼
驱动小牛
驱动小牛
  • 注册日期2002-05-08
  • 最后登录2005-04-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-07-14 18:08
同步做到800~900KByte/s没问题,BULK编程容易,但提高速度比较难,我以前最多做到200~300左右。


可是我怎么做都只有40KByte/s,能不能看看你固件中的写操作函数,我用的是周立功的,我始终觉得里面很多操作需要优化,可是不知道怎么动手!
unsigned char D12_WriteEndpoint(unsigned char endp,  unsigned char len, unsigned char * buf)
{
         unsigned char i;
         if(bEPPflags.bits.in_isr == 0)
           DISABLE;
            outportb(D12_COMMAND, endp);
            inportb(D12_DATA);
            outportb(D12_COMMAND, 0xF0);
            outportb(D12_DATA, 0);       //reserve
            outportb(D12_DATA, len);     //length of endpoint data structure
           for(i=0; i<len; i++)
                  outportb(D12_DATA, *(buf+i));
           outportb(D12_COMMAND, 0xFA);    ////enable buffer   :means the data in the buffer can be send
                                  //// to host pc after next \"IN\" sign;

           if(bEPPflags.bits.in_isr == 0)
          ENABLE;
          return len;
}

void outportb(unsigned char port, unsigned char val)
{
unsigned char xdata *ext_address;

// MCU_HOSTDACK =1;

ext_address=0xff00 + port;
*ext_address = val;

// MCU_HOSTDACK =0;
}

unsigned char inportb(unsigned char port)
{
unsigned char c;
unsigned char xdata *ext_address;

// MCU_HOSTDACK =1;

ext_address=0xff00 + port;
c = *ext_address ;

// MCU_HOSTDACK =0;

return c;
}

程序如上,哪位大侠能帮忙优化一下?
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-06-23 08:59
非常感谢jinghuiren大佬!
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-06-21 12:59
你的想法非常正确,一次中断确实是一个包,而且你对时间的估算理解也是正确的。

因为我这边的mcu是比较慢的(我用的是2.0的器件),所以不担心会有数据丢失问题,也就是说当我写满第二个包是,第一个包肯定已经发走了,而对于1.1的就不能肯定了,1.1的收发器是12m,这个速度有些mcu是可能超越的,更何况传输数据的过程中还有软件的时间损耗。
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-06-21 09:10
我也知道硬件中断是最快的方法,问题就是我现在检查端口状态的方法就是会快一点,不知道为什么。对于双缓冲我有个疑问,究竟d12一次发送数据是发2个包,还是一次中断来就发1个。我不断的读最后状态寄存器,发现缓冲区1、2并不是同时为空。那究竟endpoint IN中断是产生在一个数据包发送后,还是在把双缓冲数据都发送完毕后才产生的?因为曾经尝试过每次中断来就写2个包,但是发现有数据的丢失。
“但是中断的产生是当一个包传输完成后就会有一个中断,这样也就是说你必须等中断来了才能填充下一块”按你的说法就是一次中断来发一个包,如果双缓冲还有数据就要等到下一次中断的到来。那样的话,每2次中断发2个包。我要一次写2个包,就必须对偶数次中断进入的时间要掌握好,超时就只发一个包。“对时间有个估算”是不是这个意思?
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-06-20 20:03
我发现我的程序不能在一个贞(1ms)里发送多个数据包,只能检查endpoint的状态(buffer是否为空),作为下一次发送的条件,结果造成速度极低。但是已经比依靠endpoint bulk的中断进入好的多。不知道你们有没有方法,充分利用一个贞有多次发送的机会,来提高速度?我想知道大家是用什么作为下一次数据包发送的标志?


硬件中断是最快的方法,但是如果你用的是双缓冲,那就不同了,双缓冲其实是两块相同大小的缓冲区,当填充完第一块后地址指针会跳到下一块的开始,然后循环往复。

但是中断的产生是当一个包传输完成后就会有一个中断,这样也就是说你必须等中断来了才能填充下一块,这和一个缓冲区的效果是一样的,根本就没有发挥出双缓冲的优势,所以还是建议在中断里只设个标志,写数据到别的地方去写,而且一次就写两个包。当然这要求你对时间有个估算。

ps:我前文说的8051的限制是因为我用8051产生数据然后写到端点里,这样总的速度就有8051决定了
drivermaster
驱动中牛
驱动中牛
  • 注册日期2003-02-26
  • 最后登录2004-06-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-06-20 18:27
我发现我的程序不能在一个贞(1ms)里发送多个数据包,只能检查endpoint的状态(buffer是否为空),作为下一次发送的条件,结果造成速度极低。但是已经比依靠endpoint bulk的中断进入好的多。


这样也行?
菩提本无树,明镜亦非台, 本来无一物,何处染尘埃? 身似菩提树,心如明镜台, 愿将勤拂拭,勿使染尘埃。
clementzhao
驱动大牛
驱动大牛
  • 注册日期2003-05-08
  • 最后登录2009-02-20
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望63点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-06-20 16:38
我发现我的程序不能在一个贞(1ms)里发送多个数据包,只能检查endpoint的状态(buffer是否为空),作为下一次发送的条件,结果造成速度极低。但是已经比依靠endpoint bulk的中断进入好的多。不知道你们有没有方法,充分利用一个贞有多次发送的机会,来提高速度?我想知道大家是用什么作为下一次数据包发送的标志?
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-06-20 16:04
这么慢吗?
usb大全上说理论上可以达到1.1MB/s,不是bit,我们这里用cypress的片子有做过600k的,不过是同步传输。

好像philips的从来都没有做到太高速度的,我用cypress的2.0开发板还能做到10MB/s呢(速度限制原因是68013里的8051只能有这么高的速度),可使用philips的2.0却只能达到4.5MB/s,好慢!


“我用cypress的2.0开发板还能做到10MB/s呢(速度限制原因是68013里的8051只能有这么高的速度)”

为什么说是8051限制了速度?

二姑家的猫想......
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-06-20 15:59
同步做到800~900KByte/s没问题,BULK编程容易,但提高速度比较难,我以前最多做到200~300左右。



同步800~900kbyte/s下,接受的数据100%对么?这个速度是
外部数据输入到芯片的速度么?你用哪颗片子?
二姑家的猫想......
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-06-20 15:59
其实并不是丢失了,因为同步传输没有检测和纠错的机制,因此很可能再电缆上传输是遭到干扰而出现数据错误,但在信号好的情况下一般是不会发生的,因此写以上才建议它使用的情况是对少量的数据错误不敏感的情况下。
kilroy_guo
驱动大牛
驱动大牛
  • 注册日期2002-10-29
  • 最后登录2005-11-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2003-06-20 15:52
按协议上的建议,同步一般用在音频等需要数据流比较稳定连续,但是对错误不是很敏感的情况下,也就是说一段数据里面都是或者错误几个字节不会造成大的影响的情况。


ren大虾,这几个字节丢了,是什么原因造成的(硬件?协议?)
在那一部分丢的(host控制器到usb设备 or host到总线 or 总线到驱动)?
二姑家的猫想......
上一页
游客

返回顶部