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

📄 avricp.c

📁 AVR ICP 支持AVR器件编程
💻 C
📖 第 1 页 / 共 4 页
字号:
} 

/*--------------------------------------------------------------------------*/ 
/* turn LED on                                                              */ 
/*--------------------------------------------------------------------------*/ 
inline void Programer_LED_On(void) 
{ 
	PORTA&=_CV(MON_LED); 
} 
inline void Host_LED_On(void) 
{ 
	PORTA&=_CV(HOST_LED); 
} 

/*--------------------------------------------------------------------------*/ 
/* turn LED off                                                              */ 
/*--------------------------------------------------------------------------*/ 
inline void Programer_LED_Off(void) 
{ 
	PORTA|=_BV(MON_LED); 
} 
inline void Host_LED_Off(void) 
{ 
	PORTA|=_BV(HOST_LED); 
} 


/*--------------------------------------------------------------------------*/ 
/* UART initial setting (19200bps,8,1,N)                                    */ 
/*--------------------------------------------------------------------------*/ 
#define VALUE_UBRR (F_CPU/(19200*16L)-1)
void InitUART(void) 
{ 
	UBRRH = (unsigned char)(VALUE_UBRR>>8); 
	UBRRL = (unsigned char)(VALUE_UBRR); 
	//接收使能、发送使能   
	UCSRB=(1<<RXEN)|(1<<TXEN);
	return; 
} 


/*--------------------------------------------------------------------------*/ 
/* delay 128us                                                              */ 
/*--------------------------------------------------------------------------*/ 
void delay(int t) 
{ 
	unsigned int i;
	for(i=0;i<t;i++)
	{
		_delay_loop_2(32 * F_CPU/1000000L);
	} 
} 
/*--------------------------------------------------------------------------*/ 
/* delay 1us          t<=85                                                 */ 
/*--------------------------------------------------------------------------*/ 
#define wait_1us(t) _delay_loop_1(((F_CPU/1000000L)/3+1)*t);

/*--------------------------------------------------------------------------*/ 
/* delay 1ms                                                                */ 
/*--------------------------------------------------------------------------*/ 
void wait_1ms(int t) 
{ 
	unsigned int i;
	for(i=0;i<t;i++)
	{
		_delay_loop_2(250 * F_CPU/1000000L);
	} 
} 
/*--------------------------------------------------------------------------*/ 
/* delay forAT89C51/52                                                      */ 
/*--------------------------------------------------------------------------*/ 
#define F_AT89C51 18432000L
#define Time48Tclcl() wait_1us(48*1000000L/F_AT89C51+1)

void Wait51(unsigned char msecond)
{
    //asm("nop");
    //asm("nop");
    //asm("nop");
    //asm("nop");
	unsigned char m;
	m=msecond;
    do{delay(8);m--;}while(!(PINA & _BV(RDY51)) && m);
    return;
}


/*--------------------------------------------------------------------------*/ 
/* UART send a byte                                                         */ 
/*--------------------------------------------------------------------------*/ 
void putc(uchar c)
{
	while( !(UCSRA & (1<<UDRE)) );
	UDR=c;
}
/*--------------------------------------------------------------------------*/ 
/* UART receive a byte                                                      */ 
/*--------------------------------------------------------------------------*/ 
uchar getc(void)
{
	while( !(UCSRA & (1<<RXC)) );
	return UDR;
}

/*--------------------------------------------------------------------------*/ 
/* UART send a memory block                                                 */ 
/*--------------------------------------------------------------------------*/ 
void putcmem(uchar *mem,uchar length)
{
	uchar *pmem,len;
	pmem=mem,len=length;
	while(len)
	{
		putc(*pmem++);
		len--;
	}
}
/*--------------------------------------------------------------------------*/ 
/* UART send a string                                                       */ 
/*--------------------------------------------------------------------------*/ 
void putcstr(uchar *str)
{
	putcmem(str,strlen(str));
}



/*--------------------------------------------------------------------------*/ 
/*  SPI Clock                                                               */ 
/*--------------------------------------------------------------------------*/ 
void SPIClock(void) 
{ 
	PORTB|=_BV(TARGET_SCK);
	asm("nop");
	asm("nop"); 
	asm("nop");
	PORTB&=_CV(TARGET_SCK); 
	asm("nop");
	asm("nop");
	asm("nop");
	return;
} 

