从10月26号到11月24号,接触AVR差不多1个月了,学习V-USB(AVR-USB)整整花了我4天时间,从下位机程序到上位机程序,遇到了无数的困难,浏览了N多的外国论坛,现在把我对V-USB的理解写出来给后来者提供一些参考。
V-USB是用软件模拟USB通讯,需要一个下位机驱动vusb和一个上位机驱动libusbdotnet(供.net编程环境调用的库文件,其他的编程环境可以用libusb-win32)。
下位机需要一个底层vusb的驱动(都是老外写的),介绍地址,下载地址 。在写下位机程序之前,最好看一下AVR软件模拟USB的介绍。
在你看完介绍之后,需要先根据原理图(vusb下载包里的circuit目录下)焊接一个简单电路。
然后下载vusb的驱动,把驱动(usbdrv文件夹)发到你的GCC项目文件夹中,并把usbdrv文件夹中的usbconfig-prototype.h拷贝到上一级目录-GCC项目文件夹,并重命名为usbconfig.h,在对里面的宏定义做一些必要的修改。
其他设置使用默认即可,当然你可以修改PID(VendorID)和VIP(DeviceID)以及ProductName(Vendor Name)和CompanyName (Device Name)。
这时请在你的主程序main.c中include必要的头文件,下面是必须要包含的头文件。
然后在主循环中加入usb轮询函数usbPoll(),用来侦测usb事件 。在主程序中定义个usbFunctionSetup()函数,这个函数就是usb事件处理函数usbPoll()侦测到上位机有usb通讯请求时,usbdrv就会调用这个usbFunctionSetup()函数来处理请求。
现在你就可以试试编译程序了(当然是在你准备了makefile并编辑好之后),也许你会得到一个错误(undefined reference to 'usbCrc16Append'),而无法编译通过。这个错误折腾我很久,这里直接告诉大家解决办法。在Makefile里面修改
ASRC = usbdrv/usbdrvasm.S
解释一下:usbCrcAppend()函数是在usbdrvasm.S里面用汇编定义的一个函数,我们当然需要把这个汇编文件加入我们的项目啦。
Makefile里面的Src为C源程序,ASRC为汇编的源程序。(千万不要试图#include usbdrv/usbdrvasm.S)
好了,现在再编译一下,会提示一切OK,把你的.hex文件烧入到你的avr芯片中,上电,通过usb线连接电脑,如果你的电路没有问题,电脑会提示找到新硬件,提示安装驱动。此时浏览到你预先准备好的驱动,然后安装即可,安装完成之后,在你的设备管理器里面就可以看到你的v-usb的设备的。如果你没有usb驱动,这里有一个模板,你下载后修改里面的.ini文件皆可。(主要是修改pid,vid,device Name,company name)
至此,下位机的程序准备基本完成,当然还没有写和上位机通信的模块。
先把所有程序传上来,包括上位机(C#)和下位机(GCC). 点击下载