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

📄 main.c

📁 AVR USB 下载线, 全套的开发资料,想做板子的可以参考下/
💻 C
📖 第 1 页 / 共 2 页
字号:
						{
							tmp1=avr_dev.flashpollval1;
							tmp2=avr_dev.flashpollval2;

							//High und Low-Byte
							for(j=0;j<0x09;j+=0x08)
							{
								tmp=dat_buf[i+3+(j>>3)];

								spi_transfer_8(0x40|j);
								spi_transfer_16(address);
								spi_transfer_8(tmp);
								
								if(avr_dev.devicecode==AT90S1200)
								{
									wait_ms(20);									
								}
								else	
								{
									//Polling oder hartes warten?
									if((tmp!=tmp1)&&(tmp!=tmp2))
									{
										do{
											spi_transfer_8(0x20|j);
											spi_transfer_16(address);
											tmp=spi_transfer_8(0x00);
										}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 Addresse
						spi_transfer_16(j);
						dat_buf[i]=spi_transfer_8(0x00);

						spi_transfer_8(0x28);	//High-Byte in Addresse
						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 Addresse
					else spi_transfer_8(0x28);		//High-Byte in Addresse
					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!!! F黵 ISP wird Cmnd_STK_UNIVERSAL verwendet
			//////////////////////////////////////
			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!!! F黵 ISP wird Cmnd_STK_UNIVERSAL verwendet
			//////////////////////////////////////
			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!!! F黵 ISP wird Cmnd_STK_UNIVERSAL verwendet
			//////////////////////////////////////
			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);
				//32 Versuche mit dem Chip Kontakt aufzunehmen (f黵 alle 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 will ne extra Behandlung
				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_NODEVICE);
					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);
			}

			//////////////////////////////////////
			// Empfang von einem Byte-Block
			// Eingabeparameter:
			//
			// 		Ist n positiv werden n Bytes gelesen und in dat_buf geschrieben. j mu

⌨️ 快捷键说明

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