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

📄 main.c

📁 一个编程器的下位机固件
💻 C
📖 第 1 页 / 共 2 页
字号:
{
   Tiny_SendByte(0x50);     
   Tiny_SendByte(0);
   Tiny_SendByte(0);  
   *fusebit = Tiny_SendByte(0);   //send low byte
 
   fusebit ++;

   Tiny_SendByte(0x58);     
   Tiny_SendByte(0x08);
   Tiny_SendByte(0);  
   *fusebit = Tiny_SendByte(0);   //send low byte 
}


////////////////////////////////////////////////////////////////
void Tiny_WriteLockBit(uchar lockdata)
{
   Tiny_SendByte(0xac);     
   Tiny_SendByte(0xe0);
   Tiny_SendByte(0);  
   Tiny_SendByte(/*0xc0 & */lockdata);   //send low byte 
//   clock_vDelay(200);                   //delay
}


////////////////////////////////////////////////////////////////
void Tiny_WriteFuseBit(uchar* fusedata)
{
   Tiny_SendByte(0xac);     
   Tiny_SendByte(0xa0);
   Tiny_SendByte(0);  
   Tiny_SendByte(*fusedata++);   //send low byte 

   clock_vDelay(300);          //delay

   Tiny_SendByte(0xac);     
   Tiny_SendByte(0xa8);
   Tiny_SendByte(0);  
   Tiny_SendByte(*fusedata);   //send low byte 
}


////////////////////////////////////////////////////////////////
void Tiny_PowerUp()
{  
   RST_SET();
   PW5V_OFF();
   clock_vDelay(50);
   SCK_CLR();
   RST_CLR();
   clock_vDelay(50);
   PW5V_ON();
   clock_vDelay(200);  //20ms
}






