数码之家

 找回密码
 立即注册
搜索
查看: 9816|回复: 75

[AVR] 对ATMEGA16L进行高压并行熔丝位恢复(附源代码)

    [复制链接]
发表于 2019-11-4 18:29:00 | 显示全部楼层 |阅读模式
很多使用AVR单片机的童鞋最怕的就是烧错熔丝位,很不幸的我,锁死了好几片。原因是和坛友一起折腾时,不断的乱试。。。。后来干脆用一块UNO对锁死的片子高压并行编程对熔丝复位,效果超好。这是一块入门级芯片,拿它来做小百鼠吧


先看手册,有中文的,关心的有以下几点引脚


并行编程用到的引脚及功能





这部分定义
  1. <font size="3">#define  RDY      12   //来自目标芯片的RDY/!BSY信号 对应目标PD1
  2. #define  OE       11      // 对应目标PD2
  3. #define  WR       10      // 对应目标PD3
  4. #define  BS1      9       // 对应目标PD4
  5. #define  XA0      13      // 对应目标PD5
  6. #define  XA1      18      // 对应目标PD6
  7. #define  PAGEL    19      // 对应目标PD7
  8. #define  BS2      16      // 对应目标PA0
  9. #define  DATA     PORTD  // D端口
  10. #define  DATAD  DDRD   // D端口方向寄存器</font>
复制代码


进入编程必须的条件


会用到的





如何进入并行编程模式


  1. <font size="3">  digitalWrite(VCC, HIGH);  //目标芯片加电+5V
  2.   digitalWrite(WR, HIGH);
  3.   digitalWrite(OE, HIGH);
  4.   delay(1);                //目标加电、!RESET为"0"、XATAL1六个脉冲
  5.     for (int x=0; x<7; x++) {
  6.       digitalWrite(XTAL1, HIGH);
  7.       delayMicroseconds(300);
  8.       digitalWrite(XTAL1, LOW);
  9.      delayMicroseconds(300);
  10.     }
  11.   //delay(1);
  12.   digitalWrite(RST, LOW);   // 输出为低,+12V供电
  13. </font>
复制代码


写熔丝高低位


  1. <font size="3">  digitalWrite(XA1, HIGH);  // XA1、XA2值为10
  2.   digitalWrite(XA0, LOW);
  3.   delayMicroseconds(100);  //
  4.   digitalWrite(BS1, LOW);
  5.   DATA = B01000000;  // 此为写熔丝命令 0x40
  6.   digitalWrite(XTAL1, HIGH);  //向目标芯片发送命令
  7.   delay(10);
  8.   digitalWrite(XTAL1, LOW);

  9.   DATA = fuse;  // 传送熔丝值
  10.   digitalWrite(XTAL1, HIGH);
  11.   delay(10);
  12.   digitalWrite(XTAL1, LOW);
  13.   digitalWrite(BS1, HIGH);  
  14.   digitalWrite(WR, LOW);     // 写入对应的熔丝值
  15.   delay(1);
  16.   digitalWrite(WR, HIGH);
  17. </font>
复制代码




与高位比,就是BS1不一样。

手册上的时序有点错误


这时实践后的时序


其实就看传送命令、传送熔丝值、写熔丝值三个关键点就可以了。

命令:XA1高
数据:XA0高
写入:WR低


熔丝值定义




ATMEGA16L的默认值为:低位为E1,高位为99,使用内部RC振荡。

  1. <font size="3">#define  HFUSE  0x99    // ATmega16的默认值,使用内部振荡
  2. #define  LFUSE  0xE1</font>
复制代码




明白的原理,开始做电路。
这个图是芯片对芯片的,实际使用UNO或NANO都可以。


我是用的自己DIY的UNO


先把小白薯放好,简单标一下


连线


连线


连线


连线


没有上按键,用根线代替,短路到地,LED灭下,好了


又试下禁用SPI


一样可以恢复
下面是恢复ATMEGA328的电路路


程序中默认熔丝值要修改
  1. <font size="3">define  HFUSE  0xD9    // ATmega328的默认值,使用内部振荡
  2. define  LFUSE  0x62</font>
复制代码


