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

📄 main.c

📁 这是用M16做的jtag与stk500(正确说应该是ISP)合二为一的
💻 C
📖 第 1 页 / 共 2 页
字号:
			break;		

		default: 	
            tx_buf[7] = 0x00; // send dummy value for not supported parameters   
        break;      			
	}			
}
void cmdSetParameter(void)
{
	tx_buf[messagesize1]=0;  		// set message length
	tx_buf[messagesize0]=2;
	
	SetParameter();											//set selected parameter
	
	tx_buf[5] = CMD_SET_PARAMETER;
	tx_buf[6] = STATUS_CMD_OK; 

}
void cmdReadSignatureIsp(void) 
{

	tx_buf[5] = CMD_READ_SIGNATURE_ISP;
	ReadfusebitIsp();

}

void cmdEnterProgmodeIsp(void)
{
	tx_buf[messagesize1]=0;  		// set message length
	tx_buf[messagesize0]=2;
	
	EnterProgmodeIsp();
}

void cmdLeaveProgmodeIsp(void)
{
	tx_buf[messagesize1]=0;  		// set message length
	tx_buf[messagesize0]=2;
	
	DDRB&=31;												//leave spi pins High ampedance
	reset_DDR&=~_BV(reset);
	PORTB&=31;												//leave spi pins High ampedance
	reset_PORT&=~_BV(reset);
	
	tx_buf[5] = CMD_LEAVE_PROGMODE_ISP;
	tx_buf[6] = STATUS_CMD_OK;
	
}

void cmdreadosccalisp(void)
{
	tx_buf[5] = CMD_READ_OSCCAL_ISP;						//read osccal byte
	ReadfusebitIsp();
}
void cmdreadlockisp(void)
{
	tx_buf[5] = CMD_READ_LOCK_ISP;							//read lock bits
	ReadfusebitIsp();
}
void cmdreadfuseisp(void)
{
	tx_buf[5] = CMD_READ_FUSE_ISP;							//read fuse bits
	ReadfusebitIsp();
}
void cmdprogramlockisp(void)
{
	programfuseisp();										//program lock bits
	tx_buf[5] =CMD_PROGRAM_LOCK_ISP;
}
void cmdprogramfuseisp(void)
{
	programfuseisp();
	tx_buf[5] = CMD_PROGRAM_FUSE_ISP;						//program fuse bits
}
void cmdspimulti(void)
{
	int j;
	tx_buf[messagesize1]=rx_buf[7]/256;  		// set message length
	tx_buf[messagesize0]=rx_buf[7]+3;

	
	tx_buf[5] = CMD_SPI_MULTI;
	tx_buf[6] = STATUS_CMD_OK;
	for(j=0;j<rx_buf[7];j++)
	{
		tx_buf[j+7]=0x22;		//data send back
		
	}
	
	tx_buf[rx_buf[7]+7] = STATUS_CMD_OK;
	
}
void cmdchiperaseisp(void)
{
	tx_buf[messagesize1]=0;  		// set message length
	tx_buf[messagesize0]=2;

	tx_buf[5] = CMD_CHIP_ERASE_ISP;
	tx_buf[6] = STATUS_CMD_OK;
	
	spi(rx_buf[8]);											//erase dvice
	spi(rx_buf[9]);
	spi(rx_buf[10]);
	spi(rx_buf[11]);
	
	delay_ms(rx_buf[6]);
	
}
void cmdprogramflashisp(void)
{
	int a,b;
	long add;
	tx_buf[messagesize1]=0;  		// set message length
	tx_buf[messagesize0]=2;

	tx_buf[5] = CMD_PROGRAM_FLASH_ISP;
	tx_buf[6] = STATUS_CMD_OK;

	if(extended_address)									//flash with large memory
	{
		spi(0x4d);
		spi(0);
		spi(address_flash>>16);
		spi(0);
	}
	
	b=rx_buf[6]*256+rx_buf[7];
	add=address_flash;
	for(a=0;a<b;a+=2)
	{
		spi(rx_buf[10]);									//load Program Memory
		spi(address_flash>>8);
		spi(address_flash);
		spi(rx_buf[a+15]);

		spi(rx_buf[10]|8);									//load Program Memory
		spi(0);
		spi(address_flash);
		spi(rx_buf[a+16]);

		address_flash++;
	}

	if(rx_buf[8]&0x80)
		{
			spi(rx_buf[11]);									//write program memory
			spi(add>>8);
			spi(add);
			spi(0);
		
			delay_ms(rx_buf[9]);
		}
}
void cmdloadaddress(void)
{
	tx_buf[messagesize1]=0;  		// set message length
	tx_buf[messagesize0]=2;

    address_eeprom = rx_buf[8]*256+rx_buf[9];				//set eeprom address
    address_flash  = (rx_buf[7]*65536+rx_buf[8]*256+rx_buf[9])*2;			//set flash word address
	if(rx_buf[6]&0x80)
		extended_address=1;									//bit 31 is true so extended read should executed
	
	tx_buf[5] = CMD_LOAD_ADDRESS;
	tx_buf[6] = STATUS_CMD_OK;
	
}
void cmdreadflashisp(void)
{
	int j,k;
	k=rx_buf[6]*256+rx_buf[7];
	
	j=k+3;	
	tx_buf[messagesize1]=(unsigned char) (j >> 8);  		// set message length
	tx_buf[messagesize0]=(unsigned char) (j & 0xFF);

	tx_buf[5] = CMD_READ_FLASH_ISP;
	tx_buf[6] = STATUS_CMD_OK;
	
	if(extended_address)									//flash with large memory
	{
		spi(0x4d);
		spi(0);
		spi(address_flash>>16);
		spi(0);
	}

	
	for(j=0;j<k;j+=2)
	{
		spi(rx_buf[8]);
		spi(address_flash>>8);
		spi(address_flash);
		tx_buf[j+7]=spi(0xff);
	
		spi(rx_buf[8]|8);
		spi(address_flash>>8);
		spi(address_flash);
		tx_buf[j+8]=spi(0xff);
		
		address_flash++;
	}
	
	tx_buf[k+7] = STATUS_CMD_OK;
}

