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

📄 main.lss

📁 用ATMEL AVR单片机开发的MMC程式在SPI模式
💻 LSS
📖 第 1 页 / 共 5 页
字号:
{
     192:	af 92       	push	r10
     194:	bf 92       	push	r11
     196:	cf 92       	push	r12
     198:	df 92       	push	r13
     19a:	ef 92       	push	r14
     19c:	ff 92       	push	r15
     19e:	0f 93       	push	r16
     1a0:	1f 93       	push	r17
     1a2:	cf 93       	push	r28
     1a4:	df 93       	push	r29
     1a6:	cd b7       	in	r28, 0x3d	; 61
     1a8:	de b7       	in	r29, 0x3e	; 62
     1aa:	26 97       	sbiw	r28, 0x06	; 6
     1ac:	0f b6       	in	r0, 0x3f	; 63
     1ae:	f8 94       	cli
     1b0:	de bf       	out	0x3e, r29	; 62
     1b2:	0f be       	out	0x3f, r0	; 63
     1b4:	cd bf       	out	0x3d, r28	; 61
     1b6:	5b 01       	movw	r10, r22
     1b8:	6c 01       	movw	r12, r24
     1ba:	7a 01       	movw	r14, r20
	char tmp;
	int Timeout;
	
	char CMD17[] = {0x51,0x00,0x00,0x00,0x00,0xFF}; //Commando 16 zum lesen eines Blocks
     1bc:	46 e0       	ldi	r20, 0x06	; 6
     1be:	9e 01       	movw	r18, r28
     1c0:	2f 5f       	subi	r18, 0xFF	; 255
     1c2:	3f 4f       	sbci	r19, 0xFF	; 255
     1c4:	66 e6       	ldi	r22, 0x66	; 102
     1c6:	70 e0       	ldi	r23, 0x00	; 0
     1c8:	d9 01       	movw	r26, r18
     1ca:	fb 01       	movw	r30, r22
     1cc:	01 90       	ld	r0, Z+
     1ce:	0d 92       	st	X+, r0
     1d0:	4a 95       	dec	r20
     1d2:	e1 f7       	brne	.-8      	; 0x1cc
	
	/*Die Adressierung der MMC/SD-Karte wird in Bytes angegeben,
	  addr wird von Blocks zu Bytes umgerechnet danach werden 
	  diese in das Commando eingef黦t*/
	  
	addr = addr << 9; //addr = addr * 512
     1d4:	39 e0       	ldi	r19, 0x09	; 9
     1d6:	aa 0c       	add	r10, r10
     1d8:	bb 1c       	adc	r11, r11
     1da:	cc 1c       	adc	r12, r12
     1dc:	dd 1c       	adc	r13, r13
     1de:	3a 95       	dec	r19
     1e0:	d1 f7       	brne	.-12     	; 0x1d6
	
	CMD17[1] = ((addr & 0xFF000000) >>24 );
     1e2:	2d 2d       	mov	r18, r13
     1e4:	33 27       	eor	r19, r19
     1e6:	44 27       	eor	r20, r20
     1e8:	55 27       	eor	r21, r21
     1ea:	2a 83       	std	Y+2, r18	; 0x02
	CMD17[2] = ((addr & 0x00FF0000) >>16 );
     1ec:	cb 82       	std	Y+3, r12	; 0x03
	CMD17[3] = ((addr & 0x0000FF00) >>8 );
     1ee:	80 e0       	ldi	r24, 0x00	; 0
     1f0:	9f ef       	ldi	r25, 0xFF	; 255
     1f2:	a0 e0       	ldi	r26, 0x00	; 0
     1f4:	b0 e0       	ldi	r27, 0x00	; 0
     1f6:	a8 22       	and	r10, r24
     1f8:	b9 22       	and	r11, r25
     1fa:	ca 22       	and	r12, r26
     1fc:	db 22       	and	r13, r27
     1fe:	bb 27       	eor	r27, r27
     200:	ad 2d       	mov	r26, r13
     202:	9c 2d       	mov	r25, r12
     204:	8b 2d       	mov	r24, r11
     206:	8c 83       	std	Y+4, r24	; 0x04

	//Sendet Commando CMD16 an MMC/SD-Karte (Read 1 Block/512 Bytes)
	tmp = Write_Command_MMC (CMD17);
     208:	ce 01       	movw	r24, r28
     20a:	01 96       	adiw	r24, 0x01	; 1
     20c:	84 df       	rcall	.-248    	; 0x116
	if (tmp != 0)
     20e:	88 23       	and	r24, r24
     210:	29 f0       	breq	.+10     	; 0x21c
			{
			return(tmp);
     212:	99 27       	eor	r25, r25
     214:	1c c0       	rjmp	.+56     	; 0x24e
			}
			
	//Wartet auf Start Byte von der MMC/SD-Karte (FEh/Start Byte)
	Timeout = 0;
	while (tmp != 0xfe)
	{
	tmp = Read_Byte_MMC();
	Timeout++;
	if (Timeout > 400)
		{
		return(1);
     216:	81 e0       	ldi	r24, 0x01	; 1
     218:	90 e0       	ldi	r25, 0x00	; 0
     21a:	19 c0       	rjmp	.+50     	; 0x24e
     21c:	00 e0       	ldi	r16, 0x00	; 0
     21e:	10 e0       	ldi	r17, 0x00	; 0
     220:	ad df       	rcall	.-166    	; 0x17c
     222:	0f 5f       	subi	r16, 0xFF	; 255
     224:	1f 4f       	sbci	r17, 0xFF	; 255
     226:	91 e0       	ldi	r25, 0x01	; 1
     228:	01 39       	cpi	r16, 0x91	; 145
     22a:	19 07       	cpc	r17, r25
     22c:	a4 f7       	brge	.-24     	; 0x216
     22e:	8e 3f       	cpi	r24, 0xFE	; 254
     230:	b9 f7       	brne	.-18     	; 0x220
		}
	}
	
	//Lesen des Bolcks (512Bytes) von MMC/SD-Karte
	for (int a=0;a<512;a++)
     232:	0f ef       	ldi	r16, 0xFF	; 255
     234:	11 e0       	ldi	r17, 0x01	; 1
		{
		*Buffer++ = Read_Byte_MMC();
     236:	a2 df       	rcall	.-188    	; 0x17c
     238:	d7 01       	movw	r26, r14
     23a:	8d 93       	st	X+, r24
     23c:	7d 01       	movw	r14, r26
     23e:	01 50       	subi	r16, 0x01	; 1
     240:	10 40       	sbci	r17, 0x00	; 0
     242:	17 ff       	sbrs	r17, 7
     244:	f8 cf       	rjmp	.-16     	; 0x236
		}
	
	//CRC-Byte auslesen
	tmp = Read_Byte_MMC();//CRC - Byte wird nicht ausgewertet
     246:	9a df       	rcall	.-204    	; 0x17c
	tmp = Read_Byte_MMC();
     248:	99 df       	rcall	.-206    	; 0x17c
	
	
	return(0);
     24a:	80 e0       	ldi	r24, 0x00	; 0
     24c:	90 e0       	ldi	r25, 0x00	; 0
}
     24e:	26 96       	adiw	r28, 0x06	; 6
     250:	0f b6       	in	r0, 0x3f	; 63
     252:	f8 94       	cli
     254:	de bf       	out	0x3e, r29	; 62
     256:	0f be       	out	0x3f, r0	; 63
     258:	cd bf       	out	0x3d, r28	; 61
     25a:	df 91       	pop	r29
     25c:	cf 91       	pop	r28
     25e:	1f 91       	pop	r17
     260:	0f 91       	pop	r16
     262:	ff 90       	pop	r15
     264:	ef 90       	pop	r14
     266:	df 90       	pop	r13
     268:	cf 90       	pop	r12
     26a:	bf 90       	pop	r11
     26c:	af 90       	pop	r10
     26e:	08 95       	ret

