⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avrpro.c

📁 脱机ISP编程器
💻 C
字号:
unsigned char avr_bin[]=
{
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
	0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
};

//Mega16 	SS P12	SCK P20		MOSI P11	RST P9	MISO P10	ACK P19
#define M16RST	9
#define M16SS	12
#define M16SCK	20
#define M16MOSI	11
#define	M16MISO	10
#define M16ACK	19

#define SET_SCK_0()		CLR_PIO(M16SCK)
#define SET_SCK_1()		SET_PIO(M16SCK)
#define SET_MOSI_0()		CLR_PIO(M16MOSI)
#define SET_MOSI_1()		SET_PIO(M16MOSI)
#define SET_RST_0()		CLR_PIO(M16RST)
#define SET_RST_1()		SET_PIO(M16RST)
#define SET_SS_0()			CLR_PIO(M16SS)
#define SET_SS_1()			SET_PIO(M16SS)

#define GET_MISO()			GET_PIO()&(0x01UL<<M16MISO)
#define GET_ACK()			GET_PIO()&(0x01UL<<M16ACK)

#ifndef NOP
#define NOP				asm("mov %r0,%r0")
#endif

void Delayus(unsigned long us)
{
	unsigned long i;
	
	do
	{
		for (i=0;i<100;i++)	NOP;
	}
	
	while (--us);
}

uchar SPI_R_W(uchar d)
{
	uchar i;
	
	for (i=0;i<8;i++)
	{
		if (d&0x80)	SET_MOSI_1();
		else		SET_MOSI_0();
		
		SET_SCK_1();
		
		NOP;
		
		NOP;				//时钟高
		
		d<<=1;
		
		if (GET_MISO())		d++;
		
		SET_SCK_0();
		
		NOP;
		
		NOP;
	}
	
	return d;
}

//使能编程
uchar EnablePro()
{
	unsigned char d;
	SET_SCK_0();
	SET_RST_1();
	Delayus(5000);
	SET_RST_0();
	Delayus(25000);	//at least 20ms
	SPI_R_W(0xAC);
	SPI_R_W(0x53);
	d=SPI_R_W(0xFF);
	SPI_R_W(0xFF);
	uart0_Printf("编程使能答复:0x%02x",d);
	
	if (d==0x53)		d=1;
	else			d=0;
	
	return d;
}

//读取芯片ID
void ReadAvrID()
{
	unsigned char d;
	uart0_Printf("AVR ID:");
	SPI_R_W(0x30);
	SPI_R_W(0x00);
	SPI_R_W(0x00);
	d=SPI_R_W(0x00);
	uart0_Printf("%02X ",d);
	SPI_R_W(0x30);
	SPI_R_W(0x00);
	SPI_R_W(0x01);
	d=SPI_R_W(0x00);
	uart0_Printf("%02X ",d);
	SPI_R_W(0x30);
	SPI_R_W(0x00);
	SPI_R_W(0x02);
	d=SPI_R_W(0x00);
	uart0_Printf("%02X ",d);
}

//擦除Flash
void ErasFlash()
{
	SPI_R_W(0xAC);
	SPI_R_W(0x80);
	SPI_R_W(0xFF);
	SPI_R_W(0xFF);
	Delayus(10000);	//at least 10ms
	uart0_Printf("擦除完毕\n");
}

//写页缓冲数据
void WritePageCache(unsigned char *pt)
{
	unsigned char i;
	
	for (i=0;i<0x40;i++)
	{
		SPI_R_W(0x40);
		SPI_R_W(0x00);
		SPI_R_W(i);
		SPI_R_W(*pt++);
		SPI_R_W(0x48);
		SPI_R_W(0x00);
		SPI_R_W(i);
		SPI_R_W(*pt++);
	}
}

//将页缓冲数据写入Flash
void SavePage(unsigned int page)
{
	page>>=1;
	SPI_R_W(0x4C);
	SPI_R_W(page/256);
	SPI_R_W(page&0xFF);
	SPI_R_W(0xFF);
	Delayus(10000);
}

//逐页编程
void ProPage()
{
	unsigned char *pt=avr_bin;
	
	while (pt<avr_bin+sizeof(avr_bin))
	{
		WritePageCache(pt);
		SavePage(((unsigned long)pt)-((unsigned long)avr_bin));
		pt+=128;
	}
}

//写熔断时低字节
void WriteSettingLow(unsigned char d)
{
	SPI_R_W(0xAC);
	SPI_R_W(0xA0);
	SPI_R_W(0xFF);
	SPI_R_W(d);
	Delayus(10000);
}

//写熔断丝高字节
void WriteSettingHight(unsigned char d)
{
	SPI_R_W(0xAC);
	SPI_R_W(0xA8);
	SPI_R_W(0xFF);
	SPI_R_W(d);
	Delayus(10000);
}

//加密
void WriteLockBit(unsigned char d)
{
	d|=0xC0;
	SPI_R_W(0xAC);
	SPI_R_W(0xFF);
	SPI_R_W(0xFF);
	SPI_R_W(d);
	Delayus(10000);
}

//复位avr
void ResetAvr()
{
	SET_RST_1();
}

//烧录
void avrpro()
{
	while (!EnablePro());		//等待编程使能成功
	
	ReadAvrID();
	
	ErasFlash();
	
	ProPage();
	
	WriteSettingLow(0x2F);
	
	WriteSettingHight(0xC9);
	
	WriteLockBit(0xFC);
	
	ResetAvr();
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -