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

📄 stk500i.lst

📁 文档里面的代码是可以正常使用的
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0343) 		msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
    0340 E180      LDI	R24,0x10
    0341 93800114  STS	msg_buffer,R24
(0344) 			
(0345) 		if(i==0xFF)
    0343 01C6      MOVW	R24,R12
    0344 3F8F      CPI	R24,0xFF
    0345 E0E0      LDI	R30,0
    0346 079E      CPC	R25,R30
    0347 F421      BNE	0x034C
(0346) 		{			
(0347) 			msg_buffer[1] = STATUS_CMD_OK;			
    0348 2422      CLR	R2
    0349 92200115  STS	msg_buffer+1,R2
(0348) 		}
    034B C579      RJMP	0x08C5
(0349) 		else
(0350) 		{			
(0351) 			msg_buffer[1] = STATUS_CMD_FAILED;
    034C EC80      LDI	R24,0xC0
    034D 93800115  STS	msg_buffer+1,R24
(0352) 		}		
(0353) 	}
    034F C575      RJMP	0x08C5
(0354) 	//////////////////////////////////////
(0355) 	//CMD_LEAVE_PROGMODE_ISP
(0356) 	//////////////////////////////////////
(0357) 	else if(cmd==CMD_LEAVE_PROGMODE_ISP)
    0350 858C      LDD	R24,Y+12
    0351 3181      CPI	R24,0x11
    0352 F4A9      BNE	0x0368
(0358) 	{
(0359) 		prgmode=0;
    0353 2422      CLR	R2
    0354 92200110  STS	prgmode,R2
(0360) 
(0361) 		spi_disable();
    0356 D5D5      RCALL	_spi_disable
(0362) 				
(0363) 		LED_RT_OFF;
    0357 EF8D      LDI	R24,0xFD
    0358 EF9F      LDI	R25,0xFF
    0359 B025      IN	R2,0x05
    035A 2228      AND	R2,R24
    035B B825      OUT	0x05,R2
(0364) 		LED_GN_ON;
    035C 9A28      SBI	0x05,0
(0365) 
(0366) 		num_bytes = 2;
    035D E082      LDI	R24,2
    035E E090      LDI	R25,0
    035F 879B      STD	Y+11,R25
    0360 878A      STD	Y+10,R24
(0367) 		msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
    0361 E181      LDI	R24,0x11
    0362 93800114  STS	msg_buffer,R24
(0368) 		msg_buffer[1] = STATUS_CMD_OK;		
    0364 2422      CLR	R2
    0365 92200115  STS	msg_buffer+1,R2
(0369) 	}
    0367 C55D      RJMP	0x08C5
(0370) 	//////////////////////////////////////
(0371) 	//CMD_CHIP_ERASE_ISP
(0372) 	//////////////////////////////////////
(0373) 	else if(cmd==CMD_CHIP_ERASE_ISP)
    0368 858C      LDD	R24,Y+12
    0369 3182      CPI	R24,0x12
    036A F539      BNE	0x0392
(0374) 	{
(0375) 		spi_transfer_8(msg_buffer[3]);
    036B 91000117  LDS	R16,msg_buffer+3
    036D D62D      RCALL	_spi_transfer_8
(0376) 		spi_transfer_8(msg_buffer[4]);
    036E 91000118  LDS	R16,0x118
    0370 D62A      RCALL	_spi_transfer_8
(0377) 		spi_transfer_8(msg_buffer[5]);
    0371 91000119  LDS	R16,0x119
    0373 D627      RCALL	_spi_transfer_8
(0378) 		spi_transfer_8(msg_buffer[6]);
    0374 9100011A  LDS	R16,0x11A
    0376 D624      RCALL	_spi_transfer_8
(0379) 		
(0380) 		//Newer AVR's seems to have a busy bit
(0381) 		//cant test this because I don't have any of these new chips
(0382) 		if(msg_buffer[2]==0)
    0377 90200116  LDS	R2,msg_buffer+2
    0379 2022      TST	R2
    037A F429      BNE	0x0380
(0383) 		{
(0384) 			wait_ms(msg_buffer[1]);
    037B 91000115  LDS	R16,msg_buffer+1
    037D 2711      CLR	R17
    037E DCD5      RCALL	_wait_ms
(0385) 		}
    037F C007      RJMP	0x0387
(0386) 		else //if(msg_buffer[2]==1)
(0387) 		{
(0388) 			while(spi_transfer_32(0xF0000000)&1);
    0380 E000      LDI	R16,0
    0381 E010      LDI	R17,0
    0382 E020      LDI	R18,0
    0383 EF30      LDI	R19,0xF0
    0384 D628      RCALL	_spi_transfer_32
    0385 FD00      SBRC	R16,0
    0386 CFF9      RJMP	0x0380
(0389) 		}		
(0390) 				
(0391) 		num_bytes = 2;
    0387 E082      LDI	R24,2
    0388 E090      LDI	R25,0
    0389 879B      STD	Y+11,R25
    038A 878A      STD	Y+10,R24
(0392) 		msg_buffer[0] = CMD_CHIP_ERASE_ISP;
    038B E182      LDI	R24,0x12
    038C 93800114  STS	msg_buffer,R24
(0393) 		msg_buffer[1] = STATUS_CMD_OK;		
    038E 2422      CLR	R2
    038F 92200115  STS	msg_buffer+1,R2
(0394) 	}
    0391 C533      RJMP	0x08C5