/*--------------------------------------------------------------------------*/ 
/* SPI write                                                               */ 
/*--------------------------------------------------------------------------*/ 
unsigned char SPIWrite(unsigned char c) 
{ 
	unsigned char   i, rx; 
    
	Programer_LED_On(); 
    
	i = 0x80; 
	rx = 0x00; 
	do { 
		if (c & i) 
		{ 
			PORTB|=_BV(TARGET_MOSI); 
		} 
		else 
		{ 
			PORTB&=_CV(TARGET_MOSI); 
		} 
		
		if ((PINB & _BV(TARGET_MISO))!=0) //if (bit_is_set(PINB, TARGET_MISO))
		{ 
			rx |= i; 
		} 
		SPIClock(); 
		i >>= 1; 
	} while (i); 
    
	Programer_LED_Off(); 
    
	return rx; 
} 

/*--------------------------------------------------------------------------*/ 
/* SPI read                                                                 */ 
/*--------------------------------------------------------------------------*/ 
inline unsigned char SPIRead(void) 
{ 
	return SPIWrite(0x00); 
} 


/*--------------------------------------------------------------------------*/ 
/* SPI Init                                                                 */ 
/*--------------------------------------------------------------------------*/ 
void SPIInit(unsigned char device) 
{ 
	
	InitPortForSPI();     
	
	PORTB&=_CV(TARGET_SCK);
	SetReset(); 
	delay(0xff);
	ClrReset(); 
	delay(0xff);
    
	SPIWrite(0xAC); 
	SPIWrite(0x53); 
	if (0x20 <= device && device <= 0x7F) 
	{ 
		unsigned char count;
		count=32;
		do{
			if (SPIRead() == 0x53) 
			{ 
				
				break; 
			} 
			SPIWrite(0x00);
			SPIClock(); 
			SPIWrite(0xAC); 
			SPIWrite(0x53); 
		}while(--count); 
	} 
	else 
	{ 
		SPIWrite(0x00);
	} 
	SPIWrite(0x00);
	delay(0x10); 
	return;
} 
/*--------------------------------------------------------------------------*/ 
/* SPI Init  FOR AT89C51/52                                                 */ 
/*--------------------------------------------------------------------------*/ 
void SPIInitAT89S(unsigned char device) 
{ 
	
	InitPortForSPI();     
	
	PORTB&=_CV(TARGET_SCK);
	SetReset(); 
	delay(0xff);
	//ClrReset(); 
	//delay(0xff);
    
	SPIWrite(0xAC); 
	SPIWrite(0x53); 
	if (G_device == AT89S51 || G_device == AT89S52) 
	{ 
		unsigned char count;
		count=32;
		do{
			if (SPIRead() == 0x69) 
			{ 
				
				break; 
			} 
			SPIWrite(0x00);
			SPIClock(); 
			SPIWrite(0xAC); 
			SPIWrite(0x53); 
		}while(--count); 
	} 
	else 
	{ 
		SPIWrite(0x00);
	} 
	SPIWrite(0x00);
	delay(0x10); 
	return;
} 
/*--------------------------------------------------------------------------*/ 
/* Parallel Init                                                                 */ 
/*--------------------------------------------------------------------------*/ 
void ParallelInit(unsigned char device) 
{ 
	
	InitPortForParallel();     
	if(device == AT89C51)
	{
		OutP2(0x00);
		OutP3(0x00);
		OutCON(0x00);
		SetVPP5V();
	}
	
	//delay(0x10); 
	return;
} 

/*--------------------------------------------------------------------------*/ 
/*                                     +-------------+------------+------+  */ 
/*  Commands                           | Host writes | Host reads |      |  */ 
/*  --------                           +-----+-------+------+-----+      |  */ 
/*                                     | ID  | data  | data |     | Note |  */ 
/* +-----------------------------------+-----+-------+------+-----+------+  */ 
/* | Enter programming mode            | 'P' |       |      | 13d |   1  |  */ 
/* | Report autoincrement address      | 'a' |       |      | 'Y' |      |  */ 
/* | Set address                       | 'A' | ah al |      | 13d |   2  |  */ 
/* | Write program memory, low byte    | 'c' |    dd |      | 13d |   3  |  */ 
/* | Write program memory, high byte   | 'C' |    dd |      | 13d |   3  |  */ 
/* | Issue Page Write                  | 'm' |       |      | 13d |      |  */ 
/* | Read program memory               | 'R' |       |dd(dd)|     |   4  |  */ 
/* | Write data memory                 | 'D' |    dd |      | 13d |      |  */ 
/* | Read data memory                  | 'd' |       |   dd |     |      |  */ 
/* | Chip erase                        | 'e' |       |      | 13d |      |  */ 
/* | Write lock bits                   | 'l' |    dd |      | 13d |      |  */ 
/* | Write fuse bits                   | 'f' |    dd |      | 13d |  11  |  */ 
/* | Read fuse bits                    | 'F' |       |   dd |     |  11  |  */ 
/* | Leave programming mode            | 'L' |       |      | 13d |   5  |  */ 
/* | Select device type                | 'T' |    dd |      | 13d |   6  |  */ 
/* | Read signature bytes              | 's' |       | 3*dd |     |      |  */ 
/* | Return supported device codes     | 't' |       | n*dd | 00d |   7  |  */ 
/* | Return software identifier        | 'S' |       | s[7] |     |   8  |  */ 
/* | Return sofware version            | 'V' |       |dd dd |     |   9  |  */ 
/* | Return hardware version           | 'v' |       |dd dd |     |   9  |  */ 
/* | Return programmer type            | 'p' |       |   dd |     |  10  |  */ 
/* | Set LED                           | 'x' |    dd |      | 13d |  12  |  */ 
/* | Clear LED                         | 'y' |    dd |      | 13d |  12  |  */ 
/* | Universial command                | ':' |  3*dd |   dd | 13d |      |  */ 
/* | New universal command             | '.' |  4*dd |   dd | 13d |      |  */ 
/* | Special test command              | 'Z' |  2*dd |   dd |     |      |  */ 
/* +-----------------------------------+-----+-------+------+-----+------+  */ 
/* | Read lock bits                    | 'r' |       |   dd |     |      |  */ 
/* | Read high fuse bits               | 'N' |       |   dd |     |      |  */ 
/* | Read extended fuse bits           | 'Q' |       |   dd |     |      |  */ 
/* | Write high fuse bits              | '.' |ACA8 2d|      | 13d |      |  */ 
/* | Write extended fuse bits          | '.' |ACA4 2d|      | 13d |      |  */ 
/* +-----------------------------------+-----+-------+------+-----+------+  */ 
/* | Check block support               | 'b' |       |"Y"2*dd     |      |  */ 
/* | Start block flash load            | 'B' |2*dd"F"|      | 13d |      |  */ 
/* |                                   |     | n*dd  |      |     |      |  */ 
/* | Start block eeprom load           | 'B' |2*dd"E"|      | 13d |      |  */ 
/* |                                   |     | n*dd  |      |     |      |  */ 
/* | Start block flash read            | 'g' |2*dd"F"| n*dd | 13d |      |  */ 
/* | Start block eeprom read           | 'g' |2*dd"E"| n*dd | 13d |      |  */ 
/* +-----------------------------------+-----+-------+------+-----+------+  */ 



/* +-----------------------------------+-----+-------+------+-----+------+  */ 
/*                                     | ID  | host  | programer  | Note |  */ 
/* | Enter programming mode            | 'P' |       |      | 13d |   1  |  */ 
/* +-----------------------------------+-----+-------+------+-----+------+  */ 
void Enter_programming_mode(void)
{
    
    if(G_device < 0x80)SPIInit(G_device); 
	else 
	if(G_device == AT89C51 || G_device == AT89C52)ParallelInit(G_device);
	else 
	if(G_device == AT89S51 || G_device == AT89S52)SPIInitAT89S(G_device); 
    G_pgmode = TRUE;
    putc(13); 
	return;
}
/* +-----------------------------------+-----+-------+------+-----+------+  */ 
/* |                                   | ID  | host  | programer  | Note |  */ 
/* | Report autoincrement address      | 'a' |       |      | 'Y' |      |  */ 
/* +-----------------------------------+-----+-------+------+-----+------+  */ 
void Report_autoincrement_address(void)
{
    putc('Y'); 
	return;
}
/* +-----------------------------------+-----+-------+------+-----+------+  */ 
/* |                                   | ID  | host  | programer  | Note |  */ 
/* | Set address                       | 'A' | ah al |      | 13d |   2  |  */ 

⌨️ 快捷键说明

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