00000270 <Write_Block_MMC>:

//Routine zum schreiben eines Blocks(512Byte) auf die MMC/SD-Karte
char Write_Block_MMC (unsigned long addr, char *Buffer)
{
     270:	af 92       	push	r10
     272:	bf 92       	push	r11
     274:	cf 92       	push	r12
     276:	df 92       	push	r13
     278:	ef 92       	push	r14
     27a:	ff 92       	push	r15
     27c:	0f 93       	push	r16
     27e:	1f 93       	push	r17
     280:	cf 93       	push	r28
     282:	df 93       	push	r29
     284:	cd b7       	in	r28, 0x3d	; 61
     286:	de b7       	in	r29, 0x3e	; 62
     288:	26 97       	sbiw	r28, 0x06	; 6
     28a:	0f b6       	in	r0, 0x3f	; 63
     28c:	f8 94       	cli
     28e:	de bf       	out	0x3e, r29	; 62
     290:	0f be       	out	0x3f, r0	; 63
     292:	cd bf       	out	0x3d, r28	; 61
     294:	5b 01       	movw	r10, r22
     296:	6c 01       	movw	r12, r24
     298:	7a 01       	movw	r14, r20
	char tmp;
	
	char CMD24[] = {0x58,0x00,0x00,0x00,0x00,0xFF}; //Commando 24 zum schreiben eines Blocks
     29a:	46 e0       	ldi	r20, 0x06	; 6
     29c:	9e 01       	movw	r18, r28
     29e:	2f 5f       	subi	r18, 0xFF	; 255
     2a0:	3f 4f       	sbci	r19, 0xFF	; 255
     2a2:	6c e6       	ldi	r22, 0x6C	; 108
     2a4:	70 e0       	ldi	r23, 0x00	; 0
     2a6:	d9 01       	movw	r26, r18
     2a8:	fb 01       	movw	r30, r22
     2aa:	01 90       	ld	r0, Z+
     2ac:	0d 92       	st	X+, r0
     2ae:	4a 95       	dec	r20
     2b0:	e1 f7       	brne	.-8      	; 0x2aa
	
	/*Die Adressierung der MMC/SD-Karte wird in Bytes angegeben,
	  addr wird von Blocks zu Bytes umgerechnet danach werden 
	  diese in das Commando eingef黦t*/
	  
	addr = addr << 9; //addr = addr * 512
     2b2:	69 e0       	ldi	r22, 0x09	; 9
     2b4:	aa 0c       	add	r10, r10
     2b6:	bb 1c       	adc	r11, r11
     2b8:	cc 1c       	adc	r12, r12
     2ba:	dd 1c       	adc	r13, r13
     2bc:	6a 95       	dec	r22
     2be:	d1 f7       	brne	.-12     	; 0x2b4
	
	CMD24[1] = ((addr & 0xFF000000) >>24 );
     2c0:	2d 2d       	mov	r18, r13
     2c2:	33 27       	eor	r19, r19
     2c4:	44 27       	eor	r20, r20
     2c6:	55 27       	eor	r21, r21
     2c8:	2a 83       	std	Y+2, r18	; 0x02
	CMD24[2] = ((addr & 0x00FF0000) >>16 );
     2ca:	cb 82       	std	Y+3, r12	; 0x03
	CMD24[3] = ((addr & 0x0000FF00) >>8 );
     2cc:	80 e0       	ldi	r24, 0x00	; 0
     2ce:	9f ef       	ldi	r25, 0xFF	; 255
     2d0:	a0 e0       	ldi	r26, 0x00	; 0
     2d2:	b0 e0       	ldi	r27, 0x00	; 0
     2d4:	a8 22       	and	r10, r24
     2d6:	b9 22       	and	r11, r25
     2d8:	ca 22       	and	r12, r26
     2da:	db 22       	and	r13, r27
     2dc:	bb 27       	eor	r27, r27
     2de:	ad 2d       	mov	r26, r13
     2e0:	9c 2d       	mov	r25, r12
     2e2:	8b 2d       	mov	r24, r11
     2e4:	8c 83       	std	Y+4, r24	; 0x04

	//Sendet Commando CMD24 an MMC/SD-Karte (Write 1 Block/512 Bytes)
	tmp = Write_Command_MMC (CMD24);
     2e6:	ce 01       	movw	r24, r28
     2e8:	01 96       	adiw	r24, 0x01	; 1
     2ea:	15 df       	rcall	.-470    	; 0x116
	if (tmp != 0)
     2ec:	88 23       	and	r24, r24
     2ee:	11 f0       	breq	.+4      	; 0x2f4
			{
			return(tmp);
     2f0:	99 27       	eor	r25, r25
     2f2:	1c c0       	rjmp	.+56     	; 0x32c
			}
			
	//Wartet einen Moment und sendet einen Clock an die MMC/SD-Karte
	for (int a=0;a<100;a++)
     2f4:	03 e6       	ldi	r16, 0x63	; 99
     2f6:	10 e0       	ldi	r17, 0x00	; 0
	{
	tmp = Read_Byte_MMC();
     2f8:	41 df       	rcall	.-382    	; 0x17c
     2fa:	01 50       	subi	r16, 0x01	; 1
     2fc:	10 40       	sbci	r17, 0x00	; 0
     2fe:	17 ff       	sbrs	r17, 7
     300:	fb cf       	rjmp	.-10     	; 0x2f8
	}
	
	//Sendet Start Byte an MMC/SD-Karte
	Write_Byte_MMC(0xFE);	
     302:	8e ef       	ldi	r24, 0xFE	; 254
     304:	42 df       	rcall	.-380    	; 0x18a
	
	//Schreiben des Bolcks (512Bytes) auf MMC/SD-Karte
	for (int a=0;a<512;a++)
     306:	0f ef       	ldi	r16, 0xFF	; 255
     308:	11 e0       	ldi	r17, 0x01	; 1
		{
		Write_Byte_MMC(*Buffer++);
     30a:	d7 01       	movw	r26, r14
     30c:	8d 91       	ld	r24, X+
     30e:	7d 01       	movw	r14, r26
     310:	3c df       	rcall	.-392    	; 0x18a
     312:	01 50       	subi	r16, 0x01	; 1
     314:	10 40       	sbci	r17, 0x00	; 0
     316:	17 ff       	sbrs	r17, 7
     318:	f8 cf       	rjmp	.-16     	; 0x30a
		}
	
	//CRC-Byte schreiben
	Write_Byte_MMC(0xFF); //Schreibt Dummy CRC
     31a:	8f ef       	ldi	r24, 0xFF	; 255
     31c:	36 df       	rcall	.-404    	; 0x18a
	Write_Byte_MMC(0xFF); //CRC Code wird nicht benutzt
     31e:	8f ef       	ldi	r24, 0xFF	; 255
     320:	34 df       	rcall	.-408    	; 0x18a
	
	//Wartet auf MMC/SD-Karte Bussy
	tmp = 0;
	while (tmp != 0xff)
		{
		tmp = Read_Byte_MMC();
     322:	2c df       	rcall	.-424    	; 0x17c
     324:	8f 3f       	cpi	r24, 0xFF	; 255
     326:	e9 f7       	brne	.-6      	; 0x322
		}
	
return(0);
     328:	80 e0       	ldi	r24, 0x00	; 0
     32a:	90 e0       	ldi	r25, 0x00	; 0
}
     32c:	26 96       	adiw	r28, 0x06	; 6
     32e:	0f b6       	in	r0, 0x3f	; 63
     330:	f8 94       	cli
     332:	de bf       	out	0x3e, r29	; 62
     334:	0f be       	out	0x3f, r0	; 63
     336:	cd bf       	out	0x3d, r28	; 61
     338:	df 91       	pop	r29
     33a:	cf 91       	pop	r28
     33c:	1f 91       	pop	r17
     33e:	0f 91       	pop	r16
     340:	ff 90       	pop	r15
     342:	ef 90       	pop	r14
     344:	df 90       	pop	r13
     346:	cf 90       	pop	r12
     348:	bf 90       	pop	r11
     34a:	af 90       	pop	r10
     34c:	08 95       	ret

