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

📄 stk500i.lst

📁 AVR单片机,STK500下载线制作全套资料,包括程序,电路图
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0498) 				
(0499) 				//increment (word) address only when we have an uneven (byte) address
(0500) 				if(i&1) address++;
    0442 FEC0      SBRS	R12,0
    0443 C018      RJMP	0x045C
    0444 E041      LDI	R20,1
    0445 E050      LDI	R21,0
    0446 E060      LDI	R22,0
    0447 E070      LDI	R23,0
    0448 9040006E  LDS	R4,address+2
    044A 9050006F  LDS	R5,address+3
    044C 9020006C  LDS	R2,address
    044E 9030006D  LDS	R3,address+1
    0450 0E24      ADD	R2,R20
    0451 1E35      ADC	R3,R21
    0452 1E46      ADC	R4,R22
    0453 1E57      ADC	R5,R23
    0454 9230006D  STS	address+1,R3
    0456 9220006C  STS	address,R2
    0458 9250006F  STS	address+3,R5
    045A 9240006E  STS	address+2,R4
    045C 01C6      MOVW	R24,R12
    045D 9601      ADIW	R24,1
    045E 016C      MOVW	R12,R24
    045F 14CA      CP	R12,R10
    0460 04DB      CPC	R13,R11
    0461 F408      BCC	0x0463
    0462 CF7B      RJMP	0x03DE
(0501) 			}
(0502) 			
(0503) 			//If this page is complete the bit 7 of mode will be set and we programm the page
(0504) 			if(mode&0x80)
    0463 FEE7      SBRS	R14,7
    0464 C077      RJMP	0x04DC
(0505) 			{
(0506) 				spi_transfer_8(msg_buffer[6]);								
    0465 9100007A  LDS	R16,0x7A
    0467 D489      RCALL	_spi_transfer_8
(0507) 				spi_transfer_16(start_address&0xFFFF);
    0468 EF4F      LDI	R20,0xFF
    0469 EF5F      LDI	R21,0xFF
    046A E060      LDI	R22,0
    046B E070      LDI	R23,0
    046C 01FE      MOVW	R30,R28
    046D 8026      LDD	R2,Z+6
    046E 8037      LDD	R3,Z+7
    046F 8440      LDD	R4,Z+8
    0470 8451      LDD	R5,Z+9
    0471 2224      AND	R2,R20
    0472 2235      AND	R3,R21
    0473 2246      AND	R4,R22
    0474 2257      AND	R5,R23
    0475 0181      MOVW	R16,R2
    0476 D47F      RCALL	_spi_transfer_16
(0508) 				spi_transfer_8(0);
    0477 2700      CLR	R16
    0478 D478      RCALL	_spi_transfer_8
(0509) 				
(0510) 				//If we have no valid polling address switch to simple wait mode
(0511) 				if(polling_address==0)
    0479 E040      LDI	R20,0
    047A E050      LDI	R21,0
    047B E060      LDI	R22,0
    047C E070      LDI	R23,0
    047D 01FE      MOVW	R30,R28
    047E 8022      LDD	R2,Z+2
    047F 8033      LDD	R3,Z+3
    0480 8044      LDD	R4,Z+4
    0481 8055      LDD	R5,Z+5
    0482 1624      CP	R2,R20
    0483 0635      CPC	R3,R21
    0484 0646      CPC	R4,R22
    0485 0657      CPC	R5,R23
    0486 F421      BNE	0x048B
(0512) 				{
(0513) 					mode = (mode&(~0x70)) | 0x10;
    0487 2D8E      MOV	R24,R14
    0488 788F      ANDI	R24,0x8F
    0489 6180      ORI	R24,0x10
    048A 2EE8      MOV	R14,R24
(0514) 				}
(0515) 				
(0516) 				//Different polling methods
(0517) 				//Hard waiting
(0518) 				if((mode&0x70) == 0x10)
    048B 2D8E      MOV	R24,R14
    048C 7780      ANDI	R24,0x70
    048D 3180      CPI	R24,0x10
    048E F429      BNE	0x0494
(0519) 				{
(0520) 					wait_ms(msg_buffer[4]);
    048F 91000078  LDS	R16,0x78
    0491 2711      CLR	R17
    0492 DBC9      RCALL	_wait_ms
(0521) 				}
    0493 C048      RJMP	0x04DC
(0522) 				//Data polling
(0523) 				else if((mode&0x70) == 0x20)
    0494 2D8E      MOV	R24,R14
    0495 7780      ANDI	R24,0x70
    0496 3280      CPI	R24,0x20
    0497 F009      BEQ	0x0499
    0498 C033      RJMP	0x04CC
(0524) 				{
(0525) 					do{
(0526) 						//If we have an uneven byte read the
(0527) 						//high byte			
(0528) 						if(polling_address%2)
    0499 E041      LDI	R20,1
    049A E050      LDI	R21,0
    049B E060      LDI	R22,0
    049C E070      LDI	R23,0
    049D 01FE      MOVW	R30,R28
    049E 8022      LDD	R2,Z+2
    049F 8033      LDD	R3,Z+3
    04A0 8044      LDD	R4,Z+4
    04A1 8055      LDD	R5,Z+5
    04A2 2224      AND	R2,R20
    04A3 2235      AND	R3,R21
    04A4 2246      AND	R4,R22
    04A5 2257      AND	R5,R23
    04A6 E040      LDI	R20,0
    04A7 E050      LDI	R21,0
    04A8 E060      LDI	R22,0
    04A9 E070      LDI	R23,0
    04AA 1624      CP	R2,R20
    04AB 0635      CPC	R3,R21
    04AC 0646      CPC	R4,R22
    04AD 0657      CPC	R5,R23
    04AE F029      BEQ	0x04B4
(0529) 						{
(0530) 							spi_transfer_8(msg_buffer[7]|(1<<3));
    04AF 9100007B  LDS	R16,0x7B
    04B1 6008      ORI	R16,0x8
    04B2 D43E      RCALL	_spi_transfer_8
(0531) 						}
    04B3 C003      RJMP	0x04B7
(0532) 						else
(0533) 						{
(0534) 							spi_transfer_8(msg_buffer[7]);
    04B4 9100007B  LDS	R16,0x7B
    04B6 D43A      RCALL	_spi_transfer_8
(0535) 						}
(0536) 						spi_transfer_16(polling_address/2);
    04B7 01FE      MOVW	R30,R28
    04B8 8022      LDD	R2,Z+2
    04B9 8033      LDD	R3,Z+3
    04BA 8044      LDD	R4,Z+4
    04BB 8055      LDD	R5,Z+5
    04BC 9456      LSR	R5
    04BD 9447      ROR	R4
    04BE 9437      ROR	R3
    04BF 9427      ROR	R2
    04C0 0181      MOVW	R16,R2
    04C1 D434      RCALL	_spi_transfer_16
(0537) 						tmp=spi_transfer_8(0x00);
    04C2 2700      CLR	R16
    04C3 D42D      RCALL	_spi_transfer_8
    04C4 870D      STD	Y+13,R16
(0538) 					}while(tmp==msg_buffer[8]);
    04C5 9020007C  LDS	R2,0x7C
    04C7 840D      LDD	R0,Y+13
    04C8 1402      CP	R0,R2
    04C9 F409      BNE	0x04CB
    04CA CFCE      RJMP	0x0499
(0539) 				}
    04CB C010      RJMP	0x04DC
(0540) 				//RDY/BSY polling
(0541) 				else if((mode&0x70) == 0x40)
    04CC 2D8E      MOV	R24,R14
    04CD 7780      ANDI	R24,0x70
    04CE 3480      CPI	R24,0x40
    04CF F441      BNE	0x04D8
(0542) 				{
(0543) 					while(spi_transfer_32(0xF0000000)&1);
    04D0 E000      LDI	R16,0
    04D1 E010      LDI	R17,0
    04D2 E020      LDI	R18,0
    04D3 EF30      LDI	R19,0xF0
    04D4 D42D      RCALL	_spi_transfer_32
    04D5 FD00      SBRC	R16,0
    04D6 CFF9      RJMP	0x04D0
(0544) 				}
    04D7 C004      RJMP	0x04DC
(0545) 				//If something was not correct with the given mode do
(0546) 				//hard waiting. Should never reach this point
(0547) 				else
(0548) 				{
(0549) 					wait_ms(msg_buffer[4]);					
    04D8 91000078  LDS	R16,0x78
    04DA 2711      CLR	R17
    04DB DB80      RCALL	_wait_ms
(0550) 				}
(0551) 			}
(0552) 		}
(0553) 		
(0554) 		num_bytes = 2;
    04DC E082      LDI	R24,2
    04DD E090      LDI	R25,0
    04DE 879B      STD	Y+11,R25
    04DF 878A      STD	Y+10,R24
(0555) 		msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
    04E0 E183      LDI	R24,0x13
    04E1 93800074  STS	msg_buffer,R24
(0556) 		msg_buffer[1] = STATUS_CMD_OK;
    04E3 2422      CLR	R2
    04E4 92200075  STS	msg_buffer+1,R2
(0557) 	}
    04E6 C373      RJMP	0x085A
(0558) 	//////////////////////////////////////
(0559) 	//CMD_READ_FLASH_ISP
(0560) 	//////////////////////////////////////
(0561) 	else if(cmd==CMD_READ_FLASH_ISP)
    04E7 858C      LDD	R24,Y+12
    04E8 3184      CPI	R24,0x14
    04E9 F009      BEQ	0x04EB
    04EA C066      RJMP	0x0551
(0562) 	{
(0563) 		block_size = ((unsigned int)msg_buffer[1])<<8;
    04EB 90A00075  LDS	R10,msg_buffer+1
    04ED 24BB      CLR	R11
    04EE 2CBA      MOV	R11,R10
    04EF 24AA      CLR	R10
(0564) 		block_size |= msg_buffer[2];
    04F0 90200076  LDS	R2,msg_buffer+2
    04F2 2433      CLR	R3
    04F3 28A2      OR	R10,R2
    04F4 28B3      OR	R11,R3
(0565) 		tmp = msg_buffer[3];
    04F5 90200077  LDS	R2,msg_buffer+3
    04F7 862D      STD	Y+13,R2
(0566) 		
(0567) 		for(i=0;i<block_size;i++)
    04F8 24CC      CLR	R12
    04F9 24DD      CLR	R13
    04FA C040      RJMP	0x053B
(0568) 		{
(0569) 			//Select Low or High-Byte
(0570) 			if(i&1)
    04FB FEC0      SBRS	R12,0
    04FC C004      RJMP	0x0501
(0571) 			{
(0572) 				spi_transfer_8(tmp|(1<<3));
    04FD 850D      LDD	R16,Y+13
    04FE 6008      ORI	R16,0x8
    04FF D3F1      RCALL	_spi_transfer_8
(0573) 			}
    0500 C002      RJMP	0x0503
(0574) 			else
(0575) 			{
(0576) 				spi_transfer_8(tmp);
    0501 850D      LDD	R16,Y+13
    0502 D3EE      RCALL	_spi_transfer_8
(0577) 			}
(0578) 			
(0579) 			spi_transfer_16(address&0xFFFF);
    0503 EF4F      LDI	R20,0xFF
    0504 EF5F      LDI	R21,0xFF
    0505 E060      LDI	R22,0
    0506 E070      LDI	R23,0
    0507 9040006E  LDS	R4,address+2
    0509 9050006F  LDS	R5,address+3
    050B 9020006C  LDS	R2,address
    050D 9030006D  LDS	R3,address+1
    050F 2224      AND	R2,R20
    0510 2235      AND	R3,R21
    0511 2246      AND	R4,R22
    0512 2257      AND	R5,R23
    0513 0181      MOVW	R16,R2
    0514 D3E1      RCALL	_spi_transfer_16
(0580) 			msg_buffer[i+2] = spi_transfer_8(0);
    0515 2700      CLR	R16
    0516 D3DA      RCALL	_spi_transfer_8
    0517 E784      LDI	R24,0x74
    0518 E090      LDI	R25,0
    0519 01F6      MOVW	R30,R12
    051A 9632      ADIW	R30,2
    051B 0FE8      ADD	R30,R24
    051C 1FF9      ADC	R31,R25
    051D 8300      STD	Z+0,R16
(0581) 			
(0582) 			//increment (word) address only when we have an uneven (byte) address
(0583) 			if(i&1) address++;
    051E FEC0      SBRS	R12,0
    051F C018      RJMP	0x0538
    0520 E041      LDI	R20,1
    0521 E050      LDI	R21,0
    0522 E060      LDI	R22,0
    0523 E070      LDI	R23,0
    0524 9040006E  LDS	R4,address+2
    0526 9050006F  LDS	R5,address+3
    0528 9020006C  LDS	R2,address
    052A 9030006D  LDS	R3,address+1
    052C 0E24      ADD	R2,R20
    052D 1E35      ADC	R3,R21
    052E 1E46      ADC	R4,R22
    052F 1E57      ADC	R5,R23
    0530 9230006D  STS	address+1,R3
    0532 9220006C  STS	address,R2
    0534 9250006F  STS	address+3,R5
    0536 9240006E  STS	address+2,R4
    0538 01C6      MOVW	R24,R12
    0539 9601      ADIW	R24,1
    053A 016C      MOVW	R12,R24
    053B 14CA      CP	R12,R10
    053C 04DB      CPC	R13,R11
    053D F408      BCC	0x053F
    053E CFBC      RJMP	0x04FB
(0584) 		}
(0585) 		
(0586) 		num_bytes = block_size+3;
    053F 01C5      MOVW	R24,R10
    0540 9603      ADIW	R24,3
    0541 879B      STD	Y+11,R25
    0542 878A      STD	Y+10,R24
(0587) 		msg_buffer[0] = CMD_READ_FLASH_ISP;
    0543 E184      LDI	R24,0x14
    0544 93800074  STS	msg_buffer,R24
(0588) 		msg_buffer[1] = STATUS_CMD_OK;
    0546 2422      CLR	R2
    0547 92200075  STS	msg_buffer+1,R2
(0589) 		msg_buffer[block_size+2] = STATUS_CMD_OK;
    0549 E784      LDI	R24,0x74
    054A E090      LDI	R25,0
    054B 01F5      MOVW	R30,R10
    054C 9632      ADIW	R30,2
    054D 0FE8      ADD	R30,R24
    054E 1FF9      ADC	R31,R25
    054F 8220      STD	Z+0,R2
(0590) 	}
    0550 C309      RJMP	0x085A
(0591) 	//////////////////////////////////////
(0592) 	//CMD_PROGRAM_EEPROM_ISP
(0593) 	//////////////////////////////////////
(0594) 	else if(cmd==CMD_PROGRAM_EEPROM_ISP)
    0551 858C      LDD	R24,Y+12
    0552 3185      CPI	R24,0x15
    0553 F009      BEQ	0x0555
    0554 C174      RJMP	0x06C9
(0595) 	{
(0596) 		block_size = ((unsigned int)msg_buffer[1])<<8;
    0555 90A00075  LDS	R10,msg_buffer+1
    0557 24BB      CLR	R11
    0558 2CBA      MOV	R11,R10
    0559 24AA      CLR	R10
(0597) 		block_size |= msg_buffer[2];
    055A 90200076  LDS	R2,msg_buffer+2
    055C 2433      CLR	R3
    055D 28A2      OR	R10,R2
    055E 28B3      OR	R11,R3
(0598) 		mode = msg_buffer[3];
    055F 90E00077  LDS	R14,msg_buffer+3
(0599) 		
(0600) 		//Byte Mode
(0601) 		if((mode&1) == 0)
    0561 FCE0      SBRC	R14,0
    0562 C09B      RJMP	0x05FE
(0602) 		{		
(0603) 			for(i=0;i<block_size;i++)
    0563 24CC      CLR	R12
    0564 24DD      CLR	R13
    0565 C093      RJMP	0x05F9
(0604) 			{	
(0605) 				spi_transfer_8(msg_buffer[5]);								
    0566 91000079  LDS	R16,0x79
    0568 D388      RCALL	_spi_transfer_8
(0606) 				spi_transfer_16(address&0xFFFF);
    0569 EF4F      LDI	R20,0xFF
    056A EF5F      LDI	R21,0xFF
    056B E060      LDI	R22,0
    056C E070      LDI	R23,0
    056D 9040006E  LDS	R4,address+2
    056F 9050006F  LDS	R5,address+3
    0571 9020006C  LDS	R2,address
    0573 9030006D  LDS	R3,address+1
    0575 2224      AND	R2,R20
    0576 2235      AND	R3,R21
    0577 2246      AND	R4,R22
    0578 2257      AND	R5,R23
    0579 0181      MOVW	R16,R2
    057A D37B      RCALL	_spi_transfer_16
(0607) 				spi_transfer_8(msg_buffer[i+10]);
    057B E784      LDI	R24,0x74
    057C E090      LDI	R25,0
    057D 01F6      MOVW	R30,R12
    057E 963A      ADIW	R30,0xA
    057F 0FE8      ADD	R30,R24
    0580 1FF9      ADC	R31,R25
    0581 8100      LDD	R16,Z+0
    0582 D36E      RCALL	_spi_transfer_8
(0608) 				
(0609) 				//Check if we can do polling
(0610) 				if((msg_buffer[i+10]!=msg_buffer[8])&&(msg_buffer[i+10]!=msg_buffer[9]))
    0583 E784      LDI	R24,0x74
    0584 E090      LDI	R25,0
    0585 01F6      MOVW	R30,R12
    0586 963A      ADIW	R30,0xA
    0587 0FE8      ADD	R30,R24
    0588 1FF9      ADC	R31,R25
    0589 8020      LDD	R2,Z+0
    058A 2433      CLR	R3
    058B 9040007C  LDS	R4,0x7C
    058D 1424      CP	R2,R4
    058E F0D1      BEQ	0x05A9
    058F 9040007D  LDS	R4,0x7D
    0591 1424      CP	R2,R4
    0592 F0B1      BEQ	0x05A9
(0611) 				{
(0612) 					polling_address = address&0xFFFF;
    0593 EF4F      LDI	R20,0xFF
    0594 EF5F      LDI	R21,0xFF
    0595 E060      LDI	R22,0
    0596 E070      LDI	R23,0
    0597 9040006E  LDS	R4,address+2
    0599 9050006F  LDS	R5,address+3
    059B 9020006C  LDS	R2,address
    059D 9030006D  LDS	R3,address+1
    059F 2224      AND	R2,R20
    05A0 2235      AND	R3,R21
    05A1 2246      AND	R4,R22
    05A2 2257      AND	R5,R23
    05A3 01FE      MOVW	R30,

⌨️ 快捷键说明

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