|
接触AVRUSB有半年了,第一次看到这个我就非常想搞出来,主要因为mega8单片机容易获得,而且有DIP封装的自己好焊.
从固件来讲AVRUSB有两个版本
1,atmel公司的application note里的AVR309,这个是一个斯洛伐克的工程师写的,在其源程序中有其网址,这个网址我以前打开过,上面还有用单片机模拟以太网接口的程序(强啊!),可惜现在打不开了,这个版本的固件程序打印出来大约50页,我把这个程序打印出来,看了一周实在看不下去了,现在这个程序尘封在家里,全是汇编语言写的,真的看不下去.
2,在http://www.obdev.at/products/avrusb/index.html这个网站有AVRUSB的另一个版本,也就是大家常用的版本,这个版本是C语言+汇编语言写的比上一个版本好看多了,它的汇编部分打印出来20几页(比50页少多了!),我花了好长时间才初步看懂整个程序.
说实话如果你仅想做出来一个USB的下载线出来,在论坛里下载一个电路图和固件,按样做一下就行了,如果你真的想把AVRUSB为你所用的话,还是要费的事的.
首先你要对USB协议有一定的了解,这是你读懂固件程序的前提,至少你要看懂USB协议中有关NRZI编码,位填充,数据包等内容.USB1.1协议在网上可以下到,不过是英文的,很考验人噢.最好找些USB开发的书看看.推荐一本<USB2.0原理与开发>这本书的前半部分几本上是USB协议的翻译.
其次你要有一定的C语言和汇编的基础,特别是avrgcc语言的基础,不然你会在看程序时遇到很多语法上看不懂的问题,这会增加读懂负担.
下面具体谈谈AVRUSB设备的开发
1,硬件电路
在USB的接口接线上,我看论坛里遇到问题的人很多,根据我的经验USBASP的电路是稳定可用的,我在好多台式机,还有几种本本上都试过了,没有问题.当然在VCC上串两个二极管,或直接稳压到3.3V,与USB电平兼容,我个人认为会更稳定.不过这样就不好与5V的51单片机联用所以没怎么关注.AVRUSB设备与PC联结后分两种情况
看,首先要看它有没有与主机通信,如果你是第一次用没有出现安装驱动程序的向导你的设备很可能是不能与主机通信,用一个软件:USBVIEW(网上有的下)可以诊断这种情况,如果你的设备能与主机通信(会出现驱动程序安装向导),这个小软件会显示设备描述符等信息,否则全是0.前些天我遇到这个情况,后来发现新的MEGA8单片机默认不是用外部的晶振,要设置一下(我很菜的).
2,固件程序
两个版本的固件程序除了所用语言的区别外,在具体实现上也有区别,版本1是先把每一位USB数据接收下来再解析,而版本2是边接收边解析,各方面比较后,不言而喻,版本2值得好好研究.这里简单说一下版本2,方便对程序有兴趣的人.版本2的汇编部分(usbdrvasm.S)主要是一个中断程序,它完成USB数据的接收与发送,简单说就是在12M晶振下第8个时钟周期接收一个USB数据位(1.5M),同时要据USB协议(NRZI编码,位填充等)解析出最终的数据,usbdrv.c主要是根据USB协议(各种数据包)完成各种包的处理.main.c主程序里有一个端点0用户自定义的请求处理,要改程序主要是在这里改,这是大部分人采用的方法,其实这个固件支持其它的端点:
端点1 IN OUT ,端点3 IN,如要你想用这些端点就要改usbdrv.c里和usbconfig.h等文件,还要对USB有了更好的了解才能做到.
3,驱动程序
现在很少人学编驱动程序,所以AVRUSB设备大部分都用的是WIN32 LIBUSB 一种通用 USB驱动程序,如果你有能力也可自己编,我自己的驱动程序是改编的CYPRSS公司的CY7C63001开发板上驱动程序,只要作少量改动再重新编译就可了.
4,应用程序
如果只想简单实现与USB设备的通信,实际上应用程序是很好编的,对于那些用过API对串口编程的人来说更简单,也就是那几个API,所以我建议如果想编USB设备应用程序,可以先编编串口的API程序,参考的书很多噢.那个搞定了再转回来就简单了.
说了这么多不知是对是错,高手勿笑啊,再发点感言
以前搞过PDIUSBD12看了实验板的S52源程序真感慨自己以前编的程序太小儿科,看了AVRUSB的程序让我再一次感受到一山还有一山高,所以潜心想把它搞透,太敬佩这些作者了,见贤思齐,希望我们国家多出些这样的人知道创新,也知道分享. |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|