利用PIC18F4550 USB DEMO修改应用例程及注意

[复制链接]
 楼主| 一唯 发表于 2008-2-14 12:42 | 显示全部楼层 |阅读模式
USB数据处理部分:<br />/**********************USB的数据处理*****************/<br />void&nbsp;ProcessIO(void)<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//BlinkUSBStatus();<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;User&nbsp;Application&nbsp;USB&nbsp;tasks<br />&nbsp;&nbsp;&nbsp;&nbsp;if((usb_device_state&nbsp;&lt&nbsp;CONFIGURED_STATE)||(UCONbits.SUSPND==1))&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(USBGenRead((byte*)&dataPacket,sizeof(dataPacket)))/*PC软件发送过来的数据是否为真*/<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x1=dataPacket.CMD;/*最大上传数据个数为一个字节255*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(x&ltx1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USBTasks();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;USB&nbsp;Task<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceRequests();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(x=x1){x=0;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}//end&nbsp;ProcessIO<br /><br />void&nbsp;ServiceRequests(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter&nbsp;=&nbsp;4;&nbsp;&nbsp;/*上传一个数据的字节个数--可以自己修改*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!mUSBGenTxIsBusy())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x++;/*每次上传一个数据后加1*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;USBGenWrite((byte*)&x,counter);&nbsp;/*发送寄存器X里的数据及定义发送的数据包字节数*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Delay100TCYx(50);&nbsp;/*自己人为的加了个延迟*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />}//end&nbsp;ServiceRequests<br /><br />&nbsp;PIC18F4550的固件设计&nbsp;<br /><br />  微芯公司提供了一系列的USB寄存器,使用这些寄存器可以完成USB通信。大多数的USB通信都是通过中断来完成的,在USB中断服务程序内,要实现输入/输出接口,允许大多数的USB程序在后台完成。从应用的观点来看,枚举过程和数据通信的发生好像没有联系。&nbsp;<br /><br />&nbsp;<br /><br />  对于单片机控制程序,目前没有任何厂商提供自动生成固件(firmware)的工具,因此所有程序都要由自己手工编制。由于USB协议的复杂性,并且考虑&nbsp;到广大客户的需求,因此,Microchip公司在推出PIC18F4550系列芯片时,提供了面向不同客户群的DEMO程序,这就大大减轻了系统开发人员的负担,同时缩短了开发周期。本系统的设计就是在Microchip公司提供的DEMO程序的基础上,进行必要的修改来完成的。本设计的具体固件主要由以下8个文件组成。&nbsp;<br /><br />&nbsp;<br /><br />  ①&nbsp;main.c:系统的主程序,包括InitializeSystem()和USBTasks(void)两个子程序,主要完成系统的初始化以及其他各种子程序的调用。&nbsp;<br /><br />&nbsp;<br /><br />  ②&nbsp;usb9.c:实现的是USB协议第9章的功能,包括枚举总线的接口和核心功能,以及USB的中断服务程序。它处理由USB用户所产生的所有的中断。在这个程序中,主要实现对描述符的枚举以及休眠、复位功能,主要包括USBCheckStdRequest(void)、USBStdGetDscHandler(void)和USBStdFeatureReqHandler(void)等5个子程序。&nbsp;<br /><br />&nbsp;<br /><br />  ③&nbsp;usbctrltrf.c:主要实现USB控制传输所需的各种功能,主要由USBCtrlTrfSetupHandler(void)、USBCtr-lEPServiceComplete(void)和USBPrepareForNextSetup-Trf(void)等8个子程序组成。&nbsp;<br /><br />&nbsp;<br /><br />  ④&nbsp;usbdrv.c:主要实现与USB驱动相关的功能,包括检查总线状态、USB模块使能、USB模块挂起、远程唤醒等功能;主要由USBSuspend(void)、USBModuleEnable(void)、USBSoftDetach(void)和USBDriverService(void)等12个子程序组成。&nbsp;<br /><br />&nbsp;<br /><br />  ⑤&nbsp;usbdsc.c:主要是对该系统的描述,包括厂商、产品号等的描述。&nbsp;<br /><br />&nbsp;<br /><br />  ⑥&nbsp;usbgen.c:对USB设备类的配置(在这里把它配置为通用USB类),主要包括USB通用类的初始化端点和读写,由USBGenInitEP(void)、USBGenRead(byte*buffer,byte&nbsp;len)和USBGenWrite(byte*buffer,bytelen)三个子程序组成。&nbsp;<br /><br />&nbsp;<br /><br />  ⑦&nbsp;usbmmap.c:主要用于检查USB在通信过程中,端点号与BDT(缓冲器描述符表)之间的匹配。&nbsp;<br /><br />&nbsp;<br /><br />  ⑧&nbsp;user.c:直接面向用户的应用程序,可以帮助用户完成自己的初始化配置、处理数据的读/写、I/O口的处理,设备的请求等。&nbsp;下位机的大部分功能都是由这个程序来实现的,比如A/D转换及其数据的读取等。它主要包括UserInit(void)、BlinkUSBStatus(void)、ServiceRequests(void)、ProcessIO(void)、ResetTempLog(void)和ReadPOT(void)六个子程序。&nbsp;<br /><br />&nbsp;<br /><br /> &nbsp;PC机软件编程&nbsp;<br /><br />  要编写PC机上的软件,可以利用Microchip公司提供的开发工具包。该工具包是一个安装程序,安装后可以在安装目录下找到USB通用的驱动程序、用Borland&nbsp;C编写的应用程序、一些固件代码,以及编写应用程序所需的API函数等。对于一般的应用,驱动程序可以直接使用,无需重编。在编程中主要用到以下7个API函数:MPUSBGetDLL&nbsp;Version(),返回DLL的版本号;MPUSB-GetDeviceCount(),返回连接没备的数目;MPUSBOpen(),返回指定pVID_PID和pEP的USB设备端点的句柄,返回的是一个端点句柄;MPUSBRead(),从IN端点读取数据并填入缓冲区;MPUSBWrite(),对一个OUT端点写入数据并使用pData缓冲区;MPUSBReadInt(),从Inter-rupt&nbsp;IN端点读取数据并填人缓冲区;MPUSBClose(),关闭一个端点的句柄。因为Microchip公司提供的MPUS-BAPI.DLL源程序是用Borland&nbsp;C编写的,这一程序无法在VC环境下编译,所以也不能产生隐式调用所需的.LIB文件&nbsp;。&nbsp;<br /><br />  PC机的软件部分主要用于实现上位机同下位机之间的USB通信,&nbsp;实现这一功能的方法有很多种,比如采用简单的VB、数据处理能力很强的Delphi,或国内外广泛采用的Borland&nbsp;C和VC等。&nbsp;<br /><br />  选择何种芯片来设计嵌入式系统,需要根据系统的需求、设计的难易程度和性价比等几个方面来考虑。Micro-chip公司为PIC18F4550系列单片机提供通用的驱动程序、API函数、DEMO板和一系列范例程序等。其中,一些固件的端点与PC机通信的子程序可以直接调用,而不需要重写,从而大大提高了开发效率,缩短了产品的研发周期,这势必会导致该系列单片机会很快占据一部分USB接口市场。<br /><br />
兰天白云 发表于 2008-2-14 21:48 | 显示全部楼层

