|
本帖最后由 chengyang79 于 2015-12-9 23:02 编辑
前段时间做一个项目用的ATMEGA48单片机,用的淘宝几块钱的U盘式USBASP下载器,发现编程器和目标板无法正常通讯,校验ID码出现随机性错误,编程和校验都出现错误。
将ISP接口仔细检查了N遍(N>10),还是无济于事,
换了一块以前做的其他项目的ATMEGA48样板,发现通讯正常了,
于是以为是淘宝上买的单片机有问题,就马上联系代理商要了正品的ATMEGA48PA样片,失望的是问题依然存在。
接着怀疑到下载器上面,因为下载器是几块钱的USBASP,于是又弄了个双龙的USBISP,发现有时能通讯,但是大部分时候不行。
于是怀疑是板子布线的问题,于是又用剩下的空PCB只焊了单片机上去,下载程序,发现能下载了,但是再读ID码又错误了,并且也无法继续正常通讯。
从来没有遇过代码影响程序下载的,因为编程器会拉RST脚使器件进入编程模式,代码是不会运行的,所以即使SPI接口被配置成输出,也不会有问题啊。
接着折腾,又用新的空白单片机焊了一块样板,这次用U盘式的USPASP和双龙的USBISP都试了校验ID码和查空,都很顺利,证明通讯不稳定和PCB布线以及编程器无关。
心想这个问题确实只有可能和代码有关了,因为熔丝设置都是默认的,于是找来找去,觉得和程序中将系统时钟预分频器设定的语句相关度大一些,
于是把这句删除,再将编译后的代码下载到空白的新单片机中,再试了校验ID码和FLASH一切正常了。
我想,出现这个问题可能是以下的原因:
空白的AVR芯片熔丝默认选择的是内部8M RC振荡器,并且经过8分频,所以初始的系统时钟是1M的。
ATMEGA48的DATASHEET表明,CKDIV8熔丝位决定CLKPS位的初始值。若CKDIV8未编程,CLKPS位复位为“0000”;若
CKDIV8 已编程,CLKPS 位复位为“0011”,给出启动时分频因子为8。我用的空白芯片默认的熔丝设置,CLKPS 位复位为“0011”,然而在程序中又把CLKPS编程为“0000”,
导致下载器进入编程模式后读出熔丝位认为单片机时钟是1M,然而编程后接下来在下载器拉下单片机RST引脚进入编程模式之前,单片机中的程序已经“偷偷”把系统时钟改回8M了,
于是导致单片机和下载器通讯发生错误。
不知道我的分析是否对,有没有遇见相同问题的坛友?希望我的遭遇能对大家有一点点帮助!
PS:以前老工艺生产的ATMEGA48和现在新工艺生产的ATMEGA48PA 识别字(ID码)是不一样的。前者是:1E9205 后者是:1E920A |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|