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

📄 main.lss

📁 用ATMEL AVR单片机开发的MMC程式在SPI模式
💻 LSS
📖 第 1 页 / 共 5 页
字号:

main.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000109c  00000000  00000000  00000094  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000098  00800060  0000109c  00001130  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          0000000a  008000f8  008000f8  000011c8  2**0
                  ALLOC
  3 .noinit       00000000  00800102  00800102  000011c8  2**0
                  CONTENTS
  4 .eeprom       00000000  00810000  00810000  000011c8  2**0
                  CONTENTS
  5 .stab         00000cfc  00000000  00000000  000011c8  2**2
                  CONTENTS, READONLY, DEBUGGING
  6 .stabstr      00000833  00000000  00000000  00001ec4  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
       0:	12 c0       	rjmp	.+36     	; 0x26
       2:	2b c0       	rjmp	.+86     	; 0x5a
       4:	2a c0       	rjmp	.+84     	; 0x5a
       6:	29 c0       	rjmp	.+82     	; 0x5a
       8:	28 c0       	rjmp	.+80     	; 0x5a
       a:	27 c0       	rjmp	.+78     	; 0x5a
       c:	26 c0       	rjmp	.+76     	; 0x5a
       e:	25 c0       	rjmp	.+74     	; 0x5a
      10:	24 c0       	rjmp	.+72     	; 0x5a
      12:	23 c0       	rjmp	.+70     	; 0x5a
      14:	22 c0       	rjmp	.+68     	; 0x5a
      16:	21 c0       	rjmp	.+66     	; 0x5a
      18:	20 c0       	rjmp	.+64     	; 0x5a
      1a:	1f c0       	rjmp	.+62     	; 0x5a
      1c:	1e c0       	rjmp	.+60     	; 0x5a
      1e:	1d c0       	rjmp	.+58     	; 0x5a
      20:	1c c0       	rjmp	.+56     	; 0x5a
      22:	1b c0       	rjmp	.+54     	; 0x5a
      24:	1a c0       	rjmp	.+52     	; 0x5a

00000026 <__ctors_end>:
      26:	11 24       	eor	r1, r1
      28:	1f be       	out	0x3f, r1	; 63
      2a:	cf e5       	ldi	r28, 0x5F	; 95
      2c:	d4 e0       	ldi	r29, 0x04	; 4
      2e:	de bf       	out	0x3e, r29	; 62
      30:	cd bf       	out	0x3d, r28	; 61

00000032 <__do_copy_data>:
      32:	10 e0       	ldi	r17, 0x00	; 0
      34:	a0 e6       	ldi	r26, 0x60	; 96
      36:	b0 e0       	ldi	r27, 0x00	; 0
      38:	ec e9       	ldi	r30, 0x9C	; 156
      3a:	f0 e1       	ldi	r31, 0x10	; 16
      3c:	02 c0       	rjmp	.+4      	; 0x42

0000003e <.do_copy_data_loop>:
      3e:	05 90       	lpm	r0, Z+
      40:	0d 92       	st	X+, r0

00000042 <.do_copy_data_start>:
      42:	a8 3f       	cpi	r26, 0xF8	; 248
      44:	b1 07       	cpc	r27, r17
      46:	d9 f7       	brne	.-10     	; 0x3e

00000048 <__do_clear_bss>:
      48:	11 e0       	ldi	r17, 0x01	; 1
      4a:	a8 ef       	ldi	r26, 0xF8	; 248
      4c:	b0 e0       	ldi	r27, 0x00	; 0
      4e:	01 c0       	rjmp	.+2      	; 0x52

00000050 <.do_clear_bss_loop>:
      50:	1d 92       	st	X+, r1

00000052 <.do_clear_bss_start>:
      52:	a2 30       	cpi	r26, 0x02	; 2
      54:	b1 07       	cpc	r27, r17
      56:	e1 f7       	brne	.-8      	; 0x50
      58:	8c c1       	rjmp	.+792    	; 0x372

0000005a <__bad_interrupt>:
      5a:	d2 cf       	rjmp	.-92     	; 0x0

0000005c <Init_MMC>:
char Write_Command_MMC (char *CMD);

