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

📄 main.lst

📁 用ATMEL AVR单片机开发的MMC程式在SPI模式
💻 LST
📖 第 1 页 / 共 3 页
字号:
   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 + -