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

📄 stk500_isp.lst

📁 很好的制作AVR32 ICE的资料
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0084) }
(0085) 
(0086) void spi_reset(void)
(0087) {
(0088)   R_RES_OFF;
_spi_reset:
      D2 9AC4      SBI	0x18,4
(0089)   wait_ms(2);
      D3 E002      LDI	R16,2
      D4 E010      LDI	R17,0
      D5 940E 01E4 CALL	_wait_ms
(0090)   R_RES_ON;
      D7 EE8F      LDI	R24,0xEF
      D8 EF9F      LDI	R25,0xFF
      D9 B228      IN	R2,0x18
      DA 2228      AND	R2,R24
      DB BA28      OUT	0x18,R2
      DC 9508      RET
_spi_set_speed:
  s                    --> R16
      DD 934A      ST	R20,-Y
(0091) }
(0092) 
(0093) /**
(0094) 	Stellt die Geschwindigkeit des SPI-Busses ein (bei f=8MHz)
(0095) 	0:	/2		4MHz	--SPI2X
(0096) 	1	/4		2MHz
(0097) 	2:	/8		1MHz	--SPI2X
(0098) 	3	/16		500kHz
(0099) 	4:	/32		250kHz	--SPI2X
(0100) 	5	/64		125kHz
(0101) 	6:	/128	62,5kHz
(0102) 
(0103) 	weitere Geschwindigkeiten geplant
(0104) 	-> dann per Software-SPI
(0105) */
(0106) void spi_set_speed(unsigned char s)
(0107) {
(0108) #if F_CPU <= 8000000
(0109)   if ((s==0)||(s==2)||(s==4)) SPSR|=1;
      DE 2300      TST	R16
      DF F021      BEQ	0x00E4
      E0 3002      CPI	R16,2
      E1 F011      BEQ	0x00E4
      E2 3004      CPI	R16,4
      E3 F411      BNE	0x00E6
      E4 9A70      SBI	0x0E,0
      E5 C003      RJMP	0x00E9
(0110)   else SPSR&=0xFE;
      E6 B18E      IN	R24,0x0E
      E7 7F8E      ANDI	R24,0xFE
      E8 B98E      OUT	0x0E,R24
(0111) 
(0112)   switch (s)
      E9 2F40      MOV	R20,R16
      EA 2300      TST	R16
      EB F069      BEQ	0x00F9
      EC 3001      CPI	R16,1
      ED F059      BEQ	0x00F9
      EE 3002      CPI	R16,2
      EF F069      BEQ	0x00FD
      F0 3003      CPI	R16,3
      F1 F059      BEQ	0x00FD
      F2 3004      CPI	R16,4
      F3 F071      BEQ	0x0102
      F4 3005      CPI	R16,5
      F5 F061      BEQ	0x0102
      F6 3006      CPI	R16,6
      F7 F079      BEQ	0x0107
      F8 C012      RJMP	0x010B
(0113)     {
(0114)     case 0:
(0115)     case 1:
(0116)       SPCR&=0xFC;
      F9 B18D      IN	R24,0x0D
      FA 7F8C      ANDI	R24,0xFC
      FB B98D      OUT	0x0D,R24
(0117)       break;
      FC C011      RJMP	0x010E
(0118)     case 2:
(0119)     case 3:
(0120)       SPCR&=0xFC;
      FD B18D      IN	R24,0x0D
      FE 7F8C      ANDI	R24,0xFC
      FF B98D      OUT	0x0D,R24
(0121)       SPCR|=0x01;
     100 9A68      SBI	0x0D,0
(0122)       break;
     101 C00C      RJMP	0x010E
(0123)     case 4:
(0124)     case 5:
(0125)       SPCR&=0xFC;
     102 B18D      IN	R24,0x0D
     103 7F8C      ANDI	R24,0xFC
     104 B98D      OUT	0x0D,R24
(0126)       SPCR|=0x02;
     105 9A69      SBI	0x0D,1
(0127)       break;
     106 C007      RJMP	0x010E
(0128)     case 6:
(0129)       SPCR|=0x03;
     107 B18D      IN	R24,0x0D
     108 6083      ORI	R24,3
     109 B98D      OUT	0x0D,R24
(0130)       break;
     10A C003      RJMP	0x010E
(0131)     default:		//Wenn Wert ung黮tig ganz langsam
(0132)       SPCR|=0x03;
     10B B18D      IN	R24,0x0D
     10C 6083      ORI	R24,3
     10D B98D      OUT	0x0D,R24
(0133)       break;
     10E 9149      LD	R20,Y+
     10F 9508      RET
(0134)     }
(0135) #else
(0136) /**
(0137) 	Stellt die Geschwindigkeit des SPI-Busses ein (bei f=16MHz)
(0138) 	0:	/4		4MHz
(0139) 	1	/8		2MHz        -SPI2X
(0140) 	2:	/16		1MHz
(0141) 	3	/32		500kHz      -SPI2X
(0142) 	4:	/64		250kHz
(0143) 	5	/128	125kHz      -SPI2X
(0144) 	6:	/128	62,5kHz
(0145) 
(0146) 	weitere Geschwindigkeiten geplant
(0147) 	-> dann per Software-SPI
(0148) */
(0149)     if ((s==1)||(s==3)) 
(0150)     {
(0151)         SPSR|=1;
(0152)     }
(0153)     else 
(0154)     {
(0155)         SPSR&=0xFE;
(0156)     }
(0157)     
(0158)     switch (s)
(0159)     {
(0160)         case 0:
(0161)             SPCR&=0xFC;
(0162)             break;
(0163)         case 1:
(0164)             SPCR&=0xFC;
(0165)             SPCR|=0x01;
(0166)             break;
(0167)         case 2:
(0168)             SPCR&=0xFC;
(0169)             SPCR|=0x01;
(0170)             break;
(0171)         case 3:
(0172)             SPCR&=0xFC;
(0173)             SPCR|=0x02;
(0174)             break;
(0175)         case 4:
(0176)             SPCR&=0xFC;
(0177)             SPCR|=0x02;
(0178)             break;
(0179)         case 5:
(0180)             SPCR|=0x03;
(0181)             break;
(0182)         case 6:
(0183)             SPCR|=0x03;
(0184)             break;
(0185)         default:		//Wenn Wert ung黮tig ganz langsam
(0186)             SPCR|=0x03;
(0187)             break;
(0188)     }
(0189) 
(0190) #endif
(0191) }
(0192) 
(0193) void spi_clock_pulse(void)  //模拟SPI时钟
(0194) {
(0195)   if (!use_sw_spi)
_spi_clock_pulse:
     110 9020 0060 LDS	R2,0x0060
     112 2022      TST	R2
     113 F429      BNE	0x0119
(0196)     {
(0197)       SPCR&=BIT6_NEG;		//SPI 使能关闭
     114 EB8F      LDI	R24,0xBF
     115 EF9F      LDI	R25,0xFF
     116 B02D      IN	R2,0x0D
     117 2228      AND	R2,R24
     118 B82D      OUT	0x0D,R2
(0198)     }
(0199) 
(0200)   SCK_SET
     119 9AC7      SBI	0x18,7
(0201)   //PORTB|=BIT5_POS;	//SPI SCK impuls
(0202)   wait_ms(2);
     11A E002      LDI	R16,2
     11B E010      LDI	R17,0
     11C 940E 01E4 CALL	_wait_ms
(0203)   //PORTB&=BIT5_NEG;
(0204)   SCK_CLEAR
     11E 98C7      CBI	0x18,7
(0205)   
(0206)   if (!use_sw_spi)
     11F 9020 0060 LDS	R2,0x0060
     121 2022      TST	R2
     122 F409      BNE	0x0124
(0207)     {
(0208)       SPCR|=BIT6_POS;		//SPI 使能
     123 9A6E      SBI	0x0D,6
(0209)     }
     124 9508      RET
_spi_transfer_8:
  j                    --> Y,+0
  i0                   --> R22
  result0              --> R20
  d                    --> R16
     125 934A      ST	R20,-Y
     126 936A      ST	R22,-Y
     127 9722      SBIW	R28,2
(0210) }
(0211) 
(0212) /**
(0213) 	Does a 8 bit transfer over the SPI-Interface
(0214) 	and gives back the byte received
(0215) 
(0216) 	@param	d	the byte to be transmitted
(0217) 
(0218) 	@return		the byte received
(0219) */
(0220) unsigned char spi_transfer_8(unsigned char d)
(0221) {
(0222)   if (!use_sw_spi)
     128 9020 0060 LDS	R2,0x0060
     12A 2022      TST	R2
     12B F431      BNE	0x0132
(0223)     {
(0224)       SPDR=d;
     12C B90F      OUT	0x0F,R16
(0225)       while (!(SPSR&0x80));
     12D B18E      IN	R24,0x0E
     12E 7880      ANDI	R24,0x80
     12F F3E9      BEQ	0x012D
(0226) 
(0227)       return SPDR;
     130 B10F      IN	R16,0x0F
     131 C037      RJMP	0x0169
(0228)     }
(0229)   else
(0230)     {
(0231)       unsigned char result=0,i;
     132 2744      CLR	R20
(0232)       volatile unsigned int j;
(0233) 
(0234)       for (i = 0; i < 8; i++)
     133 2766      CLR	R22
     134 C030      RJMP	0x0165
(0235)         {
(0236)           if (d&0x80)
     135 2F80      MOV	R24,R16
     136 7880      ANDI	R24,0x80
     137 F011      BEQ	0x013A
(0237)             {
(0238)               MOSI_SET;
     138 9AC5      SBI	0x18,5
(0239)             }
     139 C001      RJMP	0x013B
(0240)           else
(0241)             {
(0242)               MOSI_CLEAR;
     13A 98C5      CBI	0x18,5
(0243)             }
(0244)           d<<=1;
     13B 0F00      LSL	R16
(0245)           result<<=1;
     13C 0F44      LSL	R20
(0246)           
(0247)           #if F_CPU < 8000000
(0248)           for (j = 0; j < 18; j++) asm ("nop");
     13D 2422      CLR	R2
     13E 2433      CLR	R3
     13F 8239      STD	Y+1,R3
     140 8228      STD	Y+0,R2
     141 C006      RJMP	0x0148
     142 0000      NOP
     143 8188      LDD	R24,Y+0
     144 8199      LDD	R25,Y+1
     145 9601      ADIW	R24,1
     146 8399      STD	Y+1,R25
     147 8388      STD	Y+0,R24
     148 8188      LDD	R24,Y+0
     149 8199      LDD	R25,Y+1
     14A 3182      CPI	R24,0x12
     14B E0E0      LDI	R30,0
     14C 079E      CPC	R25,R30
     14D F3A0      BCS	0x0142
(0249)           #else
(0250)           for (j = 0; j < 36; j++) asm ("nop");
(0251)           #endif
(0252)           SCK_SET
     14E 9AC7      SBI	0x18,7
(0253)           //PORTB|=BIT5_POS; //sck 
(0254)           if (MISO_IN)
     14F 9BB6      SBIS	0x16,6
     150 C001      RJMP	0x0152
(0255)             {
(0256)               result|=1;
     151 6041      ORI	R20,1
(0257)             }
(0258)           #if F_CPU < 8000000
(0259)           for (j = 0; j < 18; j++) asm ("nop");
     152 2422      CLR	R2
     153 2433      CLR	R3
     154 8239      STD	Y+1,R3
     155 8228      STD	Y+0,R2
     156 C006      RJMP	0x015D
     157 0000      NOP
     158 8188      LDD	R24,Y+0
     159 8199      LDD	R25,Y+1
     15A 9601      ADIW	R24,1
     15B 8399      STD	Y+1,R25
     15C 8388      STD	Y+0,R24
     15D 8188      LDD	R24,Y+0
     15E 8199      LDD	R25,Y+1
     15F 3182      CPI	R24,0x12
     160 E0E0      LDI	R30,0
     161 079E      CPC	R25,R30
     162 F3A0      BCS	0x0157
(0260)           #else
(0261)           for (j = 0; j < 36; j++) asm ("nop");
(0262)           #endif
(0263)           //PORTB&=BIT5_NEG;
(0264)           SCK_CLEAR
     163 98C7      CBI	0x18,7
     164 9563      INC	R22
     165 3068      CPI	R22,0x8
     166 F270      BCS	0x0135
(0265)         }
(0266)       MOSI_CLEAR;
     167 98C5      CBI	0x18,5
(0267) 
(0268)       return result;
     168 2F04      MOV	R16,R20
     169 9622      ADIW	R28,2
     16A 9169      LD	R22,Y+
     16B 9149      LD	R20,Y+
     16C 9508      RET
_spi_transfer_16:
  d                    --> R20
     16D 934A      ST	R20,-Y
     16E 935A      ST	R21,-Y
     16F 01A8      MOVW	R20,R16
(0269)     }
(0270) }
(0271) 
(0272) /**
(0273) 	Does a 16 bit transfer over the SPI-Interface
(0274) 	and gives back the last byte received
(0275) 
(0276) 	@param	d	the int to be transmitted
(0277) 
(0278) 	@return		the last byte received
(0279) */
(0280) unsigned char spi_transfer_16(unsigned int d)
(0281) {
(0282)   spi_transfer_8((d>>8)&0xFF);
     170 018A      MOVW	R16,R20
     171 2F01      MOV	R16,R17
     172 2711      CLR	R17
     173 7010      ANDI	R17,0
     174 DFB0      RCALL	_spi_transfer_8
(0283)   return spi_transfer_8(d&0xFF);
     175 018A      MOVW	R16,R20
     176 7010      ANDI	R17,0
     177 DFAD      RCALL	_spi_transfer_8
     178 9159      LD	R21,Y+
     179 9149      LD	R20,Y+
     17A 9508      RET
_spi_transfer_32:
  d                    --> Y,+0
     17B 940E 0B1F CALL	push_arg4
(0284) }
(0285) 
(0286) /**
(0287) 	Does a 32 bit transfer over the SPI-Interface
(0288) 	and gives back the last byte received
(0289) 
(0290) 	@param	d	the long to be transmitted
(0291) 
(0292) 	@return		the last byte received
(0293) */
(0294) unsigned char spi_transfer_32(unsigned long d)
(0295) {
(0296)   spi_transfer_8((d>>24)&0xFF);
     17D E188      LDI	R24,0x18
     17E E090      LDI	R25,0
     17F 8108      LDD	R16,Y+0
     180 8119      LDD	R17,Y+1
     181 812A      LDD	R18,Y+2
     182 813B      LDD	R19,Y+3
     183 938A      ST	R24,-Y
     184 940E 0B46 CALL	lsr32
     186 0118      MOVW	R2,R16
     187 0129      MOVW	R4,R18
     188 EF8F      LDI	R24,0xFF
     189 E090      LDI	R25,0
     18A E0A0      LDI	R26,0
     18B E0B0      LDI	R27,0
     18C 2228      AND	R2,R24
     18D 2239      AND	R3,R25
     18E 224A      AND	R4,R26
     18F 225B      AND	R5,R27
     190 2D02      MOV	R16,R2
     191 DF93      RCALL	_spi_transfer_8
(0297)   spi_transfer_8((d>>16)&0xFF);
     192 EF8F      LDI	R24,0xFF
     193 E090      LDI	R25,0
     194 E0A0      LDI	R26,0
     195 E0B0      LDI	R27,0
     196 8028      LDD	R2,Y+0
     197 8039      LDD	R3,Y+1
     198 804A      LDD	R4,Y+2
     199 805B      LDD	R5,Y+3
     19A 0112      MOVW	R2,R4
     19B 2444      CLR	R4
     19C 2455      CLR	R5
     19D 2228      AND	R2,R24
     19E 2239      AND	R3,R25
     19F 224A      AND	R4,R26
     1A0 225B      AND	R5,R27
     1A1 2D02      MOV	R16,R2

⌨️ 快捷键说明

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