|
楼主 |
发表于 2019-11-4 18:29:58
|
显示全部楼层
本层开源
ATMEGA16L手册:
电路图:
源文件如下:
- /*
- *********************************************************************************************************
- 高压并行编程 — 对ATmega16L使用高电压并行编程模式设置熔丝值。
- 使用NANO板对目标芯片16L编程,程序来源于网上,数码之家jf201006修改。
- 若给别的芯片写熔丝,请查阅对应的手册。
- 程序已经给出详细的注解,可以根据实际使用情况进行修改。
- 接线请参照程序设置。
- 接上12V电源,指示灯常亮,按下运行按键,指示灯灭一下后点亮,熔丝值设置完成。
- 请在转载时保留以上信息。
- 2019年7月29日
- *********************************************************************************************************
- */
- // 设置要写入的熔丝值
- // #define HFUSE 0x99 // ATmega16的熔丝高位值
- // #define LFUSE 0xE1 // ATmega16的熔丝低位值
- #define HFUSE 0x99 // ATmega16的默认值,使用内部振荡
- #define LFUSE 0xE1
- // 上位机NANO各引脚的定义。模拟引脚作为数字引脚使用,引脚为14-19
- #define DATA PORTD // D端口
- #define DATAD DDRD // D端口方向寄存器
- #define VCC 8 //目标芯片供电
- #define RDY 12 //来自目标芯片的RDY/!BSY信号 对应目标PD1
- #define OE 11 // 对应目标PD2
- #define WR 10 // 对应目标PD3
- #define BS1 9 // 对应目标PD4
- #define XA0 13 // 对应目标PD5
- #define XA1 18 // 对应目标PD6
- #define PAGEL 19 // 对应目标PD7
- #define BS2 16 // 对应目标PA0
- #define RST 14 //此引脚给目标芯片的!RESET加+12V电压
- #define XTAL1 17 //时钟脉冲
- #define BUTTON 15 // 启动按键
- /*
- *********************************************************************************************************
- ** 函数名称 :setup()
- ** 函数功能 :系统初始化各引脚。
- ** 入口参数 :无
- ** 出口参数 :无
- *********************************************************************************************************
- */
- void setup()
- {
- // 设置上位机各引脚方向
- DATA = 0x00;
- DATAD = 0xFF; // D端口8个引脚为输出
- pinMode(VCC, OUTPUT);
- pinMode(RDY, INPUT); // 输入,等待RDY变高
- pinMode(OE, OUTPUT);
- pinMode(WR, OUTPUT);
- pinMode(BS1, OUTPUT); // BS1、BS0为熔丝高低位设置
- pinMode(XA0, OUTPUT);
- pinMode(XA1, OUTPUT);
- pinMode(PAGEL, OUTPUT);
- pinMode(RST, OUTPUT); // 启动+12V供电
- pinMode(BS2, OUTPUT);
- pinMode(XTAL1, OUTPUT);
- pinMode(BUTTON, INPUT);
- // 初始化关键引脚
- digitalWrite(BUTTON, HIGH); // 高为高,等待按下
- digitalWrite(RST, HIGH); //高为高,关闭+12V
- digitalWrite(VCC, LOW); //目标芯片1280不上电
- }
- /*
- *********************************************************************************************************
- ** 函数名称 :loop()
- ** 函数功能 :主函数
- ** 入口参数 :无
- ** 出口参数 :无
- *********************************************************************************************************
- */
- void loop()
- {
- while(digitalRead(BUTTON) == HIGH) { // 等待按键按下
- }
- // 按下后执行以下程序
- digitalWrite(PAGEL, LOW); //进入编程各引脚初始值
- digitalWrite(XA1, LOW);
- digitalWrite(XA0, LOW);
- digitalWrite(BS1, LOW);
- digitalWrite(BS2, LOW);
- digitalWrite(XTAL1, LOW);
-
- digitalWrite(VCC, HIGH); //目标芯片加电+5V
- digitalWrite(WR, HIGH);
- digitalWrite(OE, HIGH);
- delay(1); //目标加电、!RESET为"0"、XATAL1六个脉冲
- for (int x=0; x<7; x++) {
- digitalWrite(XTAL1, HIGH);
- delayMicroseconds(300);
- digitalWrite(XTAL1, LOW);
- delayMicroseconds(300);
- }
- //delay(1);
- digitalWrite(RST, LOW); // 输出为低,+12V供电
- delay(10);
- //进入并行编程模式
-
- // 对目标芯片写入高位熔丝值
- sendcmd(B01000000); // 发送写熔丝命令
- writefuse(HFUSE, true);
- delay(10);
-
- //对目标芯片写入低位熔丝值
- sendcmd(B01000000);
- writefuse(LFUSE, false);
- delay(1000); // 延时
- //退出并行编程模式
- digitalWrite(RST, HIGH);// 关闭目标芯片的!RESET上+12V电压
- // 关闭所有输出
- DATA = 0x00;
- digitalWrite(BS2, LOW);
- digitalWrite(OE, LOW);
- digitalWrite(PAGEL, LOW);
- digitalWrite(XA1, LOW);
- digitalWrite(XA0, LOW);
- digitalWrite(BS1, LOW);
-
- digitalWrite(WR, LOW);
- digitalWrite(VCC, LOW); //关闭目标芯片供电
- }
- /*
- *********************************************************************************************************
- ** 函数名称 :sendcmd()
- ** 函数功能 :传送命令
- ** 入口参数 :命令字节值
- ** 出口参数 :无
- *********************************************************************************************************
- */
- void sendcmd(byte command) // 向目标芯片发送命令模块
- {
- // 加载命令
- digitalWrite(XA1, HIGH); // XA1、XA2值为10
- digitalWrite(XA0, LOW);
- delayMicroseconds(100); //
- digitalWrite(BS1, LOW);
- //DATA = B01000000; // 此为写熔丝命令 0x40
- DATA = command;
- digitalWrite(XTAL1, HIGH); //向目标芯片发送命令
- delay(10);
- digitalWrite(XTAL1, LOW);
- //delay(1);
- }
- /*
- *********************************************************************************************************
- ** 函数名称 :writefuse()
- ** 函数功能 :写熔丝
- ** 入口参数 :熔丝值,高低位标志
- ** 出口参数 :无
- *********************************************************************************************************
- */
- void writefuse(byte fuse, boolean highbyte) // 向目标芯片写熔丝模块
- {
- // 若highbyte=true则写入高位熔丝值, 否则写入低位熔丝值。
-
- // 进入写熔丝模式
- digitalWrite(XA1, LOW);
- digitalWrite(XA0, HIGH);
- delay(1);
- // 写入
- DATA = fuse; // 传送熔丝值
- digitalWrite(XTAL1, HIGH);
- delay(10);
- digitalWrite(XTAL1, LOW);
- if(highbyte == true) // 根据参数设置高低位
- digitalWrite(BS1, HIGH);
- else
- digitalWrite(BS1, LOW);
- digitalWrite(WR, LOW); // 写入对应的熔丝值
- delay(1);
- digitalWrite(WR, HIGH);
- delay(100);
- }
复制代码
谢谢欣赏!!
折腾不下去的,AVR单片机锁了的,闲的没事做的,都进来吧,很长的帖子:
https://www.mydigit.cn/forum.php?mod=viewthread&tid=95789
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|