📄 stk500_isp.lst
字号:
(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 + -