void cmdprogrameepromisp(void)
{
	tx_buf[messagesize1]=0;  		// set message length
	tx_buf[messagesize0]=2;

	tx_buf[5] = CMD_PROGRAM_EEPROM_ISP;
	tx_buf[6] = STATUS_CMD_OK;

	int a,b;
	unsigned char c,d;
	
	b=rx_buf[6]*256+rx_buf[7];								//eeprom nData bytes

	for(a=0;a<b;a++)
	{
		spi(0xa0);									//read eeprom if differ then write
		spi(address_eeprom>>8);
		spi(address_eeprom);
		c=spi(0xff);
		
		d=rx_buf[a+15]^c;
		if(d)
		{
			spi(rx_buf[10]);									//write Program Memory
			spi(address_eeprom>>8);
			spi(address_eeprom);
			spi(rx_buf[a+15]);

			delay_ms(rx_buf[9]);
		}
		address_eeprom++;
	}

}

void cmdreadeepromisp(void)
{
	int j,k;
	k=rx_buf[6]*256+rx_buf[7];
	
	j=k+3;	
	tx_buf[messagesize1]=(unsigned char) (j >> 8);  		// set message length
	tx_buf[messagesize0]=(unsigned char) (j & 0xFF);

	tx_buf[5] = CMD_READ_EEPROM_ISP;
	tx_buf[6] = STATUS_CMD_OK;
	
	k=rx_buf[6]*256+rx_buf[7];
	for(j=0;j<k;j++)
	{
		spi(rx_buf[8]);
		spi(address_eeprom>>8);
		spi(address_eeprom);
		tx_buf[j+7]=spi(0xff);

		address_eeprom++;
	}
	tx_buf[k+7] = STATUS_CMD_OK;
}

