📄 main.lst
字号:
1 .file "main.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
12 .text
13 .Ltext0:
66 .data
67 .LC0:
68 0000 40 .byte 64
69 0001 00 .byte 0
70 0002 00 .byte 0
71 0003 00 .byte 0
72 0004 00 .byte 0
73 0005 95 .byte -107
74 .text
76 .global Init_MMC
78 Init_MMC:
80 .Ltext1:
1:mmc.c **** /*
2:mmc.c **** Copyright: Radig Ulrich mailto: mail@ulrichradig.de
3:mmc.c **** Author: Radig Ulrich
4:mmc.c **** Remarks:
5:mmc.c **** known Problems: none
6:mmc.c **** Version: 28.05.2004
7:mmc.c **** Description: Ansteuerung einer MMC/SD-Memory-Card
8:mmc.c **** */
9:mmc.c ****
10:mmc.c **** #define MMC_Write PORTB //Port an der die MMC/SD-Karte angeschlossen ist also des SPI
11:mmc.c **** #define MMC_Read PINB
12:mmc.c **** #define MMC_Direction_REG DDRB
13:mmc.c ****
14:mmc.c **** #define SPI_DI 4 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist
15:mmc.c **** #define SPI_DO 3 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist
16:mmc.c **** #define SPI_Clock 5 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk)
17:mmc.c **** #define MMC_Chip_Select 1 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist
18:mmc.c **** #define SPI_SS 2
19:mmc.c ****
20:mmc.c **** //Prototypes
21:mmc.c **** char Read_Byte_MMC(void);
22:mmc.c **** void Write_Byte_MMC(char);
23:mmc.c **** char Init_MMC(void);
24:mmc.c **** char Read_Block_MMC (unsigned long, char *Buffer);
25:mmc.c **** char Write_Block_MMC (unsigned long, char *Buffer);
26:mmc.c **** char Write_Command_MMC (char *CMD);
27:mmc.c ****
28:mmc.c **** //Routine zur Initialisierung der MMC/SD-Karte (SPI-MODE)
29:mmc.c **** char Init_MMC ()
30:mmc.c **** {
82 .LM1:
83 /* prologue: frame size=6 */
84 0000 FF92 push r15
85 0002 0F93 push r16
86 0004 1F93 push r17
87 0006 CF93 push r28
88 0008 DF93 push r29
89 000a CDB7 in r28,__SP_L__
90 000c DEB7 in r29,__SP_H__
91 000e 2697 sbiw r28,6
92 0010 0FB6 in __tmp_reg__,__SREG__
93 0012 F894 cli
94 0014 DEBF out __SP_H__,r29
95 0016 0FBE out __SREG__,__tmp_reg__
96 0018 CDBF out __SP_L__,r28
97 /* prologue end (size=13) */
31:mmc.c **** char tmp = 0;
99 .LM2:
100 .LBB2:
101 001a FF24 clr r15
32:mmc.c **** char Timeout;
33:mmc.c **** //Konfiguration des Ports an der die MMC/SD-Karte angeschlossen wurde
34:mmc.c ****
35:mmc.c **** cbi(MMC_Direction_REG,SPI_DI); //Setzen von Pin MMC_DI auf Input
103 .LM3:
104 001c BC98 cbi 55-0x20,4
36:mmc.c **** sbi(MMC_Direction_REG,SPI_Clock); //Setzen von Pin MMC_Clock auf Output
106 .LM4:
107 001e BD9A sbi 55-0x20,5
37:mmc.c **** sbi(MMC_Direction_REG,SPI_DO); //Setzen von Pin MMC_DO auf Output
109 .LM5:
110 0020 BB9A sbi 55-0x20,3
38:mmc.c **** sbi(MMC_Direction_REG,MMC_Chip_Select); //Setzen von Pin MMC_Chip_Select auf Output
112 .LM6:
113 0022 B99A sbi 55-0x20,1
39:mmc.c **** sbi(MMC_Direction_REG,SPI_SS);
115 .LM7:
116 0024 BA9A sbi 55-0x20,2
40:mmc.c **** sbi(MMC_Write,MMC_Chip_Select); //Setzt den Pin MMC_Chip_Select auf High Pegel
118 .LM8:
119 0026 C19A sbi 56-0x20,1
41:mmc.c ****
42:mmc.c **** for(int a=0;a<600;a++){}; //Wartet eine kurze Zeit
121 .LM9:
122 0028 87E5 ldi r24,lo8(599)
123 002a 92E0 ldi r25,hi8(599)
124 .L6:
125 002c 4997 sbiw r24,25
126 002e 97FF sbrs r25,7
127 0030 FDCF rjmp .L6
43:mmc.c ****
44:mmc.c ****
45:mmc.c **** //Aktiviren des SPI - Bus, Clock = Idel High
46:mmc.c **** SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //Enable SPI, SPI in Master Mode
129 .LM10:
130 0032 81E5 ldi r24,lo8(81)
131 0034 8DB9 out 45-0x20,r24
47:mmc.c ****
48:mmc.c **** //Initialisiere MMC/SD-Karte in den SPI-Mode
49:mmc.c **** for (int b = 0;b<0x0f;b++) //Sendet min 74+ Clocks an die MMC/SD-Karte
133 .LM11:
134 0036 0EE0 ldi r16,lo8(14)
135 0038 10E0 ldi r17,hi8(14)
136 .L11:
50:mmc.c **** {
51:mmc.c **** Write_Byte_MMC(0x0f);
138 .LM12:
139 .LBB3:
140 003a 8FE0 ldi r24,lo8(15)
141 003c 78D0 rcall Write_Byte_MMC
143 .LM13:
144 003e 0150 subi r16,lo8(-(-1))
145 0040 1040 sbci r17,hi8(-(-1))
146 0042 17FF sbrs r17,7
147 0044 FACF rjmp .L11
52:mmc.c **** }
53:mmc.c ****
54:mmc.c **** //Sendet Commando CMD0 an MMC/SD-Karte
55:mmc.c **** Timeout = 0;
149 .LM14:
150 .LBE3:
151 0046 10E0 ldi r17,lo8(0)
56:mmc.c **** char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};
153 .LM15:
154 0048 86E0 ldi r24,lo8(6)
155 004a DE01 movw r26,r28
156 004c 1196 adiw r26,1
157 004e E0E0 ldi r30,lo8(.LC0)
158 0050 F0E0 ldi r31,hi8(.LC0)
159 0052 0190 ld __tmp_reg__,Z+
160 0054 0D92 st X+,__tmp_reg__
161 0056 8A95 dec r24
162 0058 E1F7 brne .-8
57:mmc.c **** while(tmp!=1)
164 .LM16:
165 005a 81E0 ldi r24,lo8(1)
166 005c F816 cp r15,r24
167 005e 69F0 breq .L27
168 .L16:
58:mmc.c **** {
59:mmc.c **** tmp = Write_Command_MMC (CMD);
170 .LM17:
171 0060 CE01 movw r24,r28
172 0062 0196 adiw r24,1
173 0064 2AD0 rcall Write_Command_MMC
174 0066 F82E mov r15,r24
60:mmc.c **** //printf ("Return Code from MMC/SD Init CMD0 %x\n",tmp);
61:mmc.c **** Timeout++;
176 .LM18:
177 0068 1F5F subi r17,lo8(-(1))
62:mmc.c **** if (Timeout > 20)
179 .LM19:
180 006a 1531 cpi r17,lo8(21)
181 006c 18F0 brlo .L12
63:mmc.c **** {
64:mmc.c **** return(1); //Abbruch bei Commando1 (Return Code1)
183 .LM20:
184 006e 81E0 ldi r24,lo8(1)
185 0070 90E0 ldi r25,hi8(1)
186 0072 17C0 rjmp .L1
187 .L12:
188 0074 81E0 ldi r24,lo8(1)
189 0076 F816 cp r15,r24
190 0078 99F7 brne .L16
191 .L27:
65:mmc.c **** }
66:mmc.c **** }
67:mmc.c **** //Sendet Commando CMD1 an MMC/SD-Karte
68:mmc.c **** Timeout = 0;
193 .LM21:
194 007a 10E0 ldi r17,lo8(0)
69:mmc.c **** CMD[0] = 0x41;//Commando 1
196 .LM22:
197 007c 81E4 ldi r24,lo8(65)
198 007e 8983 std Y+1,r24
70:mmc.c **** CMD[5] = 0xFF;
200 .LM23:
201 0080 8FEF ldi r24,lo8(-1)
202 0082 8E83 std Y+6,r24
71:mmc.c **** while(tmp!=0)
204 .LM24:
205 0084 FF20 tst r15
206 0086 59F0 breq .L29
207 .L21:
72:mmc.c **** {
73:mmc.c **** tmp = Write_Command_MMC (CMD);
209 .LM25:
210 0088 CE01 movw r24,r28
211 008a 0196 adiw r24,1
212 008c 16D0 rcall Write_Command_MMC
74:mmc.c **** //printf ("Return Code from MMC/SD Init CMD1 %x\n",tmp);
75:mmc.c **** Timeout++;
214 .LM26:
215 008e 1F5F subi r17,lo8(-(1))
76:mmc.c **** if (Timeout > 10)
217 .LM27:
218 0090 1B30 cpi r17,lo8(11)
219 0092 18F0 brlo .L17
77:mmc.c **** {
78:mmc.c **** return(2); //Abbruch bei Commando2 (Return Code2)
221 .LM28:
222 0094 82E0 ldi r24,lo8(2)
223 0096 90E0 ldi r25,hi8(2)
224 0098 04C0 rjmp .L1
225 .L17:
226 009a 8823 tst r24
227 009c A9F7 brne .L21
228 .L29:
79:mmc.c **** }
80:mmc.c **** }
81:mmc.c **** return(0);
230 .LM29:
231 009e 80E0 ldi r24,lo8(0)
232 00a0 90E0 ldi r25,hi8(0)
82:mmc.c **** }
234 .LM30:
235 .L1:
236 .LBE2:
237 /* epilogue: frame size=6 */
238 00a2 2696 adiw r28,6
239 00a4 0FB6 in __tmp_reg__,__SREG__
240 00a6 F894 cli
241 00a8 DEBF out __SP_H__,r29
242 00aa 0FBE out __SREG__,__tmp_reg__
243 00ac CDBF out __SP_L__,r28
244 00ae DF91 pop r29
245 00b0 CF91 pop r28
246 00b2 1F91 pop r17
247 00b4 0F91 pop r16
248 00b6 FF90 pop r15
249 00b8 0895 ret
250 /* epilogue end (size=12) */
251 /* function Init_MMC size 93 (68) */
261 .Lscope0:
265 .global Write_Command_MMC
267 Write_Command_MMC:
83:mmc.c ****
84:mmc.c **** //Sendet ein Commando an die MMC/SD-Karte
85:mmc.c **** char Write_Command_MMC (char *CMD)
86:mmc.c **** {
269 .LM31:
270 /* prologue: frame size=0 */
271 00ba DF92 push r13
272 00bc EF92 push r14
273 00be FF92 push r15
274 00c0 0F93 push r16
275 00c2 1F93 push r17
276 00c4 CF93 push r28
277 00c6 DF93 push r29
278 /* prologue end (size=7) */
279 00c8 8C01 movw r16,r24
87:mmc.c **** char tmp = 0xff;
281 .LM32:
282 .LBB4:
283 00ca 8FEF ldi r24,lo8(-1)
284 00cc D82E mov r13,r24
88:mmc.c **** unsigned int Timeout = 0;
286 .LM33:
287 00ce EE24 clr r14
288 00d0 FF24 clr r15
89:mmc.c **** //sendet 8 Clock Impulse
90:mmc.c **** sbi(MMC_Write,MMC_Chip_Select);//set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv)
290 .LM34:
291 00d2 C19A sbi 56-0x20,1
91:mmc.c **** Write_Byte_MMC(0x00);
293 .LM35:
294 00d4 80E0 ldi r24,lo8(0)
295 00d6 2BD0 rcall Write_Byte_MMC
92:mmc.c ****
93:mmc.c **** //sendet 6 Byte Commando
94:mmc.c **** cbi(MMC_Write,MMC_Chip_Select);//set MMC_Chip_Select to low (MMC/SD-Karte Aktiv)
297 .LM36:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -