Arduino Leonardo 兼容板调试

Written by on 2012/10/14 in 博客 - No comments

Arduino Leonardo兼容板已经计划比较久了,但一直没有完成,原因在于按照Arduino新的协议要求,所有非原装的Arduino都不允许再在板子上标明“Arduino”字样,此外我们已经基本完成设计工具由Eagle到KiCAD的转换,所以希望能用KiCAD来画这一新版的Arduino。

从原理上讲,Leonardo最大的改变在于换用了ATmega32U4作为核心芯片,这在很大程度上解决了Arduino UNO的弊病:单独使用一个Atmega8U2来做为USB转串口的芯片,然后再使用一个Atmega32P作为核心芯片。Leonardo所使用的ATmega32U4是一个带USB功能的单片机,Arduino在新板的设计上只使用这样一颗芯片的确是一个优雅的做法,它除了可以完成传统意义上Arduino通过USB接口下载程序的功能之后,又可以将在Arduino IDE中编写的程序直接下载到这个芯片中运行,省去了不少的过程和材料,这使得Arduino的价格空间有了更大下降的可能性。

Leonardo基本上保持了Arduino原来板子的外形和接口,只是因为主芯片的变化,使得原来I2C引脚的位置发生了改变,因此在左上方的排针上我们可以看到新加的SCL和SDA引脚。另外左下角的排针又做了修改,加入了一个IOREF引脚。而对用户来讲,变化最大的应该还是左侧的USB座换成了micro USB座,这样就变得更加小巧了。

收到PCB板并完成焊接之后,就开始了板子功能的调试。按照之前的经验,显然要做的第一步是将 bootloader 下载到 Leonardo 的主芯片中了,于是掏出USBTinyISP连接到Mac笔记本的USB接口上,再打开 Arduino 1.0.1 IDE 进行 bootloader 的烧写。在从菜单中选择好Board和Programmer的类型后,运行Burn Bootloader命令, USBTinyISP 上的小灯闪了几下之后简单粗暴地提示读出的设备类型标识号不正确。

这个早有心理准备,先看看读出的设备号是多少再说。于是打开终端窗口搬出高级一点的avrdude命令:

avrdude -c usbtiny -p atmega32u4

这条命令下去之后,avrdude开始抱怨自己不认识什么 ATmega32U4 芯片,于是到 CrossPack 网站下载了 CrossPack-AVR-20120217.dmg进行更新,更新后的avrdude可以支持ATmega32U4的芯片,不过读出的ID号为全0,显然通过ICSP接口无法与芯片正常通信上。

在迅速检查了ICSP部分的原理并检查了焊接和连线之后,表明这部分连接应该是正确的,于是开始怀疑USBTinyISP是否支持ATmega32U4的烧写。再次求助Google,一翻E文之后没有找到明确的说法是支持还是不支持,但至少知道有一个下载线肯定是支持的——AVRISP mkII,这也是Atmel推荐的下载线。之后还有一个小收获,就是得知用ArduinoISP下载Leonardo的bootloader也是可能的方案之一。

家里正好没有多余的Arduino了,于是计划第二天先找一块Arduino实验一下ArduinoISP的方案,不行的话再考虑AVRISP mkII。计划赶不上变化,第二天一早被其他事情缠身,没有及时测试ArduinoISP,中午因为其他材料的事情正好到了电子市场,于是直接去找AVRISP mkII下载线。专营开发工具的店面老板告诉我,目前他们只有两款AVR的下载工具,一款是基于ISP的,另一款是基于JTAG的,显然我能用的是前者,但这个是不是就是我要的mkII老板也说不清楚,在没有做好足够功课的前提下,我买了一个下面这样的下载线。

下午回到公司继续调试Leonardo,新买的下载线经过进一步确认为AVRISP,而不是AVRISP mkII,两者的外形长得很像但功能似乎还是有点区别,另外用这个下载线也不能正确读出ATmega32U4的芯片ID。一番心疼之后,找来一块Arduino Duemilenove下载进去ArduinoISP的代码,然后再通过它来往其它Arduino板子上写bootloader,比如UNO和Leonardo。情况依旧,利用ArduinoISP可以往之前的一块UNO板中写入bootloader,但往新做的Leonardo板中下载bootloader时依旧提示找不到设备。

于是再次将焦点转向硬件,由于ICSP部分的电路已经检查过了,所以将重点集中在两个可能性上:一是晶振有没有起振,二是芯片本身是不是有问题。ATmega32U4是直接从国外的正规渠道获得,拿到假芯片的可能性基本没有,于是开始怀疑是不是晶振部分的问题。此时证明一个还不错的示波器将会有多么重要,否则就只能靠分析和猜测去一步一步检验。最终原因在于画板的时候没有仔细标明晶振一脚的位置,导致焊接的时候将晶振焊反了,所以系统其实还没有正常工作。

重新焊过晶振之后问题果然得到解决,在Mac上使用USBTinyISP可以正常读出ATmega32U4芯片的ID号了。此时回到Arduino IDE中往Leonardo中写bootloader,发现使用USBTinyISP在验证阶段会出现某个字节验证出错的提示,并且每次写入时出错的字节都不一样,而用手工搭建的ArduinoISP下载bootloader则速度快质量高,写入过程没有出现任何错误。

此时已经等不及来仔细琢磨究竟是什么原因导致USBTinyISP写入bootloader出错了,打算先接上USB线看看是不是能够正常识别出Leonardo这个设备。结果无论是在Windows 7 32位台式机上,还是在Mac笔记本上都无法识别出这一USB设备。在Windows上通过设备管理器中查到的设备ID号也全是Unknow,在做了几次手工更新驱动程序的尝试之后,开始Google是否Leonardo有驱动兼容性的问题,事实上也存在一些相关的讨论,但其他人的问题都发生在可以正常找到设备ID之后,这点倒是给了点提示,说明目前遇到的问题可能还没有到驱动这一级别。

有了之前的教训,这次老老实实拿出电路原理图,对照着电路板仔细检查。USB部分焊接的10K的电阻引起了我的注意,按理这个电阻不应该用这么大的,仔细看了一下原理,果然应该选用更小的22欧姆的电阻,可能是画图的时候没有注意修改元件的值,从而导致焊接时的问题。公司元件柜里暂时没有找到22欧姆的电阻,但这两个电阻不接其实也可以工作,所以实验的时候简单地把这两个电阻的位置短路了,再接上USB线后就可以找到Arduio Leonardo了。

在Mac上和Windows 7上都试验了一下Blink例程,一切正常,更多功能等待继续验证中;-)

Leave a Comment

使用新浪微博登录