//////////////////////////////////////////////////////////////////////////
void main (void)
{
	uchar   i,j;
	uint    progdata;
	uchar   Pack[2];
	
	uchar k,RetValue;
	uint m;
	
	uint    ReadAddr,ReadCounter;
	uint    times = 0;
	uchar idata   buffer[90];
	uint    ProgStatus = PROGSTATUS_NONE;
	uint    progcount = 0;
	uchar   ChipType;
	uint    PicOscCal;
	uint    PicConfig[8];
	uint    PicBandgap;
	uint    PicOffset;
	uchar   BufOffset;
	uint    PackType, PackLen;
	
	
	uint    Tiny_Offset;
	uchar   TinyLockBit;
	uchar   TinyFuse[2];

    serial_init();
	
	while(1)
	{
		for(i=0; i<128;i++)      //get the package until end
		{  
           while(!RI);    //no data receive
		   buffer[i] = SBUF;
           RI = 0;

		   if( (buffer[i] == '*') && 
		       (buffer[i - 1] == 'D') &&
		       (buffer[i - 2] == 'N') && 
			   (buffer[i - 3] == 'E') )
		   {
		      break;
		   }
		}

		for(i=0; i<128; i++)      //decode the package
		{
			if( (buffer[i] == 'S') && 
			    (buffer[i + 1] == 'E') && 
				(buffer[i + 2] == 'M') && 
			    (buffer[i + 3] == 'I') && 
				(buffer[i + 4] == 'C') && 
				(buffer[i + 5] == 'O') )
			{ 
			   j = BufOffset = i;
			   break;
			}
		}

		Pack[0] = buffer[BufOffset + 6];
		Pack[1] = buffer[BufOffset + 7];
        PackType = Mult(Pack[0], Pack[1]);

		switch(PackType)
		{
		  case OPERATE_OK:
				ProgStatus = PROGSTATUS_NONE;
				if(ChipType == CHIP_PIC16F676)
				{
				   ProgModeCancle();
				   progcount = 0;
				}
		  break;

		  case	NEED_MCURET:
		   		ProgStatus = PROGSTATUS_NONE;
				if(ChipType == CHIP_PIC16F676)
				{
				   ProgModeCancle();
				   progcount = 0;
				}
				SendPackage(RETURN_MCURET, 0, NULL); 
		  break;

		  case TEST_CHIP:
				ChipType = CHIP_NONE;   
				ProgStatus = PROGSTATUS_NONE;
				/////////////tiny test handler///////////////////////
				if (ChipType == CHIP_NONE)
				{
				   Tiny_PowerUp();
				   for(i=0; i<3; i++)
				   {
					  Tiny_SendByte(0xAC);
					  Tiny_SendByte(0x53);
				 	  RetValue =  Tiny_SendByte(0);   //if RetValue=0x53
					  Tiny_SendByte(0);
					  if(RetValue == 0x53)
					  {
					     ChipType = CHIP_ATTINY;
					     SendPackage(RETURN_CHIP_ATTINY, 12, "Atmel Tiny13");
						 break;
					  }
				   }
				}
				///////////////pic test handler////////////////////
				if (ChipType == CHIP_NONE)
				{    
				    for(k=0; k<3; k++)
					{
				        ProgModeSet();
						for(m=0; m<0x3ff; m++)       //move pointer to 0x3fff
						{
						  ProgIncAddr();
						}
						PicOscCal = ProgReadCode();           //read the osccal value
						ProgCommandSet(PICCMD_LDCONFIG);      //send command,move pointer to 0x2000
						clock_vDelay(1);                      //delay
						for(i=0; i<16; i++)
						{
						  PGDCLR();   //dat = 0
						  PGCSET();   //clk = 1
						  nop();
						  nop();
						  PGCCLR();   //clk = 0        
						}
						for(i=0; i<8; i++)     ///read 8 words config 
						{			      
						  PicConfig[i] = ProgReadCode();
						  ProgIncAddr();
						}
						PicBandgap = PicConfig[7] & 0x3000;
						ProgModeCancle();     
						if(PicConfig[6] == 0x10e0)
						{
				           ChipType = CHIP_PIC16F676;
				           SendPackage(RETURN_CHIP_PIC, 9, "PIC16F676");
						   break;
						}
					}
				}
				///////////////no chip tested//////////////////////////
				if(ChipType == CHIP_NONE)
				{
				  //SendPackage(RETURN_CHIP_NONE, 16, "No Chip Detected");
				  ChipType = CHIP_PIC16F676;
				  SendPackage(RETURN_CHIP_PIC, 9, "PIC16F676");
				} 
		       break;

          case WRITE_CONFIG:
			  	/////////////after finish the program memory write////////////
				if(ProgStatus != PackType)
				{ 
				  ProgStatus = PackType;
				  ProgModeCancle();
				  progcount = 0;
				  ProgModeSet();
				}

				PackLen = Mult(buffer[BufOffset + 8], buffer[BufOffset + 9]);
				
				progdata = buffer[BufOffset + 10 + 15];   //msb
				progdata <<= 8;
				progdata += buffer[BufOffset + 10 + 14];    //lsb
				
				ProgWriteConfig(progdata);
				for(i=0; i<7; i++)
				{
				  ProgCommandSet(PICCMD_INCADDR);
				}
				ProgCommandSet(PICCMD_PROGRAM);
				clock_vDelay(50);                   //delay
				//////////return status////////////////////
				SendPackage(RETURN_WRITE_CONFIG, 0, NULL); 
		       break;
         //////////////////////////////////////////////////////////
		 //tiny handler
		 //
		 //////////////////////////////////////////////////////////
		  case TINY_READ_LOCK:
		  case TINY_VERIFY_LOCK:
               TinyLockBit = Tiny_ReadLockBit();
               SendPackage(PackType-1, 1, &TinyLockBit);
		  break;

		  case TINY_READ_FUSE:
		  case TINY_VERIFY_FUSE:
               Tiny_ReadFuseBit(TinyFuse);
               SendPackage(PackType-1, 2, TinyFuse);
		  break;

		  case TINY_PROG_LOCK:
		       TinyLockBit = buffer[j + 10];
               Tiny_WriteLockBit(TinyLockBit);
               SendPackage(PackType-1, 0, NULL);
		  break;

		  case TINY_PROG_FUSE:
	           TinyFuse[0] = buffer[j + 10];
               TinyFuse[1] = buffer[j + 11];
               Tiny_WriteFuseBit(TinyFuse);
               SendPackage(PackType-1, 0, NULL);
		  break;

          ///////////////////////////////////////////////////////////////
		  case READ_CONFIG:
				if(ProgStatus != PackType)
				{ 
				  ProgStatus = PackType;
				  ProgModeCancle();
				  progcount = 0;
				  ProgModeSet();
				}

               PackLen = Mult(buffer[j + 8], buffer[j + 9]);        //packlen
               ReadAddr = Mult(buffer[j + 10], buffer[j + 11]);     //addr to be read
               ReadCounter = Mult(buffer[j + 12], buffer[j + 13]);  //bytes to be read
               buffer[0] = buffer[j + 10];
               buffer[1] = buffer[j + 11];   //address to be read

               ProgCommandSet(PICCMD_LDCONFIG);   //send command.pointer to 0x2000
               clock_vDelay(1);                   //delay
			   for(i=0; i<16; i++)
			   {
			      PGDCLR();  //dat = 0
				  PGCSET();   //clk = 1
			      nop();
				  nop();
				  nop();
				  PGCCLR();   //clk = 0        
			   }
               for(i=2; i<ReadCounter + 2;)
			   {			      
			      progdata = ProgReadCode();
                  buffer[i++] = (uchar)(progdata & 0x00ff);//LSB first////////get memory value
                  buffer[i++] = (uchar)(progdata >> 8);//MSB last////////get memory value
                  ProgIncAddr();
			   }
			   SendPackage(PackType-1, ReadCounter + 2, buffer);
		  break;

          ///////////////////////////////////////////////////////////////
	      case READ_PROGRAM:
          case VERIFY_PROGRAM:
				if(ProgStatus != PackType)
				{ 
				  ProgStatus = PackType;
				  ProgModeCancle();
				  progcount = 0;
				  ProgModeSet();
				}

               PackLen = Mult(buffer[j + 8], buffer[j + 9]);
               ReadAddr = Mult(buffer[j + 10], buffer[j + 11]);
               ReadCounter = Mult(buffer[j + 12], buffer[j + 13]);

               buffer[0] = buffer[j + 10];
               buffer[1] = buffer[j + 11];   //address to be read

               for(i=2; i<ReadCounter + 2;)
			   { 
			      ////////get 2 byte/////////////////
			      progdata = ProgReadCode();
                  buffer[i++] = (uchar)(progdata & 0x00ff);//LSB first////////get memory value
                  buffer[i++] = (uchar)(progdata >> 8);//MSB last////////get memory value
                  ProgIncAddr();
			   }
               SendPackage(PackType-1, ReadCounter + 2, buffer);
               break;

		  case READ_EEPROM:
          case VERIFY_EEPROM:
				if(ProgStatus != PackType)
				{ 
				  ProgStatus = PackType;
				  ProgModeCancle();
				  progcount = 0;
				  ProgModeSet();
				}

               PackLen = Mult(buffer[j + 8], buffer[j + 9]);
               ReadAddr = Mult(buffer[j + 10], buffer[j + 11]);
               ReadCounter = Mult(buffer[j + 12], buffer[j + 13]);

               buffer[0] = buffer[j + 10];
               buffer[1] = buffer[j + 11];   //address to be read

               for(i=2; i<ReadCounter + 2;)
			   { 
			      ////////get 2 byte/////////////////
                  buffer[i++] = ProgReadEEP();//(uchar)(progdata & 0x00ff);//LSB first////////get memory value
                  ProgIncAddr();
				  buffer[i++] = ProgReadEEP();//(uchar)(progdata >> 8);//MSB last////////get memory value
                  ProgIncAddr();
				  ///////inc address////////////
			   }
               SendPackage(PackType-1, ReadCounter + 2, buffer);
               break;

		  case WRITE_PROGRAM:
				if(ProgStatus != PackType)
				{ 
				  ProgStatus = PackType;
				  ProgModeCancle();
				  progcount = 0;
				  ProgModeSet();
				  ProgCommandSet(PICCMD_ERASEPM);
                  clock_vDelay(100);                   //delay
				  PicOffset = 0;  
				}

		       PackLen = Mult(buffer[j + 8], buffer[j + 9]);
               for(i=(j+10); i<(PackLen+j+10); i+=2)//////data to be write to the pm area
			   {  
			      if(PicOffset == 0x3ff)    //OscCal Addr = 0x3ff
				  {
				      ProgWriteCode(PicOscCal);      //program the OscCal bits
					  ProgStatus = PROGSTATUS_NONE;
				  }
				  else
				  {
				      progdata = buffer[i+1];   //msb
	                  progdata <<= 8;
	                  progdata += buffer[i];    //lsb
				      ProgWriteCode(progdata);
					  ProgCommandSet(PICCMD_INCADDR);
					  PicOffset ++;
				  }
			   }
			   //////////return status///////////////////
               SendPackage(RETURN_WRITE_PROGRAM, 0, NULL);
		       break;

		  case WRITE_EEPROM:
			  	if(ProgStatus != PackType)
				{ 
				  ProgStatus = PackType;
				  ProgModeCancle();
				  progcount = 0;
				  ProgModeSet();
                  ProgCommandSet(PICCMD_ERASEEEPROM);
                  clock_vDelay(100);                   //delay
				}

		       PackLen = Mult(buffer[j + 8], buffer[j + 9]);

               for(i=(j+10); i<(PackLen+j+10);)//////data to be write to the pm area
			   {
                  ProgWriteEEProm(buffer[i]);
				  i++;
				  ProgCommandSet(PICCMD_INCADDR);

                  ProgWriteEEProm(buffer[i]);
				  i++;
				  ProgCommandSet(PICCMD_INCADDR);
			   }
			   //////////return status///////////////////
               SendPackage(RETURN_WRITE_EEPROM, 0, NULL);
		       break;
          
          case TINY_READ_PROGRAM:
          case TINY_VERIFY_PROGRAM:
               PackLen = Mult(buffer[j + 8], buffer[j + 9]);
               ReadAddr = Mult(buffer[j + 10], buffer[j + 11]);
               ReadCounter = Mult(buffer[j + 12], buffer[j + 13]);
               buffer[0] = buffer[j + 10];
               buffer[1] = buffer[j + 11];   //address to be read
               ReadAddr >>= 1;               //  add/2
               for(i=2; i<ReadCounter + 2;)
			   { 
		          buffer[i++] = Tiny_ReadProgram(0, ReadAddr);    //////Low Byte
                  buffer[i++] = Tiny_ReadProgram(1, ReadAddr);    //////High Byte
                  ReadAddr ++;
			   }
               SendPackage(PackType-1, ReadCounter+2, buffer);
               break;

		  case TINY_READ_EEPROM:
		  case TINY_VERIFY_EEPROM:
               PackLen = Mult(buffer[j + 8], buffer[j + 9]);
               ReadAddr = Mult(buffer[j + 10], buffer[j + 11]);
               ReadCounter = Mult(buffer[j + 12], buffer[j + 13]);

               buffer[0] = buffer[j + 10];
               buffer[1] = buffer[j + 11];   //address to be read

               for(i=2; i<ReadCounter + 2;)
			   { 
                  buffer[i++] =  Tiny_ReadEepRom(ReadAddr ++);
				  buffer[i++] =  Tiny_ReadEepRom(ReadAddr ++);
			   }
               SendPackage(PackType-1, ReadCounter + 2, buffer); 
			   break;

          case TINY_PROG_EEPROM:
			   if(ProgStatus != PackType)
			   {   
                  Tiny_Offset = 0;
                  ProgStatus = PackType;
			   }
 		       PackLen = Mult(buffer[j + 8], buffer[j + 9]);
               for(i=(j+10); i<(PackLen+j+10); i+=2)//////data to be write to the pm area
			   {                    
			      uchar temp;
				  uchar try;
                  Tiny_WriteEepRom(Tiny_Offset++, buffer[i]);
				  try = 0;
                  do
				  {
					 temp = Tiny_TestBusy();
					 try ++;
				  }while( (temp & 0x01) && (try < 50) );  //wait no busy

                  Tiny_WriteEepRom(Tiny_Offset++, buffer[i+1]);
                  try = 0;
                  do
				  {
					 temp = Tiny_TestBusy();
					 try ++;
				  }while( (temp & 0x01) && (try < 50) );  //wait no busy
			   }
               SendPackage(RETURN_TINY_PROG_EEPROM, 0, NULL);
			   break;

          case TINY_WRITE_PROGRAM:
			   if(ProgStatus != PackType)
			   {   
				 uchar temp;
				 uchar try = 0;
				 Tiny_Offset = 0;
				 ProgStatus = PackType;
				 Tiny_Erase();
				 do
				 {
				   temp = Tiny_TestBusy();
				   try ++;
				 }while( (temp & 0x01) && (try < 50) );  //wait no busy
			   }

 		       PackLen = Mult(buffer[j + 8], buffer[j + 9]);
			   
               for(i=(j+10); i<(PackLen+j+10); i+=2)//////data to be write to the pm area
			   {                    
			      uchar temp;
				  uchar try = 0;
			      Tiny_WriteProgram(Tiny_Offset ++, buffer + i);   //2 byte
                  do
				  {
					 temp = Tiny_TestBusy();
					 try ++;
				  }while( (temp & 0x01) && (try < 50) );  //wait no busy
			   }
			   //////////return status///////////////////
               SendPackage(RETURN_TINY_WRITE_PROGRAM, 0, NULL);
		       break; 
              
		  default:
//	           lcd_print_string(0x40,"failed          ");
		       break;

		}

	}
}

⌨️ 快捷键说明

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