原创 11

2009-1-4 14:29 2877 4 4 分类: 电源/新能源

现在的USB生产厂商很多很多,几乎所有的硬件厂商都有USB的产品。我了解的公司有Intel, 国半, Cypress, AnchorChips这几家,Intel作为USB标准的制订者之一,又加上Intel的龙头老大的地位,现在的计算机主板上的HOST基本上采用的都是INTEL的芯片。而在外设的USB控制器方面,大家的性能都差不多。其中CYPESS公司的器件以便宜见长,在收购了ANCHORCHIPS公司之后,CYPRESS基本上从低速到全速的器件都包涵到了,有一些器件的性能还超过INTEL,当然价格要便宜得多。就象CPU唯INTEL马首是瞻一样,很多的厂家都喜欢把自己的东西和INTEL的做比较,我个人认为要做的话,还是INTEL的要好一些!
   USB器件一般来说是有两种类型的,一种是MCU集成在芯片里面的,象上面提到的
Intel,Cypree,National semiconductors, Anchorchips等等;另外的还有就是单独的一个芯片实现USB的Engine的功能,象philips,DIUSBD11,PDIUSBP11A,PDIUSBD12等,还有象lucent也出了两款器件,USS-820,USS-620,820是普通的高速设备,具有8个双向的endpoints,而620是具有DMA功能,使用起来比820占用系统资源要少得多!还有很多家,因为我没有接触过其它厂家的东西,所以没有发言权!呵呵!不过总的来说,在这个方面philips和National Semiconductors的东东要大众一些,开发的话应该上手快一些!不过philips的和51的接口搞的偶烦了好几天,比较的麻烦一些!
   好了,既然把话题说开了,就接着说说USB的HUB的器件,主要的我没有做过,好象国内的USB的HUB还没有什么厂家开始做,即使有,也是非常少的,HUB的器件我重点推荐philips的东西,可以选择PDUSBH系列产品,这一个系列的产品主要是在于用它设计HUB的测试方面有很好的功能,从而减少了开发的难度。
   对了,还有一个问题,起码有不少于十个人来问我,两台PC间如何通过USB口直接连接起来,再次重申一遍,由于USB的网络协议的关系,两台PC的USB都是host,所以没有办法连,如果连的话,必须要使用USB的桥!这个桥的芯片有以下几种,一是anchorchips的EZlink,还有Prolific Technology Inc 的PL2301,PL2302,这个,我只知道anchorchips的东东,要买好几十个美金,我想如果是家庭用的话,没有人会发神经病去买这个鸟东西,反正两个网卡才几块银子。还有USB的Audio方面的器件,有Dalas和philips的东西可以选,当然还有其它的,反正都是巨大无比的公司,应该质量上没有特别的差别,只是在一些小的细节上有所不用,各位老大自己慢慢斟酌了。

   下面就以INTEL公司的8X930AX USB 芯片作一些介绍:

   8X930AX USB微处理器采用的是MCS51作为它的控制CPU,工作在12MHz的工作频率,有256Kbytes的存储空间,如果不够还能够在外围扩展。它有11个中断源,其中有三个分配给USB设备(device)。当然他也还有一些其它的特性,在此不作详细的介绍了。您可以到http://www.intel.com/ 去获得详细的资料。它的主要缺点是价格上可能偏高,开发费用略高,但是开发难度要相对小一些!

   如何给USB器件设计一个BUFFER(Intel)

   下面以CYPRESS公司的CY7C6XX系列产品作一些介绍:
   CYPRESS公司的芯片在低速的场合做得很好,比如国内所有的USB鼠标都是采用的CYPRESS公司的芯片(真的是便宜,不由得你不买他的东东),但是在高速方面支持得不是很好,好象是在CY36系列产品上存在着速度快就CRASH的毛病,在收购了ANCHORCHIPS之后情况才有所改观。 在我这次更新(四月)主页的时候,我得知他们在很多方面都做了改进,他们的产品应该还是很有竞争力的。

   其实我觉得USB的硬件所有的厂家都差不多,差别只是在于他们采用的控制器的不同,除了各个公司的CPU不同(像ST就用他们的ST8或者ST16,Intel当然就用他们的看家本领,而ANCHORCHIPS就只好用人家的51了)以外的东西基本一致,就只有一个SIE(什么是SIE,可以参考这篇文章),高速的器件还会有一个DMA的控制器,使他的数据可以跑得很快。当然你还要看他们的开发包的费用了,具体的报价我没有比较过,有兴趣的可以比较一把,别忘了给我一份,呵呵!

   我对于硬件最想说的一点是他的速度的算法,USB的速度是跟USB其间内部提供的缓冲区的大小有关,还有一个就是USB标准中提到的每1ms和每10ms(还有255ms的时候)发一桢数据的区别,这是低速和全速的主要区别,而缓冲区的大小直接的影响到每桢传送的数据量的大小,这一点大家在算USB的速度的时候一定要注意。在做设计之前一定计算好自己所要求的带宽和芯片的速度匹不匹配,否则会引起不必要的麻烦。

   下面是一个带宽的计算公式:
   BW="EP"*INT(BPF/(OH+EP))/125
   其中:BW表示带宽(Mbits/sec),EP表示ENDPOINT的大小(bytes),BPF表示每桢的字节数,OH表示开销。

   你可以很快的根据你的设计计算出你的USB器件的带宽。下面给出一个例子:

BPF 187 OH 46
ENDPOINT SIZE(BYES) MAX BW(Mbits/sec)
1 0.024
2 0.048
4 0.096
8 0.192


   希望可以从这个例子中得到USB的带宽的计算方法。而对于四种不同的传输方式来说,主要的不同是体现在BPF和OH的不同上。具体可以参照USB的标准的第八章。还可以看一看这篇文章。

   选好方案之后,到了具体的控制程序设计阶段,就只是一个CPU的程序控制问题,对于华夏发达的单片机水平来说,这是非常容易解决的,倘若我再重复讲一下单片机中断抑或讲一段什么例子程序的话,我怀疑会被人砍翻在地,因此寡人只好封刀引退。若有不明,请参考谁谁谁谁谁等高手之微处理器专著。

   也有一些大佬们来问了一下一些关于这些控制方面的问题,很多是没有仔细的看文档资料,关于一些USB的芯片的特殊功能寄存器在说明书里面都有详细的说明,操作方法跟51的器件里面的SFR一模一样


如果想学习USB的开发,做一个简单的HID设备是一个很好的选择,你不用去编写驱动程序,因为操作系统都自带了。唯一要做的就是做固件(firmware)。

一个多月前,我开始了USB开发的学习,之前对硬件这东西是知之甚少了。这一个多月里,做PS/2键盘用了一个星期,复习六级用了一个星期,所以专心用于USB开发的时间也只有一个月。

大家都讲一个USB设备的开发周期是一年,一定不是指一个HID键盘。不过USB设备开发的艰难是真的,在开过的过程中,几次遇到问题,几天,甚至十几天都解决不了,那是何等的郁闷。不过,正是这些问题的出现,促使我去看HID标准、FX2的使用说明......促进了对USB标准、USB开发的了解。虽然现在只是开发出一个简单的HID,但我可以说,我对USB协议、HID协议、FX2的使用是比较了解的了,下一步的开发会顺畅很多。

