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

📄 main.c

📁 我制作过的usbisp资料, 仅供参考
💻 C
📖 第 1 页 / 共 2 页
字号:
										}while((tmp==tmp1)||(tmp==tmp2));
									}
									else wait_ms(9);
								}
							}

							address++;
						}

						usb_putc(Resp_STK_INSYNC);
						usb_putc(Resp_STK_OK);
					}
				}
				else	//EEPROM
				{
					for(i=0;i<n_tmp;i++)
					{
						tmp=dat_buf[i+3];

						tmp1=avr_dev.eeprompollval1;
						tmp2=avr_dev.eeprompollval2;

						if((tmp!=tmp1)&&(tmp!=tmp2))
						{
							spi_transfer_8(0xC0);
							spi_transfer_16(address);
							spi_transfer_8(tmp);

							do{
								spi_transfer_8(0xA0);
								spi_transfer_16(address);
								tmp=spi_transfer_8(0x00);
							}while((tmp==tmp1)||(tmp==tmp2));
						}
						else
						{
							spi_transfer_8(0xC0);
							spi_transfer_16(address);
							spi_transfer_8(tmp);
							wait_ms(9);
						}

						address++;
					}

					usb_putc(Resp_STK_INSYNC);
					usb_putc(Resp_STK_OK);
				}
				
				LED_GN_TOG;
			}
			//////////////////////////////////////
			//Cmnd_STK_PROG_FLASH					!!!DUMMY!!!
			//////////////////////////////////////
			else if(state==Cmnd_STK_PROG_FLASH)
			{
				if(t==Sync_CRC_EOP) state = READY;

				usb_putc(Resp_STK_INSYNC);
				usb_putc(Resp_STK_OK);
			}
			//////////////////////////////////////
			//Cmnd_STK_PROG_DATA					!!!DUMMY!!!
			//////////////////////////////////////
			else if(state==Cmnd_STK_PROG_DATA)
			{
				if(t==Sync_CRC_EOP) state = READY;

				usb_putc(Resp_STK_INSYNC);
				usb_putc(Resp_STK_OK);
			}
			//////////////////////////////////////
			//Cmnd_STK_PROG_FUSE					!!!DUMMY!!!
			//////////////////////////////////////
			else if(state==Cmnd_STK_PROG_FUSE)
			{
				if(t==Sync_CRC_EOP) state = READY;

				usb_putc(Resp_STK_INSYNC);
				usb_putc(Resp_STK_OK);
			}
			//////////////////////////////////////
			//Cmnd_STK_PROG_LOCK					!!!DUMMY!!!
			//////////////////////////////////////
			else if(state==Cmnd_STK_PROG_LOCK)
			{
				if(t==Sync_CRC_EOP) state = READY;

				usb_putc(Resp_STK_INSYNC);
				usb_putc(Resp_STK_OK);
			}
			//////////////////////////////////////
			//Cmnd_STK_PROG_FUSE_EXT				!!!DUMMY!!!
			//////////////////////////////////////
			else if(state==Cmnd_STK_PROG_FUSE_EXT)
			{
				if(t==Sync_CRC_EOP) state = READY;

				usb_putc(Resp_STK_INSYNC);
				usb_putc(Resp_STK_OK);
			}

			//////////////////////////////////////
			//Cmnd_STK_READ_SIGN
			//////////////////////////////////////
			else if(state==Cmnd_STK_READ_SIGN)
			{
				if(t==Sync_CRC_EOP) state = READY;

				for(i=0;i<3;i++)
				{
					spi_transfer_16(0x3000);
					spi_transfer_8(i);
					dat_buf[i]=spi_transfer_8(0x00);
				}

				usb_putc(Resp_STK_INSYNC);
				for(i=0;i<3;i++) usb_putc(dat_buf[i]);
				usb_putc(Resp_STK_OK);
			}
			//////////////////////////////////////
			//Cmnd_STK_READ_PAGE
			//////////////////////////////////////
			else if(state==Cmnd_STK_READ_PAGE)
			{
				if(t==Sync_CRC_EOP) state = READY;

				n_tmp=dat_buf[0]*256+dat_buf[1];

				//Flash
				if(dat_buf[2]=='F')
				{
					for(i=0;i<n_tmp;i+=2)
					{
						j=address+i/2;

						spi_transfer_8(0x20);	//Low-Byte in address
						spi_transfer_16(j);
						dat_buf[i]=spi_transfer_8(0x00);

						spi_transfer_8(0x28);	//High-Byte in address
						spi_transfer_16(j);
						dat_buf[i+1]=spi_transfer_8(0x00);
					}
					address+=n_tmp/2;
				}
				else //EEPROM
				{
					for(i=0;i<n_tmp;i++)
					{
						spi_transfer_8(0xA0);
						spi_transfer_16(address);
						dat_buf[i]=spi_transfer_8(0x00);
						address++;
					}
				}
				
				LED_GN_TOG;

				usb_putc(Resp_STK_INSYNC);
				for(i=0;i<n_tmp;i++) usb_putc(dat_buf[i]);
				usb_putc(Resp_STK_OK);
			}

			//////////////////////////////////////
			//Cmnd_STK_READ_FLASH
			//////////////////////////////////////
			else if(state==Cmnd_STK_READ_FLASH)
			{
				if(t==Sync_CRC_EOP) state = READY;
				
				
				for(i=0;i<2;i++)
				{
											
					if(!i) spi_transfer_8(0x20);	//Low-Byte in address
					else spi_transfer_8(0x28);		//High-Byte in address
					spi_transfer_16(address);
					dat_buf[i]=spi_transfer_8(0x00);					
				}
				address++;
				
				usb_putc(Resp_STK_INSYNC);
				for(i=0;i<2;i++) usb_putc(dat_buf[i]);
				usb_putc(Resp_STK_OK);
				
			}
			//////////////////////////////////////
			//Cmnd_STK_READ_DATA
			//////////////////////////////////////
			else if(state==Cmnd_STK_READ_DATA)
			{
				if(t==Sync_CRC_EOP) state = READY;
				
				spi_transfer_8(0xA0);
				spi_transfer_16(address);
				tmp=spi_transfer_8(0x00);
				address++;
				
				usb_putc(Resp_STK_INSYNC);
				usb_putc(tmp);
				usb_putc(Resp_STK_OK);
			}
			//////////////////////////////////////
			//Cmnd_STK_READ_FUSE					!!!DUMMY!!! Cmnd_STK_UNIVERSAL is used while ISP
			//////////////////////////////////////
			else if(state==Cmnd_STK_READ_FUSE)
			{
				if(t==Sync_CRC_EOP) state = READY;
				
				usb_putc(Resp_STK_INSYNC);
				usb_putc(0x00);
				usb_putc(0x00);
				usb_putc(Resp_STK_OK);
				
			}
			//////////////////////////////////////
			//Cmnd_STK_READ_LOCK					!!!DUMMY!!! Cmnd_STK_UNIVERSAL is used while ISP
			//////////////////////////////////////
			else if(state==Cmnd_STK_READ_LOCK)
			{
				if(t==Sync_CRC_EOP) state = READY;
				
				usb_putc(Resp_STK_INSYNC);
				usb_putc(0x00);
				usb_putc(Resp_STK_OK);
				
			}
			//////////////////////////////////////
			//Cmnd_STK_READ_OSCCAL
			//////////////////////////////////////
			else if(state==Cmnd_STK_READ_OSCCAL)
			{
				if(t==Sync_CRC_EOP) state = READY;
				
				tmp=spi_transfer_32(0x38000000);
								
				usb_putc(Resp_STK_INSYNC);
				usb_putc(tmp);
				usb_putc(Resp_STK_OK);
				
			}
			//////////////////////////////////////
			//Cmnd_STK_READ_FUSE_EXT					!!!DUMMY!!! Cmnd_STK_UNIVERSAL is used while ISP
			//////////////////////////////////////
			else if(state==Cmnd_STK_READ_FUSE_EXT)
			{
				if(t==Sync_CRC_EOP) state = READY;
				
				usb_putc(Resp_STK_INSYNC);
				usb_putc(0x00);
				usb_putc(0x00);
				usb_putc(0x00);
				usb_putc(Resp_STK_OK);				
			}
			//////////////////////////////////////
			//Cmnd_STK_READ_OSCCAL_EXT
			//////////////////////////////////////
			else if(state==Cmnd_STK_READ_OSCCAL_EXT)
			{
				if(t==Sync_CRC_EOP) state = READY;
				
				spi_transfer_16(0x3800);
				spi_transfer_8(dat_buf[0]);
				tmp=spi_transfer_8(0x00);
				
				usb_putc(Resp_STK_INSYNC);
				usb_putc(tmp);
				usb_putc(Resp_STK_OK);				
			}

			//////////////////////////////////////
			//Cmnd_STK_UNIVERSAL
			//////////////////////////////////////
			else if(state==Cmnd_STK_UNIVERSAL)
			{
				if(t==Sync_CRC_EOP) state = READY;

				for(i=0;i<4;i++) tmp=spi_transfer_8(dat_buf[i]);

				usb_putc(Resp_STK_INSYNC);
				usb_putc(tmp);
				usb_putc(Resp_STK_OK);
			}
			//////////////////////////////////////
			//Cmnd_STK_UNIVERSAL_MULTI
			//////////////////////////////////////
			else if(state==Cmnd_STK_UNIVERSAL_MULTI)
			{
				if(t==Sync_CRC_EOP) state = READY;

				n_tmp=dat_buf[0];

				for(i=0;i<n_tmp;i++) spi_transfer_8(dat_buf[i+1]);

				usb_putc(Resp_STK_INSYNC);
				usb_putc(Resp_STK_OK);
			}
			/////////////////////////////////////
			//Cmnd_STK_ENTER_PROGMODE
			//////////////////////////////////////
			else if(state==Cmnd_STK_ENTER_PROGMODE)
			{
				if(t==Sync_CRC_EOP) state = READY;

				prgmode=1;

				spi_enable();
												
				wait_ms(30);
				//Try 32 times to comunicate with the chip (for all excl. AT90S1200)
				if(avr_dev.devicecode!=AT90S1200)
				{
					for(i=0;i<32;i++)
					{
						spi_transfer_16(0xAC53);
						tmp=spi_transfer_8(0x00);
						spi_transfer_8(0x00);
		
						if(tmp==0x53)
						{
							LED_GN_OFF;
							LED_RT_ON;
							usb_putc(Resp_STK_INSYNC);
							usb_putc(Resp_STK_OK);
							i=0xFF;
							break;
						}
		
						spi_clock_pulse();
					}
				}
				//90S1200 requests special care
				else
				{
					spi_transfer_32(0xAC530000);
					usb_putc(Resp_STK_INSYNC);
					usb_putc(Resp_STK_OK);
					i=0xFF;					
				}
				
				if(i!=0xFF)
				{
					usb_putc(Resp_STK_INSYNC);
					usb_putc(Resp_STK_FAILED);
					spi_disable();
				}
			}
			//////////////////////////////////////
			//Cmnd_STK_LEAVE_PROGMODE
			//////////////////////////////////////
			else if(state==Cmnd_STK_LEAVE_PROGMODE)
			{
				if(t==Sync_CRC_EOP) state = READY;

				prgmode=0;

				spi_disable();
				
				LED_RT_OFF;
				LED_GN_ON;

				usb_putc(Resp_STK_INSYNC);
				usb_putc(Resp_STK_OK);
			}

			//////////////////////////////////////
			// Reception of a byte block
			// input parameter
			//
			//		Is n positive n byte are read an put into dat_buf. j has to be 0 before reading (used as index)
			//		After reception of n bytes n_state is written into state.
			//
			//		If n is negative abs(n) bytes are read to determine the packet length
			//		The result is stored in n_tmp
			//		If the packet length is read n_tmp is copied into n, j will be added to n and j is set to 0.
			//		With this you can regard fixed parameters.
			//
			//////////////////////////////////////
			else if(state==FILL_BUFFER)
			{
				if(n>0)	//read fixed packet length
				{
					dat_buf[j++]=t;
					n--;
					if(!n) state=n_state;
				}
				else	//determine length from command
				{
					dat_buf[j++]=t;
					n_tmp<<=8;
					n_tmp|=t&0xFF;
					n++;
					if(!n) n=n_tmp+n_add;

				}
			}
		}//if(rec...
	}//while(2)

	return 0;

}

/**
	Hardware initialization
	Timer
	ADC
*/
void chip_init(void)
{

	DDRB=(1<<0)|(1<<1)|(1<<2);	//LED_RT, LED_GN
	DDRC=(1<<1)|(1<<2);			//USB_RD, USB_WR

	//ADC
	ADMUX=0x60;					//Avcc=Aref, Left Adjusted (8Bit-Aufl鰏ung aus ADCH)
	ADCSRA = 0xC6;				//ADC Enable, Init, 125kHz (bei 8MHz Clock)

	//Timer 1 (Systemint 1ms)
	TCCR1B=0x09;				//CTC-Mode /1
	OCR1A=8000;					//8MHz / 8000 = 1kHz
	TIMSK|=(1<<OCIE1A);			//enable OC-INT 
}

/**
	Returns the value of the selected adc channel
	
	@param n Number of ADC channel
	
	@return  Value of ADC channel
*/
unsigned char adc_get(char n)
{
	ADMUX&=0xF0;
	ADMUX|=n&0x7;

	while(ADCSRA&0x40);
	ADCSRA|=(1<<ADSC);
	while(ADCSRA&0x40);

	return ADCH;
}

⌨️ 快捷键说明

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