0000034e <IOInit>:
//Installation der Seriellen Schnittstelle
void IOInit (void)
{
	//Enable TXEN im Register UCR TX-Data Enable
	outp ((1 << TXEN),UCR);
     34e:	88 e0       	ldi	r24, 0x08	; 8
     350:	8a b9       	out	0x0a, r24	; 10
	//Teiler wird gesetzt 
	outp ((sysclk / (baud_rate * 16L) - 1) , UBRR);
     352:	89 e1       	ldi	r24, 0x19	; 25
     354:	89 b9       	out	0x09, r24	; 9
}
     356:	08 95       	ret

00000358 <uart_putchar>:


//Routine f黵 printf
int uart_putchar (char c)
{
     358:	cf 93       	push	r28
     35a:	c8 2f       	mov	r28, r24
	if (c == '\n')
     35c:	8a 30       	cpi	r24, 0x0A	; 10
     35e:	11 f4       	brne	.+4      	; 0x364
		uart_putchar('\r');
     360:	8d e0       	ldi	r24, 0x0D	; 13
     362:	fa df       	rcall	.-12     	; 0x358
	//Warten solange bis Zeichen gesendet wurde
	loop_until_bit_is_set(USR, UDRE);
     364:	5d 9b       	sbis	0x0b, 5	; 11
     366:	fe cf       	rjmp	.-4      	; 0x364
	UDR = c;

⌨️ 快捷键说明

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