void cmdosccal(void)
{
	tx_buf[messagesize1]=0;  		// set message length
	tx_buf[messagesize0]=2;

	tx_buf[5] = CMD_OSCCAL;
	tx_buf[6] = STATUS_CMD_OK;
}
void delay_ms(int time)
{
	while(time--)
		_delay_ms(1);
}

char spi(char data)
{

	SPDR = data;
	/* Wait for transmission complete */
	/* Wait for reception complete */
	while(!(SPSR & (1<<SPIF)));
	/* Return data register */
	return SPDR;
}

void EnterProgmodeIsp(void)
{
	char tmp;
	
	
	tx_buf[5] = CMD_ENTER_PROGMODE_ISP;
	
	
	DDRB|=0xB0;												//set spi pins out put
	reset_DDR|=_BV(reset);

	sck_port &=~_BV(sck);								//clear sck
	
	delay_ms(rx_buf[7]+rx_buf[8]);	
	if(rx_buf[11]==0x53)										//this is avr set reset
	{
		
		reset_PORT &= ~_BV(reset);									//reset 0
		
		delay_ms(rx_buf[8]);
		delay_ms(10);
	
		spi(rx_buf[13]);
		delay_ms(rx_buf[10]);
		spi(rx_buf[14]);
		delay_ms(rx_buf[10]);
		tmp=spi(rx_buf[15]);
		delay_ms(rx_buf[10]);
		spi(rx_buf[16]);
		
		if(tmp==0x53)
		{
			tx_buf[6] = STATUS_CMD_OK; 
		}
			
		else tx_buf[6] = STATUS_CMD_FAILED; 
	}
	
	if(rx_buf[11]==0x69)										//this is 89s51 set reset
	{
		reset_PORT |= _BV(reset);									//reset 1
		delay_ms(rx_buf[8]);
		delay_ms(10);
		
		
		spi(rx_buf[13]);
		delay_ms(rx_buf[10]);
		spi(rx_buf[14]);
		delay_ms(rx_buf[10]);
		spi(rx_buf[15]);
		delay_ms(rx_buf[10]);
		tmp=spi(rx_buf[16]);
		
		if(tmp==0x69)
		{
			tx_buf[6] = STATUS_CMD_OK; 
		}
		
		else tx_buf[6] = STATUS_CMD_FAILED; 
	}
}
void ReadfusebitIsp(void)
{
	char k[4];
	
	
	tx_buf[messagesize1]=0;  		// set message length
	tx_buf[messagesize0]=4;
	
	tx_buf[6] = STATUS_CMD_OK;
	
	
	
	k[0]=spi(rx_buf[7]);
	k[1]=spi(rx_buf[8]);
	k[2]=spi(rx_buf[9]);
	k[3]=spi(rx_buf[10]);
	
	tx_buf[7]=k[rx_buf[6]-1];
	tx_buf[8] = STATUS_CMD_OK;	

}

void programfuseisp(void)
{
	tx_buf[messagesize1]=0;  		// set message length
	tx_buf[messagesize0]=3;

	spi(rx_buf[6]);
	spi(rx_buf[7]);
	spi(rx_buf[8]);
	spi(rx_buf[9]);

	tx_buf[6] = STATUS_CMD_OK;
	tx_buf[7] = STATUS_CMD_OK;

}

void SetParameter(void)
{
	switch(rx_buf[6])
	{
		case PARAM_OSC_PSCALE:
		{
			TCCR1B=0x08|(0x03&rx_buf[7]);
			pscalefsys=rx_buf[7];							// Set timer operation mode and prescaler					
		}
		break;
		
		case PARAM_OSC_CMATCH:
		{
			OCR1AL=rx_buf[7];
			cmatchdef=rx_buf[7];							//Set compare match value
		}
		break;
		
		case PARAM_SCK_DURATION:
		{
			SPCR=0x50;
			SPCR|=(0x3&rx_buf[7]);								//set spi clock
			sckdurationdef=(0x3&rx_buf[7]);
		}
		break;
	}
}

⌨️ 快捷键说明

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