//Routine zur Initialisierung der MMC/SD-Karte (SPI-MODE)
char Init_MMC ()
{
      5c:	ff 92       	push	r15
      5e:	0f 93       	push	r16
      60:	1f 93       	push	r17
      62:	cf 93       	push	r28
      64:	df 93       	push	r29
      66:	cd b7       	in	r28, 0x3d	; 61
      68:	de b7       	in	r29, 0x3e	; 62
      6a:	26 97       	sbiw	r28, 0x06	; 6
      6c:	0f b6       	in	r0, 0x3f	; 63
      6e:	f8 94       	cli
      70:	de bf       	out	0x3e, r29	; 62
      72:	0f be       	out	0x3f, r0	; 63
      74:	cd bf       	out	0x3d, r28	; 61
	char tmp = 0;
      76:	ff 24       	eor	r15, r15
	char Timeout;
	//Konfiguration des Ports an der die MMC/SD-Karte angeschlossen wurde
	
	cbi(MMC_Direction_REG,SPI_DI);			//Setzen von Pin MMC_DI auf Input
      78:	bc 98       	cbi	0x17, 4	; 23
	sbi(MMC_Direction_REG,SPI_Clock);		//Setzen von Pin MMC_Clock auf Output
      7a:	bd 9a       	sbi	0x17, 5	; 23
	sbi(MMC_Direction_REG,SPI_DO);			//Setzen von Pin MMC_DO auf Output
      7c:	bb 9a       	sbi	0x17, 3	; 23
	sbi(MMC_Direction_REG,MMC_Chip_Select);	//Setzen von Pin MMC_Chip_Select auf Output
      7e:	b9 9a       	sbi	0x17, 1	; 23
	sbi(MMC_Direction_REG,SPI_SS);	
      80:	ba 9a       	sbi	0x17, 2	; 23
	sbi(MMC_Write,MMC_Chip_Select);			//Setzt den Pin MMC_Chip_Select auf High Pegel
      82:	c1 9a       	sbi	0x18, 1	; 24

	for(int a=0;a<600;a++){};			//Wartet eine kurze Zeit
      84:	87 e5       	ldi	r24, 0x57	; 87
      86:	92 e0       	ldi	r25, 0x02	; 2
      88:	49 97       	sbiw	r24, 0x19	; 25
      8a:	97 ff       	sbrs	r25, 7
      8c:	fd cf       	rjmp	.-6      	; 0x88


	//Aktiviren des SPI - Bus, Clock = Idel High
	SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //Enable SPI, SPI in Master Mode
      8e:	81 e5       	ldi	r24, 0x51	; 81
      90:	8d b9       	out	0x0d, r24	; 13
	
	//Initialisiere MMC/SD-Karte in den SPI-Mode
	for (int b = 0;b<0x0f;b++) //Sendet min 74+ Clocks an die MMC/SD-Karte
      92:	0e e0       	ldi	r16, 0x0E	; 14
      94:	10 e0       	ldi	r17, 0x00	; 0
		{
		Write_Byte_MMC(0x0f);
      96:	8f e0       	ldi	r24, 0x0F	; 15
      98:	78 d0       	rcall	.+240    	; 0x18a
      9a:	01 50       	subi	r16, 0x01	; 1
      9c:	10 40       	sbci	r17, 0x00	; 0
      9e:	17 ff       	sbrs	r17, 7
      a0:	fa cf       	rjmp	.-12     	; 0x96
		}
	
	//Sendet Commando CMD0 an MMC/SD-Karte
	Timeout = 0;
      a2:	10 e0       	ldi	r17, 0x00	; 0
	char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};
      a4:	86 e0       	ldi	r24, 0x06	; 6
      a6:	de 01       	movw	r26, r28
      a8:	11 96       	adiw	r26, 0x01	; 1
      aa:	e0 e6       	ldi	r30, 0x60	; 96
      ac:	f0 e0       	ldi	r31, 0x00	; 0
      ae:	01 90       	ld	r0, Z+
      b0:	0d 92       	st	X+, r0
      b2:	8a 95       	dec	r24
      b4:	e1 f7       	brne	.-8      	; 0xae
	while(tmp!=1)
      b6:	81 e0       	ldi	r24, 0x01	; 1
      b8:	f8 16       	cp	r15, r24
      ba:	69 f0       	breq	.+26     	; 0xd6
	{
		tmp = Write_Command_MMC (CMD);
      bc:	ce 01       	movw	r24, r28
      be:	01 96       	adiw	r24, 0x01	; 1
      c0:	2a d0       	rcall	.+84     	; 0x116
      c2:	f8 2e       	mov	r15, r24
		//printf ("Return Code from MMC/SD Init CMD0 %x\n",tmp);
		Timeout++;
      c4:	1f 5f       	subi	r17, 0xFF	; 255
		if (Timeout > 20)
      c6:	15 31       	cpi	r17, 0x15	; 21
      c8:	18 f0       	brcs	.+6      	; 0xd0
			{
			return(1); //Abbruch bei Commando1 (Return Code1)
      ca:	81 e0       	ldi	r24, 0x01	; 1
      cc:	90 e0       	ldi	r25, 0x00	; 0
      ce:	17 c0       	rjmp	.+46     	; 0xfe
      d0:	81 e0       	ldi	r24, 0x01	; 1
      d2:	f8 16       	cp	r15, r24
      d4:	99 f7       	brne	.-26     	; 0xbc
			}
	}
	//Sendet Commando CMD1 an MMC/SD-Karte
	Timeout = 0;
      d6:	10 e0       	ldi	r17, 0x00	; 0
	CMD[0] = 0x41;//Commando 1
      d8:	81 e4       	ldi	r24, 0x41	; 65
      da:	89 83       	std	Y+1, r24	; 0x01
	CMD[5] = 0xFF;
      dc:	8f ef       	ldi	r24, 0xFF	; 255
      de:	8e 83       	std	Y+6, r24	; 0x06
	while(tmp!=0)
      e0:	ff 20       	and	r15, r15
      e2:	59 f0       	breq	.+22     	; 0xfa
	{
		tmp = Write_Command_MMC (CMD);
      e4:	ce 01       	movw	r24, r28
      e6:	01 96       	adiw	r24, 0x01	; 1
      e8:	16 d0       	rcall	.+44     	; 0x116
		//printf ("Return Code from MMC/SD Init CMD1 %x\n",tmp);
		Timeout++;
      ea:	1f 5f       	subi	r17, 0xFF	; 255
		if (Timeout > 10)
      ec:	1b 30       	cpi	r17, 0x0B	; 11
      ee:	18 f0       	brcs	.+6      	; 0xf6
			{
			return(2); //Abbruch bei Commando2 (Return Code2)
      f0:	82 e0       	ldi	r24, 0x02	; 2
      f2:	90 e0       	ldi	r25, 0x00	; 0
      f4:	04 c0       	rjmp	.+8      	; 0xfe
      f6:	88 23       	and	r24, r24
      f8:	a9 f7       	brne	.-22     	; 0xe4
			}
	}
	return(0);
      fa:	80 e0       	ldi	r24, 0x00	; 0
      fc:	90 e0       	ldi	r25, 0x00	; 0
}
      fe:	26 96       	adiw	r28, 0x06	; 6
     100:	0f b6       	in	r0, 0x3f	; 63
     102:	f8 94       	cli
     104:	de bf       	out	0x3e, r29	; 62
     106:	0f be       	out	0x3f, r0	; 63
     108:	cd bf       	out	0x3d, r28	; 61
     10a:	df 91       	pop	r29
     10c:	cf 91       	pop	r28
     10e:	1f 91       	pop	r17
     110:	0f 91       	pop	r16
     112:	ff 90       	pop	r15
     114:	08 95       	ret

00000116 <Write_Command_MMC>:

//Sendet ein Commando an die MMC/SD-Karte
char Write_Command_MMC (char *CMD)
{
     116:	df 92       	push	r13
     118:	ef 92       	push	r14
     11a:	ff 92       	push	r15
     11c:	0f 93       	push	r16
     11e:	1f 93       	push	r17
     120:	cf 93       	push	r28
     122:	df 93       	push	r29
     124:	8c 01       	movw	r16, r24
	char tmp = 0xff;
     126:	8f ef       	ldi	r24, 0xFF	; 255
     128:	d8 2e       	mov	r13, r24
	unsigned int Timeout = 0;
     12a:	ee 24       	eor	r14, r14
     12c:	ff 24       	eor	r15, r15
	//sendet 8 Clock Impulse
	sbi(MMC_Write,MMC_Chip_Select);//set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) 
     12e:	c1 9a       	sbi	0x18, 1	; 24
	Write_Byte_MMC(0x00);
     130:	80 e0       	ldi	r24, 0x00	; 0
     132:	2b d0       	rcall	.+86     	; 0x18a

	//sendet 6 Byte Commando
	cbi(MMC_Write,MMC_Chip_Select);//set MMC_Chip_Select to low (MMC/SD-Karte Aktiv)
     134:	c1 98       	cbi	0x18, 1	; 24
	
	for (int a = 0;a<0x06;a++) //sendet 6 Byte Commando zur MMC/SD-Karte
     136:	c5 e0       	ldi	r28, 0x05	; 5
     138:	d0 e0       	ldi	r29, 0x00	; 0
		{
		Write_Byte_MMC(*CMD++);
     13a:	f8 01       	movw	r30, r16
     13c:	81 91       	ld	r24, Z+
     13e:	8f 01       	movw	r16, r30
     140:	24 d0       	rcall	.+72     	; 0x18a
     142:	21 97       	sbiw	r28, 0x01	; 1
     144:	d7 ff       	sbrs	r29, 7
     146:	f9 cf       	rjmp	.-14     	; 0x13a
		}
	
	while (tmp == 0xff)	//Wartet auf ein g黮tige Antwort von der MMC/SD-Karte
     148:	ff ef       	ldi	r31, 0xFF	; 255
     14a:	df 16       	cp	r13, r31
     14c:	69 f4       	brne	.+26     	; 0x168
		{
		tmp = Read_Byte_MMC();
     14e:	16 d0       	rcall	.+44     	; 0x17c
     150:	d8 2e       	mov	r13, r24
		Timeout++;
     152:	08 94       	sec
     154:	e1 1c       	adc	r14, r1
     156:	f1 1c       	adc	r15, r1
		if (Timeout > 400)
     158:	81 e9       	ldi	r24, 0x91	; 145
     15a:	e8 16       	cp	r14, r24
     15c:	81 e0       	ldi	r24, 0x01	; 1
     15e:	f8 06       	cpc	r15, r24
     160:	18 f4       	brcc	.+6      	; 0x168
			{
			break; //Abbruch da die MMC/SD-Karte nicht Antwortet
     162:	ef ef       	ldi	r30, 0xFF	; 255
     164:	de 16       	cp	r13, r30
     166:	99 f3       	breq	.-26     	; 0x14e
			}
		}

	return(tmp);
     168:	8d 2d       	mov	r24, r13
     16a:	99 27       	eor	r25, r25
}
     16c:	df 91       	pop	r29
     16e:	cf 91       	pop	r28
     170:	1f 91       	pop	r17
     172:	0f 91       	pop	r16
     174:	ff 90       	pop	r15
     176:	ef 90       	pop	r14
     178:	df 90       	pop	r13
     17a:	08 95       	ret

