原创 高效USB协议

2008-11-4 13:23 3057 4 8 分类: MCU/ 嵌入式

USB是目前最常用的PC外围接口,现在已经有不少的MCU已经内置了USB的SIE。虽然480M的HighSpeed接口不多,但也基本上都可以做到12M的FullSpeed接口,对于一般的应用可以满足了。但USB接口如果协议处理的不好的话,速度甚至可能比串口还要慢。这里就介绍一下如何定义USB协议,以达到更快的效率。

【理论依据】
对于可靠的传输的话,对快的速度就是使用批量传输了。理论上,1ms内,FullSpeed的USB接口可以传输最多1023字节的数据。但是,如果只传输一个字节的数据的话,使用的时间也同样是1ms。所以,竟可能地使用大数据包,是有效利用USB带宽的不二法宝。当然,这就要求USB设备具有足够大的缓冲RAM,而现在的ARM芯片基本上都具有比较丰富的RAM资源。

【USB协议】
这里拿Versaloon的USB_TO_SPI接口做的51编程器作为例子。
对于设备,需要能够一次处理很多操作的能力,命令处理函数可以这样实现:


 index = 0;
 while(index < len)
 {
  command = dat[index++];
  switch(command)
  {
   case USB_TO_XXX_INIT:
    ......
   case USB_TO_XXX_CONFIG:
    ......
   case USB_TO_XXX_FINI:
    ......
   case USB_TO_XXX_IN_OUT:
    ......
  }
  index += command_data_length;
 }<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


当收到一个命令包时,设备会一直解析命令,并执行。这样,就可以在一个命令包中放尽可能多的命令。

【上位机处理】
上位机需要做的就是收集需要执行的操作,等到必须有一个返回结果的时候,才发送命令。
下面是使用字节方式,对S51执行ISP的字节方式编程的代码:


 j = 0;
 for(i = addr_start; i < addr_end; i++)
 {
  cmd_buf[0] = 0x40;
  cmd_buf[1] = (uint8)(i >> 8);
  cmd_buf[2] = (uint8)(i >> 0);
  cmd_buf[3] = s5x_flash_buffer;
  spi_io(cmd_buf, 4, NULL, 0, 0);
  delay_us(s5x_flash_byte_delay_us);


  j++;
  if((j >= s5x_chip_param.flash_page_size) || (i == (addr_end - 1)))
  {
   if(ERROR_OK != commit()) { LOG_ERROR("fail to program flash in byte mode\n"); ret = ERROR_FAIL; goto leave_program_mode; }
   j = 0;
  }
 }


其中:spi_io只是用于收集要执行的命令,并不会发送相应的USB命令。当足够多的命令收集完之后(这里是大于S51一个页的数据对应的SPI操作命令),才调用commit,这个函数就是把缓冲的命令一次性的发给设备,并读取设备的执行结果。
实际测试下来,对S51的执行ISP编程时,使用字节方式和使用页方式,速度上差别非常小。这就是因为,USB传输的时间要比正真执行操作的时间要多,提高USB传输的效率,比提高执行SPI操作的效率来的更加有效。

结果(4016字节):
ad1fbc23-24e1-436c-ba7b-f6df5342145e.jpg
97721a8b-8cfa-45b4-b3da-f9667f2abec6.jpg
PARTNER CONTENT

文章评论4条评论)

登录后参与讨论

用户1482250 2010-7-8 22:10

请问: 1.这个FIFO是16级深的队列,如果当TXindex1 > 17 的时候,比如是22, for(temp=1;temp 17的时候,又该怎么处理? youthb@126.com

用户131114 2008-11-5 22:35

不过S51的上位机程序应该会公开,你做Versaloon的硬件的话,可以自己参考USB_TO_XXX的协议,写一个固件。

用户131114 2008-11-5 22:31

诶,目前公开的RC2版本是不支持S51的。 建议用万能版搭,只是为芯片做一个小的PCB。 如果直接做Versaloon的PCB的话,还不如败一个呢。

用户75050 2008-11-5 22:00

Simon这不是诱使我去做Versaloon的PCB吗。

用户131114 2008-11-4 20:02

编辑你好,这里也晃荡过了?
相关推荐阅读
用户131114 2010-12-25 22:43
征集各种单片机/存储器的支持
先随便列几个:Actel FPGA,Renesas R8C,Nuvoton Cortex。当然,Versaloon已经支持的就不需要了。当然,一些简单的比如SPI Flash,可以都可以。合作(或者交...
用户131114 2010-12-11 17:06
STM32F207 demo板原理图
这个硬件是VersaloonHandy平台的第一个测试评估硬件。资源:1. usb device + host, LTC41602. 3路可控电压,分别用于SD供电、TFT背光、对外供电,IIC接口控...
用户131114 2010-09-13 15:13
Versaloon 平台硬件规划
按照计划,几个平台都进行的非常顺利。第二批的生产也在进行中。 抽空规划了一下Versaloon平台的下一个硬件。1。使用120M STM32F203系列100脚芯片,USB 2.0 HS OTG2。2...
用户131114 2010-09-11 01:04
USBDM也成为浮云了。。。。。
HSC08/HCS12(X)的调试支持也基本按时完成了。。。。。。碰到的困难比预想的多,8过仍旧只是浮云。。。。。。coldfireV1应该也可以支持,不过需要有demo板测试并做相应的调整。 上图:...
用户131114 2010-09-02 02:28
Versaloon平台发展规划
最近发布的Versaloon调试仿真平台计划,相信很快就能完成第一阶段,有人怀疑不? Versaloon在实现的理念上,有其先进性,在同一个简单的硬件上,能够实现这么多种芯片的支持,并且具备不错的性能...
用户131114 2010-09-01 17:40
STLink简单的像浮云一样
原来计划花2天时间,没想到一天就搞定了。。。。。。在STM8S103F2上测试通过。STVP在下载STM8S103F2的速度并不是一般的慢啊,每次64字节。。。。。。OMG。。。。 下一步准备OSBD...
EE直播间
更多
我要评论
4
4
关闭 站长推荐上一条 /3 下一条