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

📄 main.lss

📁 AVR单片机 读写SD/MMC卡 带文件系统 FAT16 源码
💻 LSS
📖 第 1 页 / 共 3 页
字号:

000004ec <mmc_read_sector>:
	
	return;
}

//############################################################################
//Routine zum lesen eines Blocks(512Byte) von der MMC/SD-Karte
U08 mmc_read_sector (U32 addr,U08 *Buffer)
//############################################################################
{	
     4ec:	cf 92       	push	r12
     4ee:	df 92       	push	r13
     4f0:	ef 92       	push	r14
     4f2:	ff 92       	push	r15
     4f4:	0f 93       	push	r16
     4f6:	1f 93       	push	r17
     4f8:	cf 93       	push	r28
     4fa:	df 93       	push	r29
     4fc:	cd b7       	in	r28, 0x3d	; 61
     4fe:	de b7       	in	r29, 0x3e	; 62
     500:	26 97       	sbiw	r28, 0x06	; 6
     502:	0f b6       	in	r0, 0x3f	; 63
     504:	f8 94       	cli
     506:	de bf       	out	0x3e, r29	; 62
     508:	0f be       	out	0x3f, r0	; 63
     50a:	cd bf       	out	0x3d, r28	; 61
     50c:	6b 01       	movw	r12, r22
     50e:	7c 01       	movw	r14, r24
     510:	ba 01       	movw	r22, r20
	//Commando 16 zum lesen eines Blocks von der MMC/SD - Karte
	U08 cmd[] = {0x51,0x00,0x00,0x00,0x00,0xFF}; 
     512:	8e 01       	movw	r16, r28
     514:	0f 5f       	subi	r16, 0xFF	; 255
     516:	1f 4f       	sbci	r17, 0xFF	; 255
     518:	26 e0       	ldi	r18, 0x06	; 6
     51a:	4c e1       	ldi	r20, 0x1C	; 28
     51c:	51 e0       	ldi	r21, 0x01	; 1
     51e:	d8 01       	movw	r26, r16
     520:	fa 01       	movw	r30, r20
     522:	01 90       	ld	r0, Z+
     524:	0d 92       	st	X+, r0
     526:	2a 95       	dec	r18
     528:	e1 f7       	brne	.-8      	; 0x522
	
	/*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
     52a:	59 e0       	ldi	r21, 0x09	; 9
     52c:	cc 0c       	add	r12, r12
     52e:	dd 1c       	adc	r13, r13
     530:	ee 1c       	adc	r14, r14
     532:	ff 1c       	adc	r15, r15
     534:	5a 95       	dec	r21
     536:	d1 f7       	brne	.-12     	; 0x52c

	cmd[1] = ((addr & 0xFF000000) >>24 );
     538:	2f 2d       	mov	r18, r15
     53a:	33 27       	eor	r19, r19
     53c:	44 27       	eor	r20, r20
     53e:	55 27       	eor	r21, r21
     540:	2a 83       	std	Y+2, r18	; 0x02
	cmd[2] = ((addr & 0x00FF0000) >>16 );
     542:	eb 82       	std	Y+3, r14	; 0x03
	cmd[3] = ((addr & 0x0000FF00) >>8 );
     544:	80 e0       	ldi	r24, 0x00	; 0
     546:	9f ef       	ldi	r25, 0xFF	; 255
     548:	a0 e0       	ldi	r26, 0x00	; 0
     54a:	b0 e0       	ldi	r27, 0x00	; 0
     54c:	c8 22       	and	r12, r24
     54e:	d9 22       	and	r13, r25
     550:	ea 22       	and	r14, r26
     552:	fb 22       	and	r15, r27
     554:	bb 27       	eor	r27, r27
     556:	af 2d       	mov	r26, r15
     558:	9e 2d       	mov	r25, r14
     55a:	8d 2d       	mov	r24, r13
     55c:	8c 83       	std	Y+4, r24	; 0x04

    mmc_read_block(cmd,Buffer,512);
     55e:	40 e0       	ldi	r20, 0x00	; 0
     560:	52 e0       	ldi	r21, 0x02	; 2
     562:	c8 01       	movw	r24, r16
     564:	0e 94 42 02 	call	0x484

	return(0);
}
     568:	80 e0       	ldi	r24, 0x00	; 0
     56a:	90 e0       	ldi	r25, 0x00	; 0
     56c:	26 96       	adiw	r28, 0x06	; 6
     56e:	0f b6       	in	r0, 0x3f	; 63
     570:	f8 94       	cli
     572:	de bf       	out	0x3e, r29	; 62
     574:	0f be       	out	0x3f, r0	; 63
     576:	cd bf       	out	0x3d, r28	; 61
     578:	df 91       	pop	r29
     57a:	cf 91       	pop	r28
     57c:	1f 91       	pop	r17
     57e:	0f 91       	pop	r16
     580:	ff 90       	pop	r15
     582:	ef 90       	pop	r14
     584:	df 90       	pop	r13
     586:	cf 90       	pop	r12
     588:	08 95       	ret

0000058a <mmc_read_cid>:

//############################################################################
//Routine zum lesen des CID Registers von der MMC/SD-Karte (16Bytes)
U08 mmc_read_cid (U08 *Buffer)
//############################################################################
{
     58a:	0f 93       	push	r16
     58c:	1f 93       	push	r17
     58e:	cf 93       	push	r28
     590:	df 93       	push	r29
     592:	cd b7       	in	r28, 0x3d	; 61
     594:	de b7       	in	r29, 0x3e	; 62
     596:	26 97       	sbiw	r28, 0x06	; 6
     598:	0f b6       	in	r0, 0x3f	; 63
     59a:	f8 94       	cli
     59c:	de bf       	out	0x3e, r29	; 62
     59e:	0f be       	out	0x3f, r0	; 63
     5a0:	cd bf       	out	0x3d, r28	; 61
     5a2:	9c 01       	movw	r18, r24
	//Commando zum lesen des CID Registers
	U08 cmd[] = {0x4A,0x00,0x00,0x00,0x00,0xFF}; 
     5a4:	8e 01       	movw	r16, r28
     5a6:	0f 5f       	subi	r16, 0xFF	; 255
     5a8:	1f 4f       	sbci	r17, 0xFF	; 255
     5aa:	86 e0       	ldi	r24, 0x06	; 6
     5ac:	42 e2       	ldi	r20, 0x22	; 34
     5ae:	51 e0       	ldi	r21, 0x01	; 1
     5b0:	d8 01       	movw	r26, r16
     5b2:	fa 01       	movw	r30, r20
     5b4:	01 90       	ld	r0, Z+
     5b6:	0d 92       	st	X+, r0
     5b8:	8a 95       	dec	r24
     5ba:	e1 f7       	brne	.-8      	; 0x5b4
	
	mmc_read_block(cmd,Buffer,16);
     5bc:	40 e1       	ldi	r20, 0x10	; 16
     5be:	50 e0       	ldi	r21, 0x00	; 0
     5c0:	b9 01       	movw	r22, r18
     5c2:	c8 01       	movw	r24, r16
     5c4:	0e 94 42 02 	call	0x484

	return(0);
}
     5c8:	80 e0       	ldi	r24, 0x00	; 0
     5ca:	90 e0       	ldi	r25, 0x00	; 0
     5cc:	26 96       	adiw	r28, 0x06	; 6
     5ce:	0f b6       	in	r0, 0x3f	; 63
     5d0:	f8 94       	cli
     5d2:	de bf       	out	0x3e, r29	; 62
     5d4:	0f be       	out	0x3f, r0	; 63
     5d6:	cd bf       	out	0x3d, r28	; 61
     5d8:	df 91       	pop	r29
     5da:	cf 91       	pop	r28
     5dc:	1f 91       	pop	r17
     5de:	0f 91       	pop	r16
     5e0:	08 95       	ret

000005e2 <mmc_read_csd>:

//############################################################################
//Routine zum lesen des CSD Registers von der MMC/SD-Karte (16Bytes)
U08 mmc_read_csd (U08 *Buffer)
//############################################################################
{	
     5e2:	0f 93       	push	r16
     5e4:	1f 93       	push	r17
     5e6:	cf 93       	push	r28
     5e8:	df 93       	push	r29
     5ea:	cd b7       	in	r28, 0x3d	; 61
     5ec:	de b7       	in	r29, 0x3e	; 62
     5ee:	26 97       	sbiw	r28, 0x06	; 6
     5f0:	0f b6       	in	r0, 0x3f	; 63
     5f2:	f8 94       	cli
     5f4:	de bf       	out	0x3e, r29	; 62
     5f6:	0f be       	out	0x3f, r0	; 63
     5f8:	cd bf       	out	0x3d, r28	; 61
     5fa:	9c 01       	movw	r18, r24
	//Commando zum lesen des CSD Registers
	U08 cmd[] = {0x49,0x00,0x00,0x00,0x00,0xFF};
     5fc:	8e 01       	movw	r16, r28
     5fe:	0f 5f       	subi	r16, 0xFF	; 255
     600:	1f 4f       	sbci	r17, 0xFF	; 255
     602:	86 e0       	ldi	r24, 0x06	; 6
     604:	48 e2       	ldi	r20, 0x28	; 40
     606:	51 e0       	ldi	r21, 0x01	; 1
     608:	d8 01       	movw	r26, r16
     60a:	fa 01       	movw	r30, r20
     60c:	01 90       	ld	r0, Z+
     60e:	0d 92       	st	X+, r0
     610:	8a 95       	dec	r24
     612:	e1 f7       	brne	.-8      	; 0x60c
	
	mmc_read_block(cmd,Buffer,16);
     614:	40 e1       	ldi	r20, 0x10	; 16
     616:	50 e0       	ldi	r21, 0x00	; 0
     618:	b9 01       	movw	r22, r18
     61a:	c8 01       	movw	r24, r16
     61c:	0e 94 42 02 	call	0x484

	return(0);
}
     620:	80 e0       	ldi	r24, 0x00	; 0
     622:	90 e0       	ldi	r25, 0x00	; 0
     624:	26 96       	adiw	r28, 0x06	; 6
     626:	0f b6       	in	r0, 0x3f	; 63
     628:	f8 94       	cli
     62a:	de bf       	out	0x3e, r29	; 62
     62c:	0f be       	out	0x3f, r0	; 63
     62e:	cd bf       	out	0x3d, r28	; 61
     630:	df 91       	pop	r29
     632:	cf 91       	pop	r28
     634:	1f 91       	pop	r17
     636:	0f 91       	pop	r16
     638:	08 95       	ret

0000063a <fat_addr>:
//############################################################################
//Auslesen der Adresse des Volume Boot Record von MBR
U16 fat_addr (U08 *Buffer)
//############################################################################
{
     63a:	ef 92       	push	r14
     63c:	ff 92       	push	r15
     63e:	0f 93       	push	r16
     640:	1f 93       	push	r17
     642:	8c 01       	movw	r16, r24
	U16 volume_boot_record_addr;
    
	//auslesen des Master Boot Record von der MMC/SD Karte (addr = 0)
	mmc_read_sector (MASTER_BOOT_RECORD,Buffer); //Read Master Boot Record
     644:	ac 01       	movw	r20, r24
     646:	60 e0       	ldi	r22, 0x00	; 0
     648:	70 e0       	ldi	r23, 0x00	; 0
     64a:	80 e0       	ldi	r24, 0x00	; 0
     64c:	90 e0       	ldi	r25, 0x00	; 0
     64e:	0e 94 76 02 	call	0x4ec
    volume_boot_record_addr = Buffer[VBR_ADDR] + (Buffer[VBR_ADDR+1] << 8);
     652:	0a 53       	subi	r16, 0x3A	; 58
     654:	1e 4f       	sbci	r17, 0xFE	; 254
     656:	f8 01       	movw	r30, r16
     658:	21 91       	ld	r18, Z+
     65a:	8f 01       	movw	r16, r30
     65c:	80 81       	ld	r24, Z
     65e:	07 5c       	subi	r16, 0xC7	; 199
     660:	11 40       	sbci	r17, 0x01	; 1
     662:	99 27       	eor	r25, r25
     664:	f8 2e       	mov	r15, r24
     666:	ee 24       	eor	r14, r14
     668:	e2 0e       	add	r14, r18
     66a:	f1 1c       	adc	r15, r1
	//Berechnet Volume Boot Record 
	mmc_read_sector (volume_boot_record_addr,Buffer); //Read Master Boot Record
     66c:	c7 01       	movw	r24, r14
     66e:	aa 27       	eor	r26, r26
     670:	bb 27       	eor	r27, r27
     672:	a8 01       	movw	r20, r16
     674:	bc 01       	movw	r22, r24
     676:	cd 01       	movw	r24, r26
     678:	0e 94 76 02 	call	0x4ec
    return (volume_boot_record_addr);
}
     67c:	c7 01       	movw	r24, r14
     67e:	1f 91       	pop	r17
     680:	0f 91       	pop	r16
     682:	ff 90       	pop	r15
     684:	ef 90       	pop	r14
     686:	08 95       	ret

00000688 <fat_root_dir_addr>:
//############################################################################
//Auslesen der Adresse des First Root Directory von Volume Boot Record
U16 fat_root_dir_addr (U08 *Buffer) 
//############################################################################
{
     688:	0f 93       	push	r16
     68a:	1f 93       	push	r17
     68c:	8c 01       	movw	r16, r24
	struct BootSec *bootp; //Zeiger auf Bootsektor Struktur
	U16 FirstRootDirSecNum;
	//auslesen des Volume Boot Record von der MMC/SD Karte 
	mmc_read_sector (volume_boot_record_addr,Buffer);
     68e:	80 91 34 01 	lds	r24, 0x0134
     692:	90 91 35 01 	lds	r25, 0x0135
     696:	aa 27       	eor	r26, r26
     698:	bb 27       	eor	r27, r27
     69a:	a8 01       	movw	r20, r16
     69c:	bc 01       	movw	r22, r24
     69e:	cd 01       	movw	r24, r26
     6a0:	0e 94 76 02 	call	0x4ec
	bootp=(struct BootSec *)Buffer;

	//berechnet den ersten Sector des Root Directory
	FirstRootDirSecNum = ( bootp->BPB_RsvdSecCnt +
     6a4:	f8 01       	movw	r30, r16
     6a6:	80 89       	ldd	r24, Z+16	; 0x10
     6a8:	28 2f       	mov	r18, r24
     6aa:	33 27       	eor	r19, r19
     6ac:	86 89       	ldd	r24, Z+22	; 0x16
     6ae:	97 89       	ldd	r25, Z+23	; 0x17
     6b0:	28 9f       	mul	r18, r24
     6b2:	a0 01       	movw	r20, r0
     6b4:	29 9f       	mul	r18, r25
     6b6:	50 0d       	add	r21, r0
     6b8:	38 9f       	mul	r19, r24
     6ba:	50 0d       	add	r21, r0
     6bc:	11 24       	eor	r1, r1
     6be:	86 85       	ldd	r24, Z+14	; 0x0e
     6c0:	97 85       	ldd	r25, Z+15	; 0x0f
     6c2:	84 0f       	add	r24, r20
     6c4:	95 1f       	adc	r25, r21
	                       (bootp->BPB_NumFATs * bootp->BPB_FATSz16));

	FirstRootDirSecNum+= volume_boot_record_addr;
     6c6:	20 91 34 01 	lds	r18, 0x0134
     6ca:	30 91 35 01 	lds	r19, 0x0135
	
	return(FirstRootDirSecNum);
}
     6ce:	82 0f       	add	r24, r18
     6d0:	93 1f       	adc	r25, r19
     6d2:	1f 91       	pop	r17
     6d4:	0f 91       	pop	r16
     6d6:	08 95       	ret

000006d8 <fat_load>:

//############################################################################
//	Ausgabe des angegebenen Directory Eintrag in Entry_Count
//	ist kein Eintrag vorhanden, ist der Eintrag im 
//	R點kgabe Cluster 0xFFFF. Es wird immer nur ein Eintrag ausgegeben
//	um Speicherplatz zu sparen um es auch f黵 kleine Atmels zu benutzen
U16 fat_read_dir_ent (U16 dir_cluster, //Angabe Dir Cluster
					U08 Entry_Count,   //Angabe welcher Direintrag
					U32 *Size, 		   //R點kgabe der File Gr鲞e
					U08 *Dir_Attrib,   //R點kgabe des Dir Attributs
					U08 *Buffer) 	   //Working Buffer
//############################################################################
{
	U08 *pointer;
	U16 TMP_Entry_Count = 0;
	U32 Block = 0;
	struct DirEntry *dir; //Zeiger auf einen Verzeichniseintrag

	pointer = Buffer;

	if (dir_cluster == 0)
		{
		Block = fat_root_dir_addr(Buffer);
		}
	else
		{
		//Berechnung des Blocks aus BlockCount und Cluster aus FATTabelle
		//Berechnung welcher Cluster zu laden ist
		//Auslesen der FAT - Tabelle
		fat_load (dir_cluster,&Block,Buffer);			 
		Block = ((Block-2) * cluster_size) + cluster_offset;
		}

	//auslesen des gesamten Root Directory
	for (U16 blk = Block;;blk++)
	{
		mmc_read_sector (blk,Buffer);	//Lesen eines Blocks des Root Directory
		for (U16 a=0;a<BlockSize; a = a + 32)
		{
		 dir=(struct DirEntry *)&Buffer[a]; //Zeiger auf aktuellen Verzeichniseintrag holen
		 
			if (dir->DIR_Name[0] == 0) //Kein weiterer Eintrag wenn erstes Zeichen des Namens 0 ist
			{
			return (0xFFFF);
			}
			
			//Pr黤en ob es ein 8.3 Eintrag ist
			//Das ist der Fall wenn es sich nicht um einen Eintrag f黵 lange Dateinamen
			//oder um einen als gel鰏cht markierten Eintrag handelt.
   			if ((dir->DIR_Attr != ATTR_LONG_NAME) &&
				(dir->DIR_Name[0] != DIR_ENTRY_IS_FREE)) 
			{
				//Ist es der gew黱schte Verzeichniseintrag
				if (TMP_Entry_Count == Entry_Count) 
				{
					//Speichern des Verzeichnis Eintrages in den R點kgabe Buffer
					for(U08 b=0;b<11;b++)
					{
					if (dir->DIR_Name[b] != SPACE)
						{
						if (b == 8)
							{
							*pointer++= '.';
							}
						*pointer++=dir->DIR_Name[b];
						}
					}						
					*pointer++='\0';
					*Dir_Attrib = dir->DIR_Attr;

					//Speichern der Filegr鲞e
					*Size=dir->DIR_FileSize;
					
					//Speichern des Clusters des Verzeichniseintrages
					dir_cluster = dir->DIR_FstClusLO;

					//Eintrag gefunden R點ksprung mit Cluster File Start
					return(dir_cluster);
				}
			TMP_Entry_Count++;
			}
		}
	}
	return (0xFFFF); //Kein Eintrag mehr gefunden R點ksprung mit 0xFFFF
}

//############################################################################
//	Auslesen der Cluster f黵 ein File aus der FAT
//	in den Buffer(512Byte). Bei einer 128MB MMC/SD 
//	Karte ist die Cluster gr鲞e normalerweise 16KB gro

⌨️ 快捷键说明

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