0000017c <Read_Byte_MMC>:

//Routine zum Empfangen eines Bytes von der MMC-Karte (Soft_SPI)
char Read_Byte_MMC (void)
{
	char Byte = 0;
	outb(SPDR,0xff);
     17c:	8f ef       	ldi	r24, 0xFF	; 255
     17e:	8f b9       	out	0x0f, r24	; 15
	while(!(SPSR & (1<<SPIF)))
     180:	77 9b       	sbis	0x0e, 7	; 14
     182:	fe cf       	rjmp	.-4      	; 0x180
	{
	}
	Byte = inp(SPDR);
     184:	8f b1       	in	r24, 0x0f	; 15
	return (Byte);
     186:	99 27       	eor	r25, r25
}
     188:	08 95       	ret

0000018a <Write_Byte_MMC>:

//Routine zum Senden eines Bytes zur MMC-Karte (Soft_SPI)
void Write_Byte_MMC (char Byte)
{
	outb(SPDR,Byte);
     18a:	8f b9       	out	0x0f, r24	; 15
	while(!(SPSR & (1<<SPIF)))
     18c:	77 9b       	sbis	0x0e, 7	; 14
     18e:	fe cf       	rjmp	.-4      	; 0x18c
	{
	}
}
     190:	08 95       	ret

00000192 <Read_Block_MMC>:

//Routine zum lesen eines Blocks(512Byte) von der MMC/SD-Karte
char Read_Block_MMC (unsigned long addr,char *Buffer)

⌨️ 快捷键说明

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