next

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 25家元 +976 收起 理由
kkdkj + 20 謝謝分享
mydigit + 500 原创文章热度奖励
ynqjzzh + 20 謝謝分享
农村小伙 + 20 謝謝分享
newnet1234 + 20 原創內容
ch104517745 + 20
10655188 + 16 謝謝分享
巴闭 + 20
zzy_85569381 + 20 謝謝分享
hongo + 20 優秀文章

查看全部打赏

 楼主| 发表于 2019-11-4 18:29:58 | 显示全部楼层
本层开源

ATMEGA16L手册:


电路图:


源文件如下:
  1. /*

  2. *********************************************************************************************************  
  3. 高压并行编程 — 对ATmega16L使用高电压并行编程模式设置熔丝值。
  4. 使用NANO板对目标芯片16L编程,程序来源于网上,数码之家jf201006修改。
  5. 若给别的芯片写熔丝,请查阅对应的手册。
  6. 程序已经给出详细的注解,可以根据实际使用情况进行修改。
  7. 接线请参照程序设置。
  8. 接上12V电源,指示灯常亮,按下运行按键,指示灯灭一下后点亮,熔丝值设置完成。
  9. 请在转载时保留以上信息。

  10. 2019年7月29日

  11. *********************************************************************************************************
  12. */
  13. // 设置要写入的熔丝值
  14. // #define HFUSE  0x99  // ATmega16的熔丝高位值
  15. // #define LFUSE  0xE1  // ATmega16的熔丝低位值
  16. #define  HFUSE  0x99    // ATmega16的默认值,使用内部振荡
  17. #define  LFUSE  0xE1

  18. // 上位机NANO各引脚的定义。模拟引脚作为数字引脚使用,引脚为14-19
  19. #define  DATA    PORTD // D端口
  20. #define  DATAD   DDRD  // D端口方向寄存器
  21. #define  VCC     8      //目标芯片供电
  22. #define  RDY     12     //来自目标芯片的RDY/!BSY信号 对应目标PD1
  23. #define  OE      11     // 对应目标PD2
  24. #define  WR      10     // 对应目标PD3
  25. #define  BS1     9      // 对应目标PD4
  26. #define  XA0     13     // 对应目标PD5
  27. #define  XA1     18     // 对应目标PD6
  28. #define  PAGEL   19     // 对应目标PD7
  29. #define  BS2     16     // 对应目标PA0
  30. #define  RST     14     //此引脚给目标芯片的!RESET加+12V电压
  31. #define  XTAL1   17  //时钟脉冲
  32. #define  BUTTON  15     // 启动按键

  33. /*
  34. *********************************************************************************************************
  35. ** 函数名称 :setup()
  36. ** 函数功能 :系统初始化各引脚。
  37. ** 入口参数 :无
  38. ** 出口参数 :无
  39. *********************************************************************************************************
  40. */
  41. void setup()
  42. {
  43.   // 设置上位机各引脚方向
  44.   DATA = 0x00;
  45.   DATAD = 0xFF;          // D端口8个引脚为输出
  46.   pinMode(VCC, OUTPUT);
  47.   pinMode(RDY, INPUT);   // 输入,等待RDY变高
  48.   pinMode(OE, OUTPUT);
  49.   pinMode(WR, OUTPUT);
  50.   pinMode(BS1, OUTPUT); // BS1、BS0为熔丝高低位设置
  51.   pinMode(XA0, OUTPUT);
  52.   pinMode(XA1, OUTPUT);
  53.   pinMode(PAGEL, OUTPUT);
  54.   pinMode(RST, OUTPUT);  // 启动+12V供电
  55.   pinMode(BS2, OUTPUT);
  56.   pinMode(XTAL1, OUTPUT);
  57.   pinMode(BUTTON, INPUT);

  58.   // 初始化关键引脚
  59.   digitalWrite(BUTTON, HIGH);  // 高为高,等待按下
  60.   digitalWrite(RST, HIGH);  //高为高,关闭+12V
  61.   digitalWrite(VCC, LOW);  //目标芯片1280不上电
  62. }
  63. /*
  64. *********************************************************************************************************
  65. ** 函数名称 :loop()
  66. ** 函数功能 :主函数
  67. ** 入口参数 :无
  68. ** 出口参数 :无
  69. *********************************************************************************************************
  70. */
  71. void loop()  
  72. {
  73.   while(digitalRead(BUTTON) == HIGH) {  // 等待按键按下
  74.   }
  75.   // 按下后执行以下程序
  76.   digitalWrite(PAGEL, LOW); //进入编程各引脚初始值
  77.   digitalWrite(XA1, LOW);
  78.   digitalWrite(XA0, LOW);
  79.   digitalWrite(BS1, LOW);
  80.   digitalWrite(BS2, LOW);
  81.   digitalWrite(XTAL1, LOW);
  82.   
  83.   digitalWrite(VCC, HIGH);  //目标芯片加电+5V
  84.   digitalWrite(WR, HIGH);
  85.   digitalWrite(OE, HIGH);
  86.   delay(1);                //目标加电、!RESET为"0"、XATAL1六个脉冲
  87.     for (int x=0; x<7; x++) {
  88.       digitalWrite(XTAL1, HIGH);
  89.       delayMicroseconds(300);
  90.       digitalWrite(XTAL1, LOW);
  91.      delayMicroseconds(300);
  92.     }
  93.   //delay(1);
  94.   digitalWrite(RST, LOW);   // 输出为低,+12V供电
  95.   delay(10);
  96.   //进入并行编程模式  
  97.   
  98.   // 对目标芯片写入高位熔丝值
  99.   sendcmd(B01000000);  // 发送写熔丝命令
  100.   writefuse(HFUSE, true);
  101.   delay(10);
  102.   
  103.   //对目标芯片写入低位熔丝值
  104.   sendcmd(B01000000);
  105.   writefuse(LFUSE, false);

  106.   delay(1000);  // 延时

  107.   //退出并行编程模式
  108.   digitalWrite(RST, HIGH);// 关闭目标芯片的!RESET上+12V电压

  109.   // 关闭所有输出
  110.   DATA = 0x00;
  111.   digitalWrite(BS2, LOW);
  112.   digitalWrite(OE, LOW);
  113.   digitalWrite(PAGEL, LOW);
  114.   digitalWrite(XA1, LOW);
  115.   digitalWrite(XA0, LOW);
  116.   digitalWrite(BS1, LOW);
  117.   
  118.   digitalWrite(WR, LOW);  
  119.   digitalWrite(VCC, LOW);  //关闭目标芯片供电
  120. }
  121. /*
  122. *********************************************************************************************************
  123. ** 函数名称 :sendcmd()
  124. ** 函数功能 :传送命令
  125. ** 入口参数 :命令字节值
  126. ** 出口参数 :无
  127. *********************************************************************************************************
  128. */
  129. void sendcmd(byte command)  // 向目标芯片发送命令模块
  130. {
  131.   // 加载命令
  132.   digitalWrite(XA1, HIGH);  // XA1、XA2值为10
  133.   digitalWrite(XA0, LOW);
  134.   delayMicroseconds(100);  //
  135.   digitalWrite(BS1, LOW);
  136.   //DATA = B01000000;  // 此为写熔丝命令 0x40
  137.   DATA = command;
  138.   digitalWrite(XTAL1, HIGH);  //向目标芯片发送命令
  139.   delay(10);
  140.   digitalWrite(XTAL1, LOW);
  141.   //delay(1);
  142. }
  143. /*
  144. *********************************************************************************************************
  145. ** 函数名称 :writefuse()
  146. ** 函数功能 :写熔丝
  147. ** 入口参数 :熔丝值,高低位标志
  148. ** 出口参数 :无
  149. *********************************************************************************************************
  150. */
  151. void writefuse(byte fuse, boolean highbyte)  // 向目标芯片写熔丝模块
  152. {
  153.   // 若highbyte=true则写入高位熔丝值, 否则写入低位熔丝值。
  154.   
  155.   // 进入写熔丝模式
  156.   digitalWrite(XA1, LOW);
  157.   digitalWrite(XA0, HIGH);
  158.   delay(1);
  159.   // 写入
  160.   DATA = fuse;  // 传送熔丝值
  161.   digitalWrite(XTAL1, HIGH);
  162.   delay(10);
  163.   digitalWrite(XTAL1, LOW);
  164.   if(highbyte == true)      // 根据参数设置高低位
  165.     digitalWrite(BS1, HIGH);  
  166.   else
  167.     digitalWrite(BS1, LOW);
  168.   digitalWrite(WR, LOW);     // 写入对应的熔丝值
  169.   delay(1);
  170.   digitalWrite(WR, HIGH);
  171.   delay(100);
  172. }

复制代码



谢谢欣赏!!







折腾不下去的,AVR单片机锁了的,闲的没事做的,都进来吧,很长的帖子:
https://www.mydigit.cn/forum.php?mod=viewthread&tid=95789


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 12家元 +234 收起 理由
hideaway + 20 優秀文章
花生仔 + 20 優秀文章
zzy_85569381 + 20 謝謝分享
goodanytime + 20 優秀文章
10655188 + 20 謝謝分享
ljlun + 18 恭喜精华!看来不是最早那种真熔丝了.
mxlkf + 20
jsycwnw + 20 優秀文章
wska + 20
qrut + 20 優秀文章

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2019-11-4 19:04:31 | 显示全部楼层
大婶玩的这样高端,我只能在旁边默默的看热闹。。。。

打赏

参与人数 2家元 +12 收起 理由
锰子 + 10 歡迎探討
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-11-4 20:27:14 | 显示全部楼层
厉害了word哥,面包板插满了~

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-11-4 21:53:49 | 显示全部楼层
哈哈,正好我也想学这个,多指点啊:handshake:

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-11-5 17:26:02 | 显示全部楼层
一脸懵逼的进来,一脸懵逼的离开:lol:

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2019-11-5 17:28:54 | 显示全部楼层
以前用周立功的商用烧录器,随便烧随便恢复熔丝

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-5 19:11:48 | 显示全部楼层
温力口 发表于 2019-11-4 19:04
大婶玩的这样高端,我只能在旁边默默的看热闹。。。。

