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

📄 sd_lib.lss

📁 实现了avr下对sd卡的读写,支持文件存取,删除的功能
💻 LSS
📖 第 1 页 / 共 5 页
字号:

SD_lib.elf:     file format elf32-avr

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00001056  00000000  00000000  00000094  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000044  00800060  00001056  000010ea  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000211  008000a4  008000a4  0000112e  2**0
                  ALLOC
  3 .noinit       00000000  008002b5  008002b5  0000112e  2**0
                  CONTENTS
  4 .eeprom       00000000  00810000  00810000  0000112e  2**0
                  CONTENTS
  5 .stab         00002448  00000000  00000000  00001130  2**2
                  CONTENTS, READONLY, DEBUGGING
  6 .stabstr      00001b6f  00000000  00000000  00003578  2**0
                  CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:

00000000 <__vectors>:
       0:	0c 94 2a 00 	jmp	0x54 <__ctors_end>
       4:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
       8:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
       c:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      10:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      14:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      18:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      1c:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      20:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      24:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      28:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      2c:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      30:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      34:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      38:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      3c:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      40:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      44:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      48:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      4c:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>
      50:	0c 94 45 00 	jmp	0x8a <__bad_interrupt>

00000054 <__ctors_end>:
      54:	11 24       	eor	r1, r1
      56:	1f be       	out	0x3f, r1	; 63
      58:	cf e5       	ldi	r28, 0x5F	; 95
      5a:	d8 e0       	ldi	r29, 0x08	; 8
      5c:	de bf       	out	0x3e, r29	; 62
      5e:	cd bf       	out	0x3d, r28	; 61

00000060 <__do_copy_data>:
      60:	10 e0       	ldi	r17, 0x00	; 0
      62:	a0 e6       	ldi	r26, 0x60	; 96
      64:	b0 e0       	ldi	r27, 0x00	; 0
      66:	e6 e5       	ldi	r30, 0x56	; 86
      68:	f0 e1       	ldi	r31, 0x10	; 16
      6a:	02 c0       	rjmp	.+4      	; 0x70 <.do_copy_data_start>

0000006c <.do_copy_data_loop>:
      6c:	05 90       	lpm	r0, Z+
      6e:	0d 92       	st	X+, r0

00000070 <.do_copy_data_start>:
      70:	a4 3a       	cpi	r26, 0xA4	; 164
      72:	b1 07       	cpc	r27, r17
      74:	d9 f7       	brne	.-10     	; 0x6c <.do_copy_data_loop>

00000076 <__do_clear_bss>:
      76:	12 e0       	ldi	r17, 0x02	; 2
      78:	a4 ea       	ldi	r26, 0xA4	; 164
      7a:	b0 e0       	ldi	r27, 0x00	; 0
      7c:	01 c0       	rjmp	.+2      	; 0x80 <.do_clear_bss_start>

0000007e <.do_clear_bss_loop>:
      7e:	1d 92       	st	X+, r1

00000080 <.do_clear_bss_start>:
      80:	a5 3b       	cpi	r26, 0xB5	; 181
      82:	b1 07       	cpc	r27, r17
      84:	e1 f7       	brne	.-8      	; 0x7e <.do_clear_bss_loop>
      86:	0c 94 52 00 	jmp	0xa4 <main>

0000008a <__bad_interrupt>:
      8a:	0c 94 00 00 	jmp	0x0 <__heap_end>

0000008e <port_init>:
#include	"main.h"
#include	"mmc.h"
#include	"FAT16.h"
//-------------------------------------------------------------------------
void port_init(void){
      8e:	08 95       	ret

00000090 <ioinit>:
}
//-------------------------------------------------------------------------
void ioinit(void){
	cli(); 				//disable all interrupts
      90:	f8 94       	cli
	port_init();
	mmcInit();
      92:	0e 94 94 00 	call	0x128 <mmcInit>
	InitFat16();
      96:	0e 94 9a 07 	call	0xf34 <InitFat16>
	
	MCUCR = 0x00;//MCU控制寄存器MCUCR ,控制寄存器包含了电源管理的控制位,休眠模式选择位 2、1 ,Bit 6 – SE: 休眠使能
      9a:	15 be       	out	0x35, r1	; 53
	GICR  = 0x00;//中断控制寄存器GICR 
      9c:	1b be       	out	0x3b, r1	; 59
	TIMSK = 0x00;////timer interrupt sources 
      9e:	19 be       	out	0x39, r1	; 57
	sei(); 				//re-enable interrupts
      a0:	78 94       	sei
      a2:	08 95       	ret

000000a4 <main>:
}
//-------------------------------------------------------------------------
int main(void){
      a4:	ce e1       	ldi	r28, 0x1E	; 30
      a6:	d8 e0       	ldi	r29, 0x08	; 8
      a8:	de bf       	out	0x3e, r29	; 62
      aa:	cd bf       	out	0x3d, r28	; 61
	uint8_t ok;
	uint8_t Name[11]="SD_FAT16TXT";
      ac:	6e 01       	movw	r12, r28
      ae:	08 94       	sec
      b0:	c1 1c       	adc	r12, r1
      b2:	d1 1c       	adc	r13, r1
      b4:	8b e0       	ldi	r24, 0x0B	; 11
      b6:	e0 e6       	ldi	r30, 0x60	; 96
      b8:	f0 e0       	ldi	r31, 0x00	; 0
      ba:	d6 01       	movw	r26, r12
      bc:	01 90       	ld	r0, Z+
      be:	0d 92       	st	X+, r0
      c0:	8a 95       	dec	r24
      c2:	e1 f7       	brne	.-8      	; 0xbc <main+0x18>
	uint8_t buffer[54]=
      c4:	8e 01       	movw	r16, r28
      c6:	04 5f       	subi	r16, 0xF4	; 244
      c8:	1f 4f       	sbci	r17, 0xFF	; 255
      ca:	86 e3       	ldi	r24, 0x36	; 54
      cc:	ec e6       	ldi	r30, 0x6C	; 108
      ce:	f0 e0       	ldi	r31, 0x00	; 0
      d0:	d8 01       	movw	r26, r16
      d2:	01 90       	ld	r0, Z+
      d4:	0d 92       	st	X+, r0
      d6:	8a 95       	dec	r24
      d8:	e1 f7       	brne	.-8      	; 0xd2 <main+0x2e>
		"If you look this content,the file was created success!";//这个 buffer和BUFFER不是同一个
	
	ioinit();
      da:	0e 94 48 00 	call	0x90 <ioinit>
	
	ok=CreateFile(Name,(uint32_t)54);				//建立长度为54的空文件,然后在去 找到这个文件名的 位置写上去
      de:	46 e3       	ldi	r20, 0x36	; 54
      e0:	50 e0       	ldi	r21, 0x00	; 0
      e2:	60 e0       	ldi	r22, 0x00	; 0
      e4:	70 e0       	ldi	r23, 0x00	; 0
      e6:	c6 01       	movw	r24, r12
      e8:	0e 94 42 05 	call	0xa84 <CreateFile>
	if(ok==SD_FAIL)return 1;						//文件已存在,退出
      ec:	81 30       	cpi	r24, 0x01	; 1
      ee:	61 f0       	breq	.+24     	; 0x108 <main+0x64>
	
	WriteFile(Name,(uint32_t)0,(uint32_t)54,buffer);	//将buffer写入文件,这里的从头写到尾
      f0:	78 01       	movw	r14, r16
      f2:	06 e3       	ldi	r16, 0x36	; 54
      f4:	10 e0       	ldi	r17, 0x00	; 0
      f6:	20 e0       	ldi	r18, 0x00	; 0
      f8:	30 e0       	ldi	r19, 0x00	; 0
      fa:	40 e0       	ldi	r20, 0x00	; 0
      fc:	50 e0       	ldi	r21, 0x00	; 0
      fe:	60 e0       	ldi	r22, 0x00	; 0
     100:	70 e0       	ldi	r23, 0x00	; 0
     102:	c6 01       	movw	r24, r12
     104:	0e 94 b9 06 	call	0xd72 <WriteFile>
	/*
	for(i=0;i<54;i++)buffer[i]=0;
	ReadFile(Name,(uint32_t)0,(uint32_t)54,buffer);	//将文件读入buffer
	
	EreaseFile(Name);								//删除文件
	*/
	return 1;
}
     108:	81 e0       	ldi	r24, 0x01	; 1
     10a:	90 e0       	ldi	r25, 0x00	; 0
     10c:	0c 94 2a 08 	jmp	0x1054 <_exit>

00000110 <spiInit>:
#define	MISO		PB6
#define	SCK			PB7
//-------------------------------------------------------------------------
void spiInit(){
	DDRB|=(_BV(SS)|_BV(MOSI)|_BV(SCK));	
     110:	87 b3       	in	r24, 0x17	; 23
     112:	80 6b       	ori	r24, 0xB0	; 176
     114:	87 bb       	out	0x17, r24	; 23
	SPCR=_BV(SPE)|_BV(MSTR);						// master mode
     116:	80 e5       	ldi	r24, 0x50	; 80
     118:	8d b9       	out	0x0d, r24	; 13
     11a:	08 95       	ret

0000011c <spiTransferByte>:
}
//-------------------------------------------------------------------------
uint8_t spiTransferByte(uint8_t data){
	SPDR=data;
     11c:	8f b9       	out	0x0f, r24	; 15
	while((SPSR&_BV(SPIF))==0);
     11e:	77 9b       	sbis	0x0e, 7	; 14
     120:	fe cf       	rjmp	.-4      	; 0x11e <spiTransferByte+0x2>
	return SPDR;
     122:	8f b1       	in	r24, 0x0f	; 15
}
     124:	99 27       	eor	r25, r25
     126:	08 95       	ret

00000128 <mmcInit>:
#define	CSL			PORTB&=~_BV(CS)

//-------------------------------------------------------------------------
void mmcInit(void){	
	spiInit();					// initialize SPI interface	
     128:	0e 94 88 00 	call	0x110 <spiInit>
	DDRB|=_BV(PB4);				// release chip select,low power selcet
     12c:	bc 9a       	sbi	0x17, 4	; 23
	CSH;
     12e:	c4 9a       	sbi	0x18, 4	; 24
     130:	08 95       	ret

00000132 <mmcCommand>:
}
//-------------------------------------------------------------------------
uint8_t mmcReset_1(void){
	uint8_t i,retry,r1;

	retry=0;
	do{
		for(i=0;i<10;i++) spiTransferByte(0xFF);	//send dummy at CS high(dummy argument又叫哑元变量 )	
		r1=mmcSendCommand(MMC_GO_IDLE_STATE, 0);	// resetting card
		retry++;
		if(retry>10) return -1;
	} while(r1 != MMC_R1_IDLE_STATE);

	retry=0;
	do{			
		r1=mmcSendCommand(MMC_SEND_OP_COND, 0);	// initializing card
		retry++;
		if(retry>100) return -1;
	} while(r1!=0);

	mmcSendCommand(MMC_CRC_ON_OFF, 0);			// turn off CRC checking
	mmcSendCommand(MMC_SET_BLOCKLEN, 512);		// set block len 512 bytes

	return 0;
}
//-------------------------------------------------------------------------
uint8_t mmcReset(void){
	uint8_t i;
	for(i=0;i<50;i++)if(mmcReset_1()==0)return 0;
	return -1;
}
//-------------------------------------------------------------------------
uint8_t mmcSendCommand(uint8_t cmd, uint32_t arg){
	uint8_t r1;

	CSL;											// assert chip select	
	r1 = mmcCommand(cmd, arg);						// issue the command
	CSH;											// release chip select
	return r1;
}
//-------------------------------------------------------------------------
uint8_t mmcRead(uint32_t sector, uint8_t* buffer ){
	uint8_t r1;
	uint16_t i;

	CSL;											// assert chip select	
	r1 = mmcCommand(MMC_READ_SINGLE_BLOCK, sector<<9);	// issue command,argument is the data address,the sector contains 512Byte,so leftshift 9bits,so the sector is just the serial number
	if(r1 != 0)return r1;	
	while(spiTransferByte(0xFF)!=MMC_STARTBLOCK_READ);// wait for block start
	
	for(i=0; i<0x200; i++){//0x200即读了512个,2的9次
		*buffer++ = spiTransferByte(0xFF);			// read in data
	}
	
	spiTransferByte(0xFF);							// read 16-bit CRC
	spiTransferByte(0xFF);							//ba crc du wan cai neng pai gan jing
	CSH;											// release chip select,you fen zhu le 
	return 0;
}
//-------------------------------------------------------------------------
uint8_t mmcWrite(uint32_t sector, uint8_t* buffer){
	uint8_t r1;
	uint16_t i;

	CSL;											// assert chip select	
	r1 = mmcCommand(MMC_WRITE_BLOCK,sector<<9);	// issue command ????????
	if(r1 != 0)return r1;	//return r1 for further judgement in subfunctions
	spiTransferByte(0xFF);							// send dummy	
	spiTransferByte(MMC_STARTBLOCK_WRITE);			// send data start token,indicate data will follow,arouse the slaver
	
	for(i=0; i<512; i++){
		spiTransferByte(*buffer++);				// write data
	}
	
	spiTransferByte(0xFF);							// write 16-bit CRC (dummy values)
	spiTransferByte(0xFF);
	
	r1 = spiTransferByte(0xFF);						// read data response token
	if((r1&MMC_DR_MASK)!=MMC_DR_ACCEPT)return r1;	//the mask get the lower five bits(Higher bits are all ones),compared with 0x05(MMC_DR_ACCEPT)
	while(!spiTransferByte(0xFF));					// wait until card not busy(wait for the high level)
	CSH;											// release chip select
	return 0;
}
//-------------------------------------------------------------------------
uint8_t mmcCommand(uint8_t cmd, uint32_t arg){
     132:	ef 92       	push	r14
     134:	ff 92       	push	r15
     136:	0f 93       	push	r16
     138:	1f 93       	push	r17
     13a:	cf 93       	push	r28
     13c:	7a 01       	movw	r14, r20
     13e:	8b 01       	movw	r16, r22
	uint8_t r1,retry=0;
     140:	c0 e0       	ldi	r28, 0x00	; 0
	spiTransferByte(cmd|0x40);						// send command
     142:	80 64       	ori	r24, 0x40	; 64
     144:	0e 94 8e 00 	call	0x11c <spiTransferByte>
	spiTransferByte(arg>>24);
     148:	81 2f       	mov	r24, r17
     14a:	99 27       	eor	r25, r25
     14c:	aa 27       	eor	r26, r26
     14e:	bb 27       	eor	r27, r27

⌨️ 快捷键说明

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