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

📄 main.c

📁 AVR单片机DIY编程器!源代码及原理图都有!
💻 C
📖 第 1 页 / 共 2 页
字号:
			{	
				tmp=block_size/page_size;				//计算有多少页
	
				for(tmp2=0;tmp2<tmp;tmp2++)				//页写数次
				{	
					loadCMD(CMD_LOAD_WRITE_EEPROM);
					loadAddH((address>>8)&0x00ff);
					for(i=0;i<page_size;i++)
					{
						loadAddL(address&0x00ff);
						loadDataL(msg_buffer[i+5+tmp2*page_size]);	
						dataLatch();
						address++;
					}
					writeEep2Page();
				}
			}
			else
			{
				if(msg_buffer[3]&0b10000000)			//
				{
					;	
				}
			}
		}
		else											//byte Mode
		{
			;
		}
		LED_FLASH_2;
		num_bytes = 2;
		msg_buffer[0] = CMD_PROGRAM_EEPROM_PP;
		msg_buffer[1] = STATUS_CMD_OK;
	}
	
	//命令CMD_READ_EEPROM_PP
	else if(cmd==CMD_READ_EEPROM_PP)
	{
		block_size = ((unsigned int)msg_buffer[1])<<8;
		block_size |= msg_buffer[2];
		for(i=0;i<block_size;i++)
		{
			tmp  = address&0x00ff;
			tmp2 = (address>>8)&0x00ff;
			msg_buffer[i+2]=readEepromData(tmp2,tmp);
			address++;
		}
		num_bytes = block_size+3;
		msg_buffer[0] = CMD_READ_EEPROM_PP;
		msg_buffer[1] = STATUS_CMD_OK;
		msg_buffer[block_size+2] = STATUS_CMD_OK;
		LED_FLASH_2;
	}
	
	//命令CMD_PROGRAM_FUSE_PP
	else if(cmd==CMD_PROGRAM_FUSE_PP)
	{
		if(msg_buffer[1]==0x00)
		tmp=writeFuseLow(msg_buffer[2]);
		else if(msg_buffer[1]==0x01)
		tmp=writeFuseHig(msg_buffer[2]);
		num_bytes = 2;
		msg_buffer[0] = CMD_PROGRAM_FUSE_PP;
		if(tmp)
		msg_buffer[1] = STATUS_CMD_OK;
		else
		msg_buffer[1] = STATUS_RDY_BSY_TOUT;
	}
	
	//命令CMD_READ_FUSE_PP
	else if(cmd==CMD_READ_FUSE_PP)
	{
		tmp = readFuseLock(msg_buffer[1]);
		num_bytes = 3;
		msg_buffer[0] = CMD_READ_FUSE_PP;
		msg_buffer[1] = STATUS_CMD_OK;
		msg_buffer[2] = tmp;
	}
	
	//命令CMD_PROGRAM_LOCK_PP
	else if(cmd==CMD_PROGRAM_LOCK_PP)
	{
		tmp=writeLockByte(msg_buffer[2]);
		num_bytes = 2;	
		msg_buffer[0] = CMD_PROGRAM_LOCK_PP;
		if(tmp)
		msg_buffer[1] = STATUS_CMD_OK;
		else
		msg_buffer[1] = STATUS_RDY_BSY_TOUT;
	}
	
	//命令CMD_READ_LOCK_PP
	else if(cmd==CMD_READ_LOCK_PP)
	{
		tmp = readFuseLock(0x02);
		num_bytes = 3;
		msg_buffer[0] = CMD_READ_LOCK_PP;
		msg_buffer[1] = STATUS_CMD_OK;
		msg_buffer[2] = tmp;
		
	}
	
	//命令CMD_READ_SIGNATURE_PP
	else if(cmd==CMD_READ_SIGNATURE_PP)
	{
		tmp = readIDByte(msg_buffer[1]);
		num_bytes = 3;
		msg_buffer[0] = CMD_READ_SIGNATURE_PP;
		msg_buffer[1] = STATUS_CMD_OK;
		msg_buffer[2] = tmp;
	}
	//命令CMD_READ_OSCCAL_PP
	else if(cmd==CMD_READ_OSCCAL_PP)
	{
		tmp = readOSCCAL(msg_buffer[1]);
		num_bytes = 3;
		msg_buffer[0] = CMD_READ_OSCCAL_PP;
		msg_buffer[1] = STATUS_CMD_OK;
		msg_buffer[2] = tmp;
	}
	
	//命令CMD_SET_CONTROL_STACK
	else if(cmd==CMD_SET_CONTROL_STACK)		//我不知道这些数做什么,没有详细的描述
	{
		for(tmp=0;tmp<32;tmp++)			
		{
			control_stack[tmp]=msg_buffer[1+tmp];
		}
		num_bytes = 2;
		msg_buffer[0] = CMD_SET_CONTROL_STACK;
		msg_buffer[1] = STATUS_CMD_OK;
	}
	
	//命令CMD_ENTER_PROGMODE_HVSP
	else if(cmd==CMD_ENTER_PROGMODE_HVSP)
	{
		num_bytes = 2;
		msg_buffer[0] = CMD_ENTER_PROGMODE_PP;
		msg_buffer[1] = STATUS_CMD_OK;
	}
	
	//命令CMD_LEAVE_PROGMODE_HVSP
	else if(cmd==CMD_LEAVE_PROGMODE_HVSP)
	{
		;
	}
	
	//命令CMD_CHIP_ERASE_HVSP
	else if(cmd==CMD_CHIP_ERASE_HVSP)
	{
		;
	}
	
	//命令CMD_PROGRAM_FLASH_HVSP
	else if(cmd==CMD_PROGRAM_FLASH_HVSP)
	{
		;
	}
	
	//命令CMD_READ_FLASH_HVSP
	else if(cmd==CMD_READ_FLASH_HVSP)
	{
		;
	}
	
	//命令CMD_PROGRAM_EEPROM_HVSP
	else if(cmd==CMD_PROGRAM_EEPROM_HVSP)
	{
		;
	}
	
	//命令CMD_READ_EEPROM_HVSP
	else if(cmd==CMD_READ_EEPROM_HVSP)
	{
		;
	}
	
	//命令CMD_PROGRAM_FUSE_HVSP
	else if(cmd==CMD_PROGRAM_FUSE_HVSP)
	{
		;
	}
	
	//命令CMD_READ_FUSE_HVSP
	else if(cmd==CMD_READ_FUSE_HVSP)
	{
		;
	}
	
	//命令CMD_PROGRAM_LOCK_HVSP
	else if(cmd==CMD_PROGRAM_LOCK_HVSP)
	{
		;
	}
	
	//命令CMD_READ_LOCK_HVSP
	else if(cmd==CMD_READ_LOCK_HVSP)
	{
		;
	}
	
	//命令CMD_READ_SIGNATURE_HVSP
	else if(cmd==CMD_READ_SIGNATURE_HVSP)
	{
		;
	}
	
	//命令CMD_READ_OSCCAL_HVSP
	else if(cmd==CMD_READ_OSCCAL_HVSP)
	{
		;
	}
	
	
	//命令CMD_ENTER_PROGMODE_ISP
	else if(cmd == CMD_ENTER_PROGMODE_ISP)
	{
		prgMode=1;
		enterProgMode();
		msDelay(msg_buffer[2]);			//进入编程模式
		LED_ON_1;
		LED_ON_2;
		LED_OFF_3;
		num_bytes = 2;
		msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
		msg_buffer[1] = STATUS_CMD_OK;		
	}
	
	//命令 CMD_LEAVE_PROGMODE_ISP
	else if(cmd==CMD_LEAVE_PROGMODE_ISP)
	{
		pageProgEnd();			//
		prgMode=0;
		exitProgMode();		
		LED_OFF_1;
		LED_OFF_2;
		LED_ON_3;
		num_bytes = 2;
		msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
		msg_buffer[1] = STATUS_CMD_OK;		
	}
	//命令CMD_CHIP_ERASE_ISP
	else if(cmd==CMD_CHIP_ERASE_ISP)
	{
		tmp=eraseChip();
		if(msg_buffer[2]==0)
		{
			msDelay(msg_buffer[1]);
		}
		else
		{
			msDelay(20);			//本来是ISP的硬件查询
		}		
		num_bytes = 2;
		msg_buffer[0] = CMD_CHIP_ERASE_ISP;
		if(tmp)
		{
			msg_buffer[1] = STATUS_CMD_OK;			
		}
		else
		{
			msg_buffer[1] = STATUS_CMD_TOUT;
		}
	}
	//命令CMD_PROGRAM_FLASH_ISP
	else if(cmd==CMD_PROGRAM_FLASH_ISP)
	{
		block_size = ((unsigned int)msg_buffer[1])<<8;
		block_size |= msg_buffer[2];
		mode = msg_buffer[3];
		
		if(!(mode&0x01))			//字写模式 
		{
			for(i=0;i<block_size;i++)
			{
				;					//字节模式调过
			}
		}
		else 						//页写模式
		{
			loadCMD(CMD_LOAD_WRITE_FLASH);
			start_address=address;
			for(i=0;i<block_size;i+=2)
			{
				tmp = address&0x00ff;
				flashDataLoad(tmp,msg_buffer[i+11],msg_buffer[i+10]);
				address++;
			}
			if(mode&0x80)		//如果页写
			{
				tmp = (start_address>>8)&0x00ff;
				loadAddH(tmp);
				if(pageProg())
				{
					msg_buffer[1] = STATUS_CMD_OK;
				}
				else 
				{
					msg_buffer[1] = STATUS_RDY_BSY_TOUT;
				}
			}	
			LED_FLASH_2;
		}
		num_bytes = 2;
		msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
	}
	
	//命令CMD_READ_FLASH_ISP
	else if(cmd==CMD_READ_FLASH_ISP)
	{
		block_size = ((unsigned int)msg_buffer[1])<<8;
		block_size |= msg_buffer[2];
		//tmp = msg_buffer[3];
		
		for(i=0;i<block_size;i+=2)
		{
			tmp  = address&0x00ff;
			tmp2 = (address>>8)&0x00ff;
			tmp16=flashDataRead(tmp2,tmp);
			tmp  = tmp16&0x00ff;
			tmp2 = (tmp16>>8)&0x00ff;
			msg_buffer[i+2] = tmp;
			msg_buffer[i+3] = tmp2;
			address++;
		}
		num_bytes = block_size+3;
		msg_buffer[0] = CMD_READ_FLASH_ISP;
		msg_buffer[1] = STATUS_CMD_OK;
		msg_buffer[block_size+2] = STATUS_CMD_OK;
		LED_FLASH_2;
	}
	//命令CMD_PROGRAM_EEPROM_ISP
	else if(cmd==CMD_PROGRAM_EEPROM_ISP)
	{
		block_size = ((unsigned int)msg_buffer[1])<<8;
		block_size |= msg_buffer[2];
		mode = msg_buffer[3];		
		//始终是字节写模式
		for(i=0;i<block_size;i++)
		{
			tmp=(address>>8)&0x00ff;
			tmp2=address&0x00ff;
			loadCMD(CMD_LOAD_WRITE_EEPROM);
			loadAddH(tmp);
			writeEep(tmp2,msg_buffer[10+i]);
			writeEep2Page();
			address++;
			LED_FLASH_2;
		}
		num_bytes = 2;
		msg_buffer[0] = CMD_PROGRAM_EEPROM_ISP;
		msg_buffer[1] = STATUS_CMD_OK;
	}

	//命令CMD_READ_EEPROM_ISP
	else if(cmd==CMD_READ_EEPROM_ISP)
	{
		block_size = ((unsigned int)msg_buffer[1])<<8;
		block_size |= msg_buffer[2];
		for(i=0;i<block_size;i++)
		{
			tmp  = address&0x00ff;
			tmp2 = (address>>8)&0x00ff;
			msg_buffer[i+2]=readEepromData(tmp2,tmp);
			address++;
		}
		num_bytes = block_size+3;
		msg_buffer[0] = CMD_READ_EEPROM_ISP;
		msg_buffer[1] = STATUS_CMD_OK;
		msg_buffer[block_size+2] = STATUS_CMD_OK;
	}
	
	//命令CMD_PROGRAM_FUSE_ISP
	else if(cmd==CMD_PROGRAM_FUSE_ISP)
	{
		//msg_buffer[4]为熔丝位的内容
		if(msg_buffer[2]==0xA0)		//写低位熔丝位
		{
			writeFuseLow(msg_buffer[4]);	
		}
		else if(msg_buffer[2]==0xA8)	//写高位熔丝位
		{
			writeFuseHig(msg_buffer[4]);	
		}
		num_bytes = 3;
		msg_buffer[0] = CMD_PROGRAM_FUSE_ISP;
		msg_buffer[1] = STATUS_CMD_OK;		
		msg_buffer[2] = STATUS_CMD_OK;
	}
	
	//命令CMD_READ_FUSE_ISP
	else if(cmd==CMD_READ_FUSE_ISP)
	{	
		switch(msg_buffer[2])		
		{
			case 0x50:
				msg_buffer[2] =	readFuseLock(0);			//读熔丝位
				break;
			case 0x58:	
				msg_buffer[2] =	readFuseLock(1);			//读高熔丝位
				break;
			default:
				break;			
		}
		num_bytes = 4;
		msg_buffer[0] = CMD_READ_FUSE_ISP;
		msg_buffer[1] = STATUS_CMD_OK;		
		msg_buffer[3] = STATUS_CMD_OK;
	}

	//命令CMD_PROGRAM_LOCK_ISP
	else if(cmd==CMD_PROGRAM_LOCK_ISP)
	{
		writeLockByte(msg_buffer[4]|0xC0);
		num_bytes = 3;
		msg_buffer[0] = CMD_PROGRAM_LOCK_ISP;
		msg_buffer[1] = STATUS_CMD_OK;		
		msg_buffer[2] = STATUS_CMD_OK;
	}
	//命令CMD_READ_LOCK_ISP
	else if(cmd==CMD_READ_LOCK_ISP)
	{
		msg_buffer[2] = readFuseLock(2);
		num_bytes = 4;
		msg_buffer[0] = CMD_READ_LOCK_ISP;
		msg_buffer[1] = STATUS_CMD_OK;		
		msg_buffer[3] = STATUS_CMD_OK;
	}
	//命令CMD_READ_SIGNATURE_ISP
	else if(cmd==CMD_READ_SIGNATURE_ISP)
	{
		tmp=msg_buffer[4]&0x03;
		msg_buffer[2] = readIDByte(tmp);
		num_bytes = 4;
		msg_buffer[0] = CMD_READ_SIGNATURE_ISP;
		msg_buffer[1] = STATUS_CMD_OK;		
		msg_buffer[3] = STATUS_CMD_OK;
	}
	//命令CMD_READ_OSCCAL_ISP
	else if(cmd==CMD_READ_OSCCAL_ISP)
	{
		tmp=msg_buffer[4]&0x03;
		msg_buffer[2]= readOSCCAL(tmp);
		num_bytes = 4;
		msg_buffer[0] = CMD_READ_OSCCAL_ISP;
		msg_buffer[1] = STATUS_CMD_OK;		
		msg_buffer[3] = STATUS_CMD_OK;
	}
	else
	{
		num_bytes = 1;
		msg_buffer[0] = STATUS_CMD_UNKNOWN;
	}
	
	//传送缓冲区数据
	if(num_bytes>0)
	{		
		putChar(MESSAGE_START);
		checkSum=MESSAGE_START;
		putChar(seqNum);
		checkSum^=seqNum;
		tmp=(num_bytes&0xFF00)>>8;
		putChar(tmp);
		checkSum^=tmp;
		tmp=num_bytes&0x00FF;
		putChar(tmp);
		checkSum^=tmp;
		putChar(TOKEN);
		checkSum^=TOKEN;
		for(i=0;i<num_bytes;i++)
		{
			putChar(msg_buffer[i]);
			checkSum^=msg_buffer[i];
		}		
		putChar(checkSum);
		checkSum=0x00;
	}
}                                
                                 
                                 
                                 

⌨️ 快捷键说明

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