看看就会了:titter:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-5 19:12:35 | 显示全部楼层
qrut 发表于 2019-11-4 20:27
厉害了word哥,面包板插满了~

还没有满,要是芯片对芯片就会满:titter:

打赏

参与人数 1家元 +10 收起 理由
锰子 + 10 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-5 19:13:05 | 显示全部楼层
人艰不拆了 发表于 2019-11-4 21:53
哈哈,正好我也想学这个,多指点啊

一起折腾吧:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-5 19:13:26 | 显示全部楼层
solarshen666 发表于 2019-11-5 17:26
一脸懵逼的进来,一脸懵逼的离开

这个。。。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-5 19:15:13 | 显示全部楼层
qd0426 发表于 2019-11-5 17:28
以前用周立功的商用烧录器,随便烧随便恢复熔丝

商用的用不起:titter:
穷人只能用穷办法:lol:
回复 支持 反对

使用道具 举报

发表于 2019-11-5 21:17:48 | 显示全部楼层
jf201006 发表于 2019-11-5 19:15
商用的用不起
穷人只能用穷办法

蹭公司的:lol:
回复 支持 反对

使用道具 举报

发表于 2019-11-6 07:25:06 | 显示全部楼层
恭喜精华!看来不是最早那种真熔丝了

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-11-6 07:53:13 | 显示全部楼层
曾经用过一段时间这类芯片的帮顶了!

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-11-6 08:32:56 | 显示全部楼层
这个配置位也是flash的吧

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 歡迎探討 也可以这么理解。

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-11-6 09:38:07 | 显示全部楼层
谢谢分享,标记一下,说不定哪天就用上了!

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-11-6 10:19:30 | 显示全部楼层
直接搞个有源晶振,简单多了。

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 歡迎探討 可以的。

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-11-6 15:49:11 | 显示全部楼层
一脸懵逼的进来:dizzy:,一脸懵逼的离开:cry:

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-11-6 15:59:29 | 显示全部楼层
牛掰了,前来围观,哈哈,收藏先,等牙膏

打赏

参与人数 1家元 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-25 23:52 , Processed in 0.140400 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表