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

📄 sd_lib.lss

📁 实现了avr下对sd卡的读写,支持文件存取,删除的功能
💻 LSS
📖 第 1 页 / 共 5 页
字号:
     3c0:	0e 94 8e 00 	call	0x11c <spiTransferByte>
     3c4:	89 93       	st	Y+, r24
     3c6:	11 50       	subi	r17, 0x01	; 1
     3c8:	17 ff       	sbrs	r17, 7
     3ca:	f9 cf       	rjmp	.-14     	; 0x3be <Read_CSD_MMC+0x2c>
     3cc:	1f ef       	ldi	r17, 0xFF	; 255
	}
	spiTransferByte(0xFF);							// read 16-bit CRC
     3ce:	81 2f       	mov	r24, r17
     3d0:	0e 94 8e 00 	call	0x11c <spiTransferByte>
	spiTransferByte(0xFF);
     3d4:	81 2f       	mov	r24, r17
     3d6:	0e 94 8e 00 	call	0x11c <spiTransferByte>
	CSH;
     3da:	c4 9a       	sbi	0x18, 4	; 24
	
	return(0);
     3dc:	80 e0       	ldi	r24, 0x00	; 0
     3de:	90 e0       	ldi	r25, 0x00	; 0
     3e0:	df 91       	pop	r29
     3e2:	cf 91       	pop	r28
     3e4:	1f 91       	pop	r17
     3e6:	08 95       	ret

000003e8 <MMC_get_volume_info>:
}
//-------------------------------------------------------------------------
//returns the :
// 	size of the card in MB ( ret * 1024^2) == bytes
// 	sector count and multiplier MB are in u08 == C_SIZE / (2^(9-C_SIZE_MULT))
// 	name of the media 
void MMC_get_volume_info(void){
     3e8:	0f 93       	push	r16
     3ea:	1f 93       	push	r17
     3ec:	cf 93       	push	r28
     3ee:	df 93       	push	r29
     3f0:	cd b7       	in	r28, 0x3d	; 61
     3f2:	de b7       	in	r29, 0x3e	; 62
     3f4:	6f 97       	sbiw	r28, 0x1f	; 31
     3f6:	0f b6       	in	r0, 0x3f	; 63
     3f8:	f8 94       	cli
     3fa:	de bf       	out	0x3e, r29	; 62
     3fc:	0f be       	out	0x3f, r0	; 63
     3fe:	cd bf       	out	0x3d, r28	; 61
     400:	8e 01       	movw	r16, r28
     402:	0f 5f       	subi	r16, 0xFF	; 255
     404:	1f 4f       	sbci	r17, 0xFF	; 255
     406:	f8 01       	movw	r30, r16
     408:	8f e0       	ldi	r24, 0x0F	; 15
	uint8_t i,buffer[16];
    struct MMC_VOLUME_INFO vinf;
    
	for(i=0;i<16;i++)buffer[i]=0;
     40a:	11 92       	st	Z+, r1
     40c:	81 50       	subi	r24, 0x01	; 1
     40e:	87 ff       	sbrs	r24, 7
     410:	fc cf       	rjmp	.-8      	; 0x40a <MMC_get_volume_info+0x22>
	Read_CSD_MMC(buffer);
     412:	ce 01       	movw	r24, r28
     414:	01 96       	adiw	r24, 0x01	; 1
     416:	0e 94 c9 01 	call	0x392 <Read_CSD_MMC>
	
	vinf.sector_count=buffer[6]&0x03;
     41a:	8f 81       	ldd	r24, Y+7	; 0x07
     41c:	99 27       	eor	r25, r25
     41e:	aa 27       	eor	r26, r26
     420:	bb 27       	eor	r27, r27
     422:	83 70       	andi	r24, 0x03	; 3
     424:	90 70       	andi	r25, 0x00	; 0
     426:	a0 70       	andi	r26, 0x00	; 0
     428:	b0 70       	andi	r27, 0x00	; 0
	vinf.sector_count<<=8;
     42a:	22 27       	eor	r18, r18
     42c:	38 2f       	mov	r19, r24
     42e:	49 2f       	mov	r20, r25
     430:	5a 2f       	mov	r21, r26
	vinf.sector_count+=buffer[7];
     432:	88 85       	ldd	r24, Y+8	; 0x08
     434:	28 0f       	add	r18, r24
     436:	31 1d       	adc	r19, r1
     438:	41 1d       	adc	r20, r1
     43a:	51 1d       	adc	r21, r1
	vinf.sector_count<<=2;
     43c:	f2 e0       	ldi	r31, 0x02	; 2
     43e:	22 0f       	add	r18, r18
     440:	33 1f       	adc	r19, r19
     442:	44 1f       	adc	r20, r20
     444:	55 1f       	adc	r21, r21
     446:	fa 95       	dec	r31
     448:	d1 f7       	brne	.-12     	; 0x43e <MMC_get_volume_info+0x56>
	vinf.sector_count+=(buffer[8]&0xc0)>>6;
     44a:	89 85       	ldd	r24, Y+9	; 0x09
     44c:	99 27       	eor	r25, r25
     44e:	e6 e0       	ldi	r30, 0x06	; 6
     450:	96 95       	lsr	r25
     452:	87 95       	ror	r24
     454:	ea 95       	dec	r30
     456:	e1 f7       	brne	.-8      	; 0x450 <MMC_get_volume_info+0x68>
     458:	aa 27       	eor	r26, r26
     45a:	97 fd       	sbrc	r25, 7
     45c:	a0 95       	com	r26
     45e:	ba 2f       	mov	r27, r26
     460:	28 0f       	add	r18, r24
     462:	39 1f       	adc	r19, r25
     464:	4a 1f       	adc	r20, r26
     466:	5b 1f       	adc	r21, r27
     468:	2e 8b       	std	Y+22, r18	; 0x16
     46a:	3f 8b       	std	Y+23, r19	; 0x17
     46c:	48 8f       	std	Y+24, r20	; 0x18
     46e:	59 8f       	std	Y+25, r21	; 0x19
		
	vinf.sector_multiply=buffer[9]&0x03;
     470:	6a 85       	ldd	r22, Y+10	; 0x0a
     472:	63 70       	andi	r22, 0x03	; 3
	vinf.sector_multiply<<=1;
     474:	66 0f       	add	r22, r22
	vinf.sector_multiply+=(buffer[10]&0x80)>>7;
     476:	8b 85       	ldd	r24, Y+11	; 0x0b
     478:	99 27       	eor	r25, r25
     47a:	88 0f       	add	r24, r24
     47c:	89 2f       	mov	r24, r25
     47e:	88 1f       	adc	r24, r24
     480:	99 0b       	sbc	r25, r25
     482:	91 95       	neg	r25
     484:	68 0f       	add	r22, r24
     486:	6d 8b       	std	Y+21, r22	; 0x15
	//SD的容量
	vinf.size_MB=vinf.sector_count>>(9-vinf.sector_multiply);
     488:	89 e0       	ldi	r24, 0x09	; 9
     48a:	90 e0       	ldi	r25, 0x00	; 0
     48c:	86 1b       	sub	r24, r22
     48e:	91 09       	sbc	r25, r1
     490:	04 c0       	rjmp	.+8      	; 0x49a <MMC_get_volume_info+0xb2>
     492:	56 95       	lsr	r21
     494:	47 95       	ror	r20
     496:	37 95       	ror	r19
     498:	27 95       	ror	r18
     49a:	8a 95       	dec	r24
     49c:	d2 f7       	brpl	.-12     	; 0x492 <MMC_get_volume_info+0xaa>
     49e:	29 8b       	std	Y+17, r18	; 0x11
     4a0:	3a 8b       	std	Y+18, r19	; 0x12
     4a2:	4b 8b       	std	Y+19, r20	; 0x13
     4a4:	5c 8b       	std	Y+20, r21	; 0x14
     4a6:	f8 01       	movw	r30, r16
     4a8:	8f e0       	ldi	r24, 0x0F	; 15

	for(i=0;i<16;i++)buffer[i]=0;
     4aa:	11 92       	st	Z+, r1
     4ac:	81 50       	subi	r24, 0x01	; 1
     4ae:	87 ff       	sbrs	r24, 7
     4b0:	fc cf       	rjmp	.-8      	; 0x4aa <MMC_get_volume_info+0xc2>
	Read_CID_MMC(buffer);
     4b2:	ce 01       	movw	r24, r28
     4b4:	01 96       	adiw	r24, 0x01	; 1
     4b6:	0e 94 9e 01 	call	0x33c <Read_CID_MMC>
     4ba:	6f 96       	adiw	r28, 0x1f	; 31
     4bc:	0f b6       	in	r0, 0x3f	; 63
     4be:	f8 94       	cli
     4c0:	de bf       	out	0x3e, r29	; 62
     4c2:	0f be       	out	0x3f, r0	; 63
     4c4:	cd bf       	out	0x3d, r28	; 61
     4c6:	df 91       	pop	r29
     4c8:	cf 91       	pop	r28
     4ca:	1f 91       	pop	r17
     4cc:	0f 91       	pop	r16
     4ce:	08 95       	ret

000004d0 <ReadBlock>:
uint16_t	BPB_FATSz16;							//FAT占用的sectors
uint32_t	BPB_HiddSec;

//-------------------------------------------------------------------------
uint8_t ReadBlock(uint32_t LBA){					//绝对地址读一个扇区
     4d0:	ef 92       	push	r14
     4d2:	ff 92       	push	r15
     4d4:	0f 93       	push	r16
     4d6:	1f 93       	push	r17
     4d8:	7b 01       	movw	r14, r22
     4da:	8c 01       	movw	r16, r24
	mmcReset();
     4dc:	0e 94 11 01 	call	0x222 <mmcReset>
	if(mmcRead(LBA,BUFFER)!=0)return SD_FAIL;
     4e0:	42 eb       	ldi	r20, 0xB2	; 178
     4e2:	50 e0       	ldi	r21, 0x00	; 0
     4e4:	c8 01       	movw	r24, r16
     4e6:	b7 01       	movw	r22, r14
     4e8:	0e 94 21 01 	call	0x242 <mmcRead>
     4ec:	88 23       	and	r24, r24
     4ee:	19 f0       	breq	.+6      	; 0x4f6 <ReadBlock+0x26>
     4f0:	81 e0       	ldi	r24, 0x01	; 1
     4f2:	90 e0       	ldi	r25, 0x00	; 0
     4f4:	02 c0       	rjmp	.+4      	; 0x4fa <ReadBlock+0x2a>
	return SD_SUCC;
     4f6:	80 e0       	ldi	r24, 0x00	; 0
     4f8:	90 e0       	ldi	r25, 0x00	; 0
     4fa:	1f 91       	pop	r17
     4fc:	0f 91       	pop	r16
     4fe:	ff 90       	pop	r15
     500:	ef 90       	pop	r14
     502:	08 95       	ret

00000504 <WriteBlock>:
}
//-------------------------------------------------------------------------
uint8_t WriteBlock(uint32_t LBA){					//绝对地址写一个扇区
     504:	ef 92       	push	r14
     506:	ff 92       	push	r15
     508:	0f 93       	push	r16
     50a:	1f 93       	push	r17
     50c:	7b 01       	movw	r14, r22
     50e:	8c 01       	movw	r16, r24
	mmcReset();
     510:	0e 94 11 01 	call	0x222 <mmcReset>
	if(mmcWrite(LBA,BUFFER)!=0)return SD_FAIL;
     514:	42 eb       	ldi	r20, 0xB2	; 178
     516:	50 e0       	ldi	r21, 0x00	; 0
     518:	c8 01       	movw	r24, r16
     51a:	b7 01       	movw	r22, r14
     51c:	0e 94 57 01 	call	0x2ae <mmcWrite>
     520:	88 23       	and	r24, r24
     522:	19 f0       	breq	.+6      	; 0x52a <WriteBlock+0x26>
     524:	81 e0       	ldi	r24, 0x01	; 1
     526:	90 e0       	ldi	r25, 0x00	; 0
     528:	02 c0       	rjmp	.+4      	; 0x52e <WriteBlock+0x2a>
	return SD_SUCC;
     52a:	80 e0       	ldi	r24, 0x00	; 0
     52c:	90 e0       	ldi	r25, 0x00	; 0
     52e:	1f 91       	pop	r17
     530:	0f 91       	pop	r16
     532:	ff 90       	pop	r15
     534:	ef 90       	pop	r14
     536:	08 95       	ret

00000538 <ReadFatBlock>:
}
//-------------------------------------------------------------------------
uint8_t ReadFatBlock(uint32_t Add){					//逻辑地址读一个扇区
     538:	dc 01       	movw	r26, r24
     53a:	cb 01       	movw	r24, r22
	return ReadBlock(Add+PB_RelativeSector);
     53c:	20 91 b4 02 	lds	r18, 0x02B4
     540:	82 0f       	add	r24, r18
     542:	91 1d       	adc	r25, r1
     544:	a1 1d       	adc	r26, r1
     546:	b1 1d       	adc	r27, r1
     548:	bc 01       	movw	r22, r24
     54a:	cd 01       	movw	r24, r26
     54c:	0e 94 68 02 	call	0x4d0 <ReadBlock>
}
     550:	99 27       	eor	r25, r25
     552:	08 95       	ret

00000554 <WriteFatBlock>:
//-------------------------------------------------------------------------
uint8_t WriteFatBlock(uint32_t Add){				//逻辑地址写一个扇区
     554:	dc 01       	movw	r26, r24
     556:	cb 01       	movw	r24, r22
	return WriteBlock(Add+PB_RelativeSector);
     558:	20 91 b4 02 	lds	r18, 0x02B4
     55c:	82 0f       	add	r24, r18
     55e:	91 1d       	adc	r25, r1
     560:	a1 1d       	adc	r26, r1
     562:	b1 1d       	adc	r27, r1
     564:	bc 01       	movw	r22, r24
     566:	cd 01       	movw	r24, r26
     568:	0e 94 82 02 	call	0x504 <WriteBlock>
}
     56c:	99 27       	eor	r25, r25
     56e:	08 95       	ret

00000570 <CopyBytes>:
//-------------------------------------------------------------------------
void CopyBytes(uint8_t *ps,uint8_t *pd,uint16_t size){	//内存拷贝
     570:	dc 01       	movw	r26, r24
     572:	fb 01       	movw	r30, r22
	for(;size;size--)*pd++=*ps++;
     574:	41 15       	cp	r20, r1
     576:	51 05       	cpc	r21, r1
     578:	29 f0       	breq	.+10     	; 0x584 <CopyBytes+0x14>
     57a:	8d 91       	ld	r24, X+
     57c:	81 93       	st	Z+, r24
     57e:	41 50       	subi	r20, 0x01	; 1
     580:	50 40       	sbci	r21, 0x00	; 0
     582:	f8 cf       	rjmp	.-16     	; 0x574 <CopyBytes+0x4>
     584:	08 95       	ret

00000586 <IsEqual>:
}
//-------------------------------------------------------------------------
uint8_t IsEqual(uint8_t *pa,uint8_t *pb,uint8_t size){	//内存比较
     586:	dc 01       	movw	r26, r24
     588:	fb 01       	movw	r30, r22
	for(;size;size--)if(*pa++!=*pb++)return 0;
     58a:	44 23       	and	r20, r20
     58c:	49 f0       	breq	.+18     	; 0x5a0 <IsEqual+0x1a>
     58e:	91 91       	ld	r25, Z+
     590:	8d 91       	ld	r24, X+
     592:	89 17       	cp	r24, r25
     594:	19 f0       	breq	.+6      	; 0x59c <IsEqual+0x16>
     596:	80 e0       	ldi	r24, 0x00	; 0
     598:	90 e0       	ldi	r25, 0x00	; 0
     59a:	08 95       	ret
     59c:	41 50       	subi	r20, 0x01	; 1
     59e:	f5 cf       	rjmp	.-22     	; 0x58a <IsEqual+0x4>
	return 1;
     5a0:	81 e0       	ldi	r24, 0x01	; 1
     5a2:	90 e0       	ldi	r25, 0x00	; 0
}
     5a4:	08 95       	ret

000005a6 <EmptyBytes>:
//-------------------------------------------------------------------------
void EmptyBytes(uint8_t *pd,uint16_t size){			//内存清空,因为单片机资源很紧张的,一个512的缓冲区要反复的用
     5a6:	fc 01       	movw	r30, r24
	for(;size;size--)*pd++ =0;
     5a8:	61 15       	cp	r22, r1
     5aa:	71 05       	cpc	r23, r1
     5ac:	21 f0       	breq	.+8      	; 0x5b6 <EmptyBytes+0x10>
     5ae:	11 92       	st	Z+, r1
     5b0:	61 50       	subi	r22, 0x01	; 1
     5b2:	70 40       	sbci	r23, 0x00	; 0
     5b4:	f9 cf       	rjmp	.-14     	; 0x5a8 <EmptyBytes+0x2>
     5b6:	08 95       	ret

000005b8 <ReadMBR>:
}
//-------------------------------------------------------------------------
uint8_t ReadMBR(void){									//读取MBR数据结构
	uint8_t ok;
	FAT_MBR * MBR=(FAT_MBR*)BUFFER;
	ok=ReadBlock(MBR_Sector);//已经把值存到buffer里了
     5b8:	60 e0       	ldi	r22, 0x00	; 0
     5ba:	70 e0       	ldi	r23, 0x00	; 0
     5bc:	80 e0       	ldi	r24, 0x00	; 0
     5be:	90 e0       	ldi	r25, 0x00	; 0
     5c0:	0e 94 68 02 	call	0x4d0 <ReadBlock>

⌨️ 快捷键说明

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