Arduino中国 | Flamingo EDA

Nov/07

4

DIY Arduino: USB模块

虽然之前DIY出来的串口模块一直工作得很正常,但USB无孔不入的事实让我明白DIY那款USB接口的Arduino只是迟早的事情,于是暂时放弃了超声波模块和各种基本电路,开始DIY Arduino USB模块。Arduino官方网站上为USB接口的Arduino给出了不同的名称(NG和Diecimila),两者似乎只是采用的USB芯片有所差异,电路上并没有太多的变化,但bootloader似乎也有些不同。

一切依旧从原理图开始,对比Arduino串口模块与USB模块的原理图后发现,原来电路图上只是将串口部分的电路用FT232BM芯片替换了,并且将Atmega8换成容量更大的Atmega168。我在自己DIY板子上用的是FT232BL,就是FT232BM的无铅版本,电子市场里淘到的是几十块钱一片,还真是不便宜(越发应该支持串口版本了)。Atmega8同Atmega168引脚上是完全兼容的,原则上原来那款串口模块上也可以接Atmega168的,只需要更新bootloader就可以了。

考虑到今后焊接上的方便,除了FT232BL外大部分用的是直插元件。电路板这回坚持要工厂用蓝色油墨,又多花了好些银子,但做出来的板子拿到后感觉好像做工没有上次仔细了,不过整体感觉还是不错的:

元件配备上这次电容100nF用的是安规电容,这是参考了Arduino成品图后专门去打听的。按照官方的说法,安规电容器失效之后不会导致电击,因此不会危及人身安全。另外电路中用到了一个陶瓷晶振,刚开始不明白为什么晶振会有三只管脚,后来Google才知道这种晶振是包含了滤波电路的,因此在FT232BL芯片周围就不需求搭其它的滤波电路了。看起来仔细研究每个电路都会有所发现啊!

元件配齐之后就开始焊接了。第一次焊接QPF封装的芯片,一开始还真不知如何下手,最后弄坏了一块才明白原来只需要靠焊盘上的焊将芯片焊上就行了,又交了一次学费;-) 其它元件焊起来就相对容易多了,基本上没有遇到什么问题。

本来以为Atmega168和Atmega8在管脚和ISP电路上没有任何区别,因此装完后就能够用Arduino网站介绍的那条简易下载线烧写bootloader了。刚开始装上Atmega168,下载bootloader就会出错,以为是板子安装的问题,仔细查找和分析后用Atmega8换下Atmega168,发现下载bootloader正常。怀疑原来用在Arduino串口模块上的下载线太简单,可能在Atmega168上无法正常工作,但此时已经能够确认板子安装基本是正确的了:-)

在Arduino网站上找到一篇介绍如何烧写Atmega168的文章,但文章中用到的是编程器而不是下载线。此时看起来有两种选择,一种是继续在下载线上纠缠,DIY一款适合Atmega168的下载线;另一种是买一个编程器,直接在编程器上完成bootloader的烧写。权衡再三后还是确定买一款编程器,虽然贵点,但以后在开发各种单片机应用的时候估计都能够用得着。此时只能用“工欲善其事,并先利其器”来安慰自己了!

编程器买回来之后,将Arduino安装目录bootloader168下的ATmegaBOOT_168_diecimila.hex文件用编程器烧到Atmega168芯片中。按下Arduino板子上的复位按钮,总算能看见接在13号管脚上的灯闪烁了,说明bootloader已经运行起来了。

安装完FT232BM USB驱动程序之后,试着在Arduino集成开发环境中打开了一个最简单的工程,编译之后再下载,再次出错!首先怀疑是Arduino设置的问题,检查了MCU的类型和串口,都没有问题,看了little bird放在YouTube上的安装过程视频,也没有发现什么不对的地方。为了定位问题所在,直接在串口调试软件里不断地给Arduino模块发数据,能够看到TX灯不断闪烁,但给bootloader发送相应的命令却得不到任何反应,RX灯也不闪烁。难道是从Arduino向外界发送数据的电路有问题?拿着万用表一段一段检查电压,似乎都正常,没有任何头绪,看起来下一个该投资的设备就是一台好一点的示波器了;-)

没有办法,只好修改bootloader的源码,让其在启动后不断地向外界发送数据。这回RX灯能够闪烁了,在串口调试软件里也能够收到数据, 看来硬件接线是正确的,总算松了一口气。不过收到的数据很奇怪,不论bootloader发送什么数据,收到的都是0×00!按照之前的经验,通常这种情况都是串口配置导致的问题,如波特率等。

继续Google没有什么收获,开始怀疑是不是时钟设置的问题,导致Atmega168发送数据时没有合适的时钟。在Makefile里找到了AVR_FREQ参数(默认值为16000000L),是外部晶振的频率,对它做了相应的修改,也不解决问题。继续在Makefile里游荡,看到ISPFUSES 参数时突然眼前一亮,会不会是熔丝(fuse)位的问题?熔丝位是Atmega168在工作时的配置参数,其中最重要的是有关频率的设置。Google到的The tale of AVRdude, ATmega168 and extended fuses bitsATmega 8 / 168 internal clock and fuse settings证实了我的猜测。仔细阅读了Arduino网站上的说明之后,确定相应的熔丝位应该设置成0xF8, 0xDF和0xFF。刚买的那个编程器里面就能够直接设置这些熔丝位:

重新编程Atmega168,这回总算能够在Arduino集成开发环境中下载工程了,试了数字I/O和模拟I/O,一切正常;-)

No tags

2 comments

  • Sarah · 2008/10/29 at 4:01 AM

    Keep up the good work.

  • Herry · 2009/09/16 at 7:55 PM

    不错啊!刚开始接触,学到不少知识了!

Leave a Reply

<<

>>