我在这里只想跟大家分享一下我开发经验,让大家的开发再顺利些,起码能开发出一个简单的设备。以后我会补上LINUX下USB驱动开发的相关文章。我博客里还有更多东西(http://blog.csdn.net/manio)。

先列举一下我有的资源:

  CY7C68013A开发板一块

CYPRESS control pannel

程序文件夹中有:

FX2的TRM(ENGLISH,使用说明)

    FX2的EXAMPLE(这些很有用,帮助你建立概念)

HID标准(ENGLISH)

《USB技术及应用设计》(清华大学出版社 肖踞雄等著)

《USB接口设计》(西安电子科技大学出版社 张弘著)

GOOGLE

在第一个阶段,我只看《USB技术及应用设计》,了解USB协议的细节。我个人觉得这本书是很好的,讲得很详细,帮助你建立起一个对于USB的概念,比如说USB的几种传输、什么是包、什么是帧、什么是描述符、USB工作的流程、USB与主机的传输方式,等等。这些东西,在使用FX2开发时可能不能直接用上,但在你遇到问题时,进行测试时,你可以用一些很基本的原理来判断问题出在哪里。因为是带着问题(HID键盘怎么实现)来看书的,所以这一阶段,我已经了解了关于HID键盘的一些基本的东西,比如说键盘使用的是中断传输。

第二个阶段,开始使用开发板,进行实践。不过,在这里我遇到了最大的一个困难,就是不知为何,把CYPRESS的EXAMPLE下载到板子上,只有一个程序能够正确地运行。为了找出问题,我到处发帖,无奈的是,做USB开发的人其实还不是太多,更何况大家使用的板子不同,谁都不知道对方用的板子的情况。我就是在这个时候读遍了手头的文档,照着上面一步一步地做,最终还是运行不了。两个星期之后,我才想起为什么不打电话去给出这个板子的公司问问呢?然后就打了,在他们给了我一个配置方法之后,所有CYPRESS的程序都能在板子上运行了。原来是代码地址配置得不对,下载之后不能运行。那天,高兴得了差点上睡不着觉~~

后来,我阅读了几个CYPRESS的EXAMPLE,了解了BULK传输,了解了用到的一些寄存器,了解CYPRESS给的框架。然后,我就开始把原来找到的一个为EZ-USB写的HID键盘的固件代码改成FX2用的。

本来想,同一个公司的芯片,不就是改改寄存器,再看看有些其他的不同,改过来就是了(其实最后发现还真的是这样)。但这过程中,因为粗心,或者说因为对FX2设备的使用的了解还不是很深,又遇到了一些问题。我把它们分点列在下面,算是FAQ吧。

1.设备无法识别

这可能是因为EEPROM里的内容乱了。如果EEPROM的第一个字节决定设备下一步进行什么动作。如果乱了,设备可能发送错误的信息给主机,那么主机自然也就识别不了设备了。CYPRESS给了一个叫ZAPBIG的程序,用于恢复EEPROM的内容,CONTROL PANNEL的程序文件夹没有。如果谁要,我做乐意发给他。EEPROM恢复后,最后把FX2/EXAMPLE/EEPROM_IMAGE里的那个.IIC文件使用EEPROM下载按钮下载到EEPROM中,这样开发板上电后会自动运行KEIL的DEBUG MONITOR。

2.无法进行IN传输。

这个问题就比较低级了。因为我在ARM IN端点的时间,只写了EPxBCL,而没写EPxBCH。如果只知道一个数的低8位,而不知道8位,如何能确定一个字到底是多少?所以,在ARM一个端点时,端点计数器的值一定要明确给出。

3.当主机已经识别一个设备为HID键盘时,无法进行IN传输。

开始我以为原因是描述符出了问题,所以我把HID的标准给看了两遍,又参照别人的描述符文件,实在是找不出哪有错了。我在开始的时候也想到的端点使用的问题。我是使用EP6来作为IN端点的,但在看到有CYPRESS给的HID设备开发例子中用EP2来做很IN传输端点时,我也没觉得我用EP6作为IN传输端点有什么错,更何况,我也试着用EP2作为IN传输端点过,也是用不了。后来,我在网上看到一个例子用EP1来作为IN传输端点,抱着试试的心态,我改用EP1作为IN端点,奇迹般的,屏幕上出现了abcabcabcabcabc(当时的按钮设置有问题。。:))。至于为什么用其他端点不行,我仍然没有答案。如果谁知道,告诉我!


在我调整好按键后,开发板可以很好的实现一个小键盘的功能了。现在看了,当初碰到的问题很是不值一提,不过总要经历的......

文中有很多细节没有提到,大家可以GOOGLE一下。或者看看FX2的TRM。


最后,我收藏夹里的链接给大家做参考:
Embeded

单片机

汇编



C语言




USB







Specifiction


Fx2







文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条