(0395) 	//////////////////////////////////////
(0396) 	//CMD_PROGRAM_FLASH_ISP
(0397) 	//////////////////////////////////////
(0398) 	else if(cmd==CMD_PROGRAM_FLASH_ISP)
    0392 858C      LDD	R24,Y+12
    0393 3183      CPI	R24,0x13
    0394 F009      BEQ	0x0396
    0395 C1BC      RJMP	0x0552
(0399) 	{
(0400) 		block_size = ((unsigned int)msg_buffer[1])<<8;
    0396 90A00115  LDS	R10,msg_buffer+1
    0398 24BB      CLR	R11
    0399 2CBA      MOV	R11,R10
    039A 24AA      CLR	R10
(0401) 		block_size |= msg_buffer[2];
    039B 90200116  LDS	R2,msg_buffer+2
    039D 2433      CLR	R3
    039E 28A2      OR	R10,R2
    039F 28B3      OR	R11,R3
(0402) 		mode = msg_buffer[3];
    03A0 90E00117  LDS	R14,msg_buffer+3
(0403) 		
(0404) 		//Word Mode
(0405) 		if((mode&1) == 0)
    03A2 FCE0      SBRC	R14,0
    03A3 C0A2      RJMP	0x0446
(0406) 		{		
(0407) 			for(i=0;i<block_size;i++)
    03A4 24CC      CLR	R12
    03A5 24DD      CLR	R13
    03A6 C09A      RJMP	0x0441
(0408) 			{	
(0409) 				//If we have an uneven byte programm the
(0410) 				//high byte			
(0411) 				if(i&1)
    03A7 FEC0      SBRS	R12,0
    03A8 C005      RJMP	0x03AE
(0412) 				{
(0413) 					spi_transfer_8(msg_buffer[5]|(1<<3));
    03A9 91000119  LDS	R16,0x119
    03AB 6008      ORI	R16,0x8
    03AC D5EE      RCALL	_spi_transfer_8
(0414) 				}
    03AD C003      RJMP	0x03B1
(0415) 				else
(0416) 				{
(0417) 					spi_transfer_8(msg_buffer[5]);
    03AE 91000119  LDS	R16,0x119
    03B0 D5EA      RCALL	_spi_transfer_8
(0418) 				}
(0419) 				
(0420) 				spi_transfer_16(address&0xFFFF);
    03B1 EF4F      LDI	R20,0xFF
    03B2 EF5F      LDI	R21,0xFF
    03B3 E060      LDI	R22,0
    03B4 E070      LDI	R23,0
    03B5 9040010E  LDS	R4,address+2
    03B7 9050010F  LDS	R5,address+3
    03B9 9020010C  LDS	R2,address
    03BB 9030010D  LDS	R3,address+1
    03BD 2224      AND	R2,R20
    03BE 2235      AND	R3,R21
    03BF 2246      AND	R4,R22
    03C0 2257      AND	R5,R23
    03C1 0181      MOVW	R16,R2
    03C2 D5DE      RCALL	_spi_transfer_16
(0421) 				spi_transfer_8(msg_buffer[i+10]);
    03C3 E184      LDI	R24,0x14
    03C4 E091      LDI	R25,1
    03C5 01F6      MOVW	R30,R12
    03C6 963A      ADIW	R30,0xA
    03C7 0FE8      ADD	R30,R24
    03C8 1FF9      ADC	R31,R25
    03C9 8100      LDD	R16,Z+0
    03CA D5D0      RCALL	_spi_transfer_8
(0422) 				
(0423) 				//Check if we can do polling
(0424) 				if(msg_buffer[8]!=msg_buffer[i+10])
    03CB E184      LDI	R24,0x14
    03CC E091      LDI	R25,1
    03CD 01F6      MOVW	R30,R12
    03CE 963A      ADIW	R30,0xA
    03CF 0FE8      ADD	R30,R24
    03D0 1FF9      ADC	R31,R25
    03D1 8020      LDD	R2,Z+0
    03D2 9030011C  LDS	R3,0x11C
    03D4 1432      CP	R3,R2
    03D5 F0B1      BEQ	0x03EC
(0425) 				{
(0426) 					polling_address = address&0xFFFF;
    03D6 EF4F      LDI	R20,0xFF
    03D7 EF5F      LDI	R21,0xFF
    03D8 E060      LDI	R22,0
    03D9 E070      LDI	R23,0
    03DA 9040010E  LDS	R4,address+2
    03DC 9050010F  LDS	R5,address+3
    03DE 9020010C  LDS	R2,address
    03E0 9030010D  LDS	R3,address+1
    03E2 2224      AND	R2,R20
    03E3 2235      AND	R3,R21
    03E4 2246      AND	R4,R22
    03E5 2257      AND	R5,R23
    03E6 01FE      MOVW	R30,R28
    03E7 8222      STD	Z+2,R2
    03E8 8233      STD	Z+3,R3
    03E9 8244      STD	Z+4,R4
    03EA 8255      STD	Z+5,R5
(0427) 				}
    03EB C004      RJMP	0x03F0
(0428) 				//If not switch the mode hard waiting
(0429) 				else
(0430) 				{
(0431) 					mode = (mode&(~0x0E)) | 0x02;
    03EC 2D8E      MOV	R24,R14
    03ED 7F81      ANDI	R24,0xF1
    03EE 6082      ORI	R24,2
    03EF 2EE8      MOV	R14,R24
(0432) 				}
(0433) 				
(0434) 				//Different polling methods
(0435) 				//Hard waiting
(0436) 				if((mode&0x0E) == 0x02)
    03F0 2D8E      MOV	R24,R14
    03F1 708E      ANDI	R24,0xE
    03F2 3082      CPI	R24,2
    03F3 F429      BNE	0x03F9
(0437) 				{
(0438) 					wait_ms(msg_buffer[4]);
    03F4 91000118  LDS	R16,0x118
    03F6 2711      CLR	R17
    03F7 DC5C      RCALL	_wait_ms
(0439) 				}
    03F8 C02B      RJMP	0x0424
(0440) 				//Data polling
(0441) 				else if((mode&0x0E) == 0x04)
    03F9 2D8E      MOV	R24,R14
    03FA 708E      ANDI	R24,0xE
    03FB 3084      CPI	R24,4
    03FC F4B9      BNE	0x0414
(0442) 				{
(0443) 					do{
(0444) 						//If we have an uneven byte read the
(0445) 						//high byte			
(0446) 						if(i&1)
    03FD FEC0      SBRS	R12,0
    03FE C005      RJMP	0x0404
(0447) 						{
(0448) 							spi_transfer_8(msg_buffer[7]|(1<<3));
    03FF 9100011B  LDS	R16,0x11B
    0401 6008      ORI	R16,0x8
    0402 D598      RCALL	_spi_transfer_8
(0449) 						}
    0403 C003      RJMP	0x0407
(0450) 						else
(0451) 						{
(0452) 							spi_transfer_8(msg_buffer[7]);
    0404 9100011B  LDS	R16,0x11B
    0406 D594      RCALL	_spi_transfer_8
(0453) 						}
(0454) 						spi_transfer_16(polling_address);
    0407 01FE      MOVW	R30,R28
    0408 8102      LDD	R16,Z+2
    0409 8113      LDD	R17,Z+3
    040A D596      RCALL	_spi_transfer_16
(0455) 						tmp=spi_transfer_8(0x00);
    040B 2700      CLR	R16
    040C D58E      RCALL	_spi_transfer_8
    040D 870D      STD	Y+13,R16
(0456) 					}while(tmp==msg_buffer[8]);
    040E 9020011C  LDS	R2,0x11C
    0410 840D      LDD	R0,Y+13
    0411 1402      CP	R0,R2
    0412 F351      BEQ	0x03FD
(0457) 				}
    0413 C010      RJMP	0x0424
(0458) 				//RDY/BSY polling
(0459) 				else if((mode&0x0E) == 0x08)
    0414 2D8E      MOV	R24,R14
    0415 708E      ANDI	R24,0xE
    0416 3088      CPI	R24,0x8
    0417 F441      BNE	0x0420
(0460) 				{
(0461) 					while(spi_transfer_32(0xF0000000)&1);
    0418 E000      LDI	R16,0
    0419 E010      LDI	R17,0
    041A E020      LDI	R18,0
    041B EF30      LDI	R19,0xF0
    041C D590      RCALL	_spi_transfer_32
    041D FD00      SBRC	R16,0
    041E CFF9      RJMP	0x0418
(0462) 				}
    041F C004      RJMP	0x0424
(0463) 				//If something was not correct with the given mode do
(0464) 				//hard waiting. Should never reach this point
(0465) 				else
(0466) 				{
(0467) 					wait_ms(msg_buffer[4]);					
    0420 91000118  LDS	R16,0x118
    0422 2711      CLR	R17
    0423 DC30      RCALL	_wait_ms
(0468) 				}
(0469) 				
(0470) 				//increment (word) address only when we have an uneven (byte) address
(0471) 				if(i&1) address++;
    0424 FEC0      SBRS	R12,0
    0425 C018      RJMP	0x043E
    0426 E041      LDI	R20,1
    0427 E050      LDI	R21,0
    0428 E060      LDI	R22,0
    0429 E070      LDI	R23,0
    042A 9040010E  LDS	R4,address+2
    042C 9050010F  LDS	R5,address+3
    042E 9020010C  LDS	R2,address
    0430 9030010D  LDS	R3,address+1
    0432 0E24      ADD	R2,R20
    0433 1E35      ADC	R3,R21
    0434 1E46      ADC	R4,R22
    0435 1E57      ADC	R5,R23
    0436 9230010D  STS	address+1,R3
    0438 9220010C  STS	address,R2
    043A 9250010F  STS	address+3,R5
    043C 9240010E  STS	address+2,R4
    043E 01C6      MOVW	R24,R12
    043F 9601      ADIW	R24,1
    0440 016C      MOVW	R12,R24
    0441 14CA      CP	R12,R10
    0442 04DB      CPC	R13,R11
    0443 F408      BCC	0x0445
    0444 CF62      RJMP	0x03A7
(0472) 			}			
(0473) 		}
    0445 C101      RJMP	0x0547
(0474) 		//Page Mode
(0475) 		else
(0476) 		{
(0477) 			for(i=0;i<block_size;i++)
    0446 24CC      CLR	R12
    0447 24DD      CLR	R13
    0448 C081      RJMP	0x04CA
(0478) 			{
(0479) 				//If we have an uneven byte programm the
(0480) 				//high byte			
(0481) 				if(i&1)
    0449 FEC0      SBRS	R12,0
    044A C005      RJMP	0x0450
(0482) 				{
(0483) 					spi_transfer_8(msg_buffer[5]|(1<<3));
    044B 91000119  LDS	R16,0x119
    044D 6008      ORI	R16,0x8
    044E D54C      RCALL	_spi_transfer_8
(0484) 				}
    044F C003      RJMP	0x0453
(0485) 				else
(0486) 				{
(0487) 					spi_transfer_8(msg_buffer[5]);
    0450 91000119  LDS	R16,0x119
    0452 D548      RCALL	_spi_transfer_8
(0488) 				}
(0489) 				
(0490) 				spi_transfer_16(address&0xFFFF);
    0453 EF4F      LDI	R20,0xFF
    0454 EF5F      LDI	R21,0xFF
    0455 E060      LDI	R22,0
    0456 E070      LDI	R23,0
    0457 9040010E  LDS	R4,address+2
    0459 9050010F  LDS	R5,address+3
    045B 9020010C  LDS	R2,address
    045D 9030010D  LDS	R3,address+1
    045F 2224      AND	R2,R20
    0460 2235      AND	R3,R21
    0461 2246      AND	R4,R22
    0462 2257      AND	R5,R23
    0463 0181      MOVW	R16,R2
    0464 D53C      RCALL	_spi_transfer_16
(0491) 				spi_transfer_8(msg_buffer[i+10]);
    0465 E184      LDI	R24,0x14
    0466 E091      LDI	R25,1
    0467 01F6      MOVW	R30,R12
    0468 963A      ADIW	R30,0xA
    0469 0FE8      ADD	R30,R24
    046A 1FF9      ADC	R31,R25
    046B 8100      LDD	R16,Z+0
    046C D52E      RCALL	_spi_transfer_8
(0492) 				
(0493) 				//Check if we can do polling
(0494) 				if(msg_buffer[8]!=msg_buffer[i+10])
    046D E184      LDI	R24,0x14
    046E E091      LDI	R25,1
    046F 01F6      MOVW	R30,R12
    0470 963A      ADIW	R30,0xA
    0471 0FE8      ADD	R30,R24
    0472 1FF9      ADC	R31,R25
    0473 8020      LDD	R2,Z+0
    0474 9030011C  LDS	R3,0x11C
    0476 1432      CP	R3,R2
    0477 F409      BNE	0x0479
    0478 C034      RJMP	0x04AD
(0495) 				{
(0496) 					//We have to check if we have an uneven byte. 
(0497) 					//Set the polling address to a byte address
(0498) 					//so that we can poll the right location

⌨️ 快捷键说明

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