先顶一下

  
win2000_li 发表于 2008-2-16 19:57 | 显示全部楼层

好好好好好好

太好了,谢谢兄弟,这个东东对于我来说太重要了.<br /><br />谢谢兄弟!!!
hotpro 发表于 2008-3-22 10:55 | 显示全部楼层

礼貌性的顶下先

不过这都上精华,啧啧,
king6301 发表于 2008-4-1 15:51 | 显示全部楼层

顶先

还没搞过USB,对我来说似乎还有些高深
lhkjg 发表于 2008-4-4 12:01 | 显示全部楼层

不错。

l0p0c 发表于 2008-4-8 16:10 | 显示全部楼层

楼主真是费心了!

给大家帮助了!
沂水寒 发表于 2008-4-16 19:29 | 显示全部楼层

有玩这个demo的朋友,大家多多交流

写了半天,发表失败,真是够人郁闷的。破网站,一个字,烂<br />留一下联系方式吧:mcu_china@live.cn
yang010121 发表于 2012-9-18 19:06 | 显示全部楼层
这个开发板要从国外购买,周期够长的,楼主有么有好的渠道,另外从MICROCHIP购买开发板,能否从他们获得一定的技术支持呢?
xzhihui 发表于 2012-9-19 15:20 | 显示全部楼层
LS怎么把这个帖子挖出来的。。都4年多了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部