网站导航: 首页 > 设计参考 > 正文 文章搜索
Usb开发的经验
 
文章编号:
081126161625
文章分类: 接口技术 USB
点 击:
...
关 键 词: 经验
文章来源:
网络
摘 要:
我在学习USB开发的过程中走了不少弯路,现在想开发USB的网友越来越多,我也不妨把这几个月以来自己开发中的经历告诉大家,也许少走些弯路...

    前段时间接手了课题组的一个开发USB接口的项目。当时几乎是白手起家的状况,除了老板给我PDIUSBD12的一些英文的PDF文档和一些源代码之外,就几乎没有其他任何资料。经过几个月的摸索,可以说已经基本上对Usb开发的框架有了比较深入的了解,而且可以初步应用到实际的设备中。其中可以说走了不少弯路。现在想开发USB的网友越来越多,我也不妨把这几个月以来自己开发中的经历告诉大家,也许少走些弯路。也许我的一些想法也是很不成熟的,让内行见笑了。

    我个人觉得,要想搞USB的话起码得有以下几方面的知识:计算机硬件技术基础,单片机原理以及Windows程序设计。当然你的设备不一定非得用Phil的PDIUSBD12接口芯片,还有很多可以供选择的接口芯片。大侠们可以举例,呵呵。不过既然导师给我D12芯片的资料,所以我一开始也不得不选择它,现在看来D12芯片还是比较好用的,不过最大的缺点就是市场上太难买到了。我的这片也是老板通过朋友才搞到的,所以到现在我还一直舍不得用,唉……

    刚开始的时候大概看了一下USB2.0的英文规范,不过实在是太痛苦了。不过现在网上到处可以下1.1的中文规范,而且不少“开发指南”的书就是1.1规范的翻译,可以拿来看看,了解一下Usb到底是什么东西,有些什么特点。作为应用,我觉得了解一下也就可以了,至于里面那些电气特性和Hub的规范,先不看也罢。还有其中一些细节的东西,也不用看得太仔细,有了点实践经验之后再回头看看也许效果会更好。不过最好还是了解一点USB设备的“配置”,“接口”,“端点”,“管道”的一些概念。因为以后的软件方面的开发和这些概念的是密不可分的。由于我现在弄的还是比较简单的单功能设备,一般来说都是一个配置,一个接口,多个端点或管道的设备。所以我对“配置”和“接口”的概念还不是特别理解,但我觉得对于入门来说,理解EndPoint,Pipe这两个概念还是很有必要的。起码你得知道Usb支持哪几种类型的端点,管道,它们都有什么特点。而你的设备的端点又是什么类型的。

    照我的理解,USB其实就是一种外设与计算机通讯的协议。而且现在的大部分的机器都支持USB设备,具体协议是怎么电气化的实现,我们可以根本不用知道。不管是PC端还是外设,都可以用专用的芯片来实现USB传输的电气特性和其中主要的协议。PDIUSBD12就是一种这样的芯片,当然这种芯片提供的仅仅是接口的功能,而另外有一些系列的芯片如Intel系列的本身就是一个微处理器。相比之下,D12芯片需要用单片机(通常就是51系列)和它配合工作才能起作用,这种情况下你甚至可以把它当作8255A,8279那样的芯片,单片机和它们的通讯方式都是类似,只不过作为USB的接口芯片,D12的控制要复杂的多。当然,这时你最好得对C51语言有一定的了解,毕竟用汇编来实现8051的USB传输实在是不敢想象。另外,要知道你的51单片机还要做很多其他的事情的,Usb只是实现与P
