|
发表于 2015-4-19 11:00:57
|
显示全部楼层
我一年前锁死了一片AVR8,当时在网上看到这个了,顺便研究了一下AVR的熔丝位和锁定位,然后我做了改进,能够兼容所有的AVR芯片.8、16、32只要支持并行编程的都可以。当然我并没有全部型号的AVR芯片,只能是查所有型号的datasheet,找到共同的熔丝位设置。主要看红色字体。另外因为我用的是STC51 1T单片机做解锁器,速度太快,做了延时nop(T)。如果两条指令之间的时间间隔大于250ns,就不用延时了。
还有,需要双电压太蛋疼了,后来我用mc34063做了个5V升压12V的电路。12V引脚千万别接错了,接错了会烧芯片!!!
/********************重写熔丝位********************/
void Write_Fuse(char LB, char HB, char EB) {
XA1 = 1; XA0 = 0;
BS1 = 0;
DATA = 0x40;
XTAL = 1; nop(T); XTAL = 0;
XA1 = 0; XA0 = 1;
DATA = LB; //写熔丝低位
XTAL = 1; nop(T); XTAL = 0;
BS1 = 0; BS2 = 0;
_WR = 0; nop(T); _WR = 1;
while((RDY_BSY == 0) && (KEY == 1));//等待数据写入
XA1 = 1; XA0 = 0;
BS1 = 0;
DATA = 0x40;
XTAL = 1; nop(T); XTAL = 0;
XA1 = 0; XA0 = 1;
DATA = HB; //写熔丝高位
XTAL = 1; nop(T); XTAL = 0;
BS1 = 1; BS2 = 0;
_WR = 0; nop(T); _WR = 1;
while((RDY_BSY == 0) && (KEY == 1));
BS1 = 0;
XA1 = 1; XA0 = 0;
BS1 = 0;
DATA = 0x40;
XTAL = 1; nop(T); XTAL = 0;
XA1 = 0; XA0 = 1;
DATA = EB; //写扩展熔丝位,如果没有扩展位,无影响
XTAL = 1; nop(T); XTAL = 0;
BS1 = 1; BS2 = 1;
_WR = 0; nop(T); _WR = 1;
while((RDY_BSY == 0) && (KEY == 1));
BS2 = 0;
}
/************高压恢复**********************/
void Recover_Fuse(void) {
PROG_ENABLE; //进入编程状态
_RST_12V = 0, _VCC_5V = 0; //RST与VCC同时上电
nop(500);
Chip_Erase(); //擦除芯片锁定位
Write_Fuse(0x02, 0x80, 0xff); //(低位,高位,扩展位)Atmega通用最佳设置
} |
|