C通讯的手段而已。像我接手的项目就是做个高速AD采集板,这才是主要方面。你不可能做一个除了51单片机和PDIUSBD12就什么都没有的设备吧?^_^Phil的PDF上提供了一些D12芯片应用的例子的资料,其中包括它的原理图。看看原理图再看看它的功能实现的一些源代码是比较有帮助的。虽然它的例子代码一都比较长,但是针对D12芯片的特点,程序的大部分都不需要做太多的改动,就可以适应于不同的功能的外设。

    从例子程序中理解设备的工作原理是比较清晰的,就我看到的程序来说,那是一个跟MFC程序差不多长的一段C51代码的程序,但是它编译之后出来的代码的大小还是可以接受的。至少用At89C52的内部8Kflash还是绰绰有余的。

    如果大家用的也是D12芯片,我们不妨一起来分析一下它所附带的一些代码程序。几个主要的文件是不可少的:

    hal.c文件,定义实现C51与外部存储器/IO端口的读写操作的函数。直接对外的硬件操作。

    USBD12.c文件,用于实现向PDIUSBD12发送特定的命令字的函数,这些定义都是为了方便以后对芯片控制时的调用方便。比如对于8255A芯片,我们就可以定义一个SetMode函数,这样我们在以后的程序就可以很方便的调用这个函数来设置8255A于特定的工作状态。

    MAINLOOP文件和ISR文件,可以理解这两个文件就是整个设备工作的主程序的所在,PDIUSBD12与51单片机之间是工作在一种中断的方式状态下,D12通过中断向51发送各种请求。Mainloop文件里面是整个程序的Main函数的描述,其中Main函数作为程序设备Reset时的程序入口,调用了一些初始化设备的函数,比如各种寄存器如中断寄存器,定时器,计数器等,初始化D12芯片并完成连接等工作,然后程序进入循环等待阶段,等待着中断的发生。而Isr文件定义的就是与中断处理相关的的一些函数。因为D12从硬件连线上来说只有一个中断请求管脚,我们可以把它与51的Int0脚或Int1脚相连,并为之定义中断服务函数,但是D12的中断是有好几种类型的,我们可以在中断发生之后调用读D12的中断寄存器的命令来判断是什么类型的中断,比如是端点1的写入中断,就可以调用相应的子函数处理,并在处理结束前清除中断寄存器中的标志以等待下一次中断。ISR程序和Mainloop程序之间可以通过一些全局变量来进行通讯。

    另外还有一个奇怪的文件叫做Chap9.c,刚开始搞了半天不知道它的作用是什么,后来回去仔细看了看1.1规范的第九章,原来是规范中规定必须实现的一些与PC通讯时的标准的请求响应函数。比如说SetAddress,SetConfiguration等函数,另外还有一个文件叫Vdor.c,翻译成卖主自定义的请求,不过这里买主这个概念定义得比较晦涩。但是简单点说就是,这个设备是你设计的,卖主就是你。呵呵整个程序的框架就是这样。而照我自己理解,系统的整个工作原理应该是这样:当系统连接到PC的Usb端口上时,PC的Usb控制器采用默认的地址0和你这个新接入系统的设备进行通讯(大部分工作应该都是USB的总线驱动干的)。我想设备干的第一件事情应该是Reset吧(也可能不是),然后Pc向D12的端点0(默认的控制端点,无需进行特殊的配置)发送一些标准请求,也就是前面提到的Chap9里定义的一些标准的设备请求。比如查询设备的状态,设备的描述符,设置设备的状态,设置设备的地址等。这些请求应该是由系统的总线驱动发送到D12,然后51响应D12的中断,判断检测到是端点的输入中断,然后再根据请求的一些参数来调用Chap9里定义的函数来实现这些主机的请求,比如设置地址。因为地址0是Usb设备默认的地址,所有新接入的Usb设备都通过这个地址和主机进行通讯,所以你不能占用这个地址太久,必须迅速的给你分配一个合适的地址,以后主机就通过这个地址和你进行通讯,地址0就让出来给新的设备。这时51检测到D12的中断之后调用SetAddress函数为设备设置地址,地址的参数当然是从主机传过来的了。完成初始化系统的配置之后,主机就可以和设备提供的各个端点进行通讯了,也可以实现一些“卖主”定义的特殊的请求。比如,让51外接一个小发光二极管,可以定义几个自己的请求,比如点亮小灯LedOn,熄灭LedOff和闪动小灯LedFlash,这些函数实现起来应该很简单,就可以把它们加入你的Vendor Request函数集中,以后可以在驱动中进行调用。虽然简单,但是当你看到通过你的Windows中的一个小程序可以控制设备的小灯一亮一灭闪闪发光的,是不是很有成就感啊?呵呵,虽然只是你的一小步,却是人类的一大步呀,hiahia。

 
相关文章:

12 下一页
 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4