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

📄 sdmmc.s

📁 mp3代码 要用的干净下啊 希望用东西共享啊
💻 S
📖 第 1 页 / 共 4 页
字号:
	.dbsym r Buffer 20 pc
	.dbend
	.area lit(rom, con, rel)
L127:
	.byte 'Q,0
	.byte 0,0
	.byte 0,255
	.area text(rom, con, rel)
	.dbfile D:\桌面\mp3\sdmmc\sdmmc.c
	.dbfunc e MMC_Start_Read_Sector _MMC_Start_Read_Sector fc
;    spispeeddub -> R10
;        spimode -> y+6
;            CMD -> y+0
;           temp -> R12
;          retry -> R14
;         sector -> y+17
	.even
_MMC_Start_Read_Sector::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,7
	.dbline -1
	.dbline 541
; }
; 
; //***************************************************************************
; //Return: [0]-success or something error!
; uint8 MMC_Start_Read_Sector(uint32 sector)
; //***************************************************************************
; {  
	.dbline 544
;    uint8 retry;
;    //Command 16 is reading Blocks from MMC/SD-Card
;    uint8 CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF}; 
	ldi R24,<L127
	ldi R25,>L127
	movw R30,R28
	ldi R16,6
	ldi R17,0
	st -y,R31
	st -y,R30
	st -y,R25
	st -y,R24
	xcall asgncblk
	.dbline 548
;    uint8 temp;
;    #if !(HW_SPI_Mode) 
;    uint8 spimode,spispeeddub;
;    spimode=SPCR; 
	in R2,0xd
	std y+6,R2
	.dbline 549
;    spispeeddub=SPSR;
	in R10,0xe
	.dbline 550
;    SPCR&=~(1<<SPIE);
	cbi 0xd,7
	.dbline 554
;    #endif
; //   CLI(); //clear all interrupt.
;    //Address conversation(logic block address-->byte address)  
;    sector = sector << 9; //sector = sector * 512
	ldi R24,9
	ldi R25,0
	movw R30,R28
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsl32
	movw R30,R28
	std z+17,R16
	std z+18,R17
	std z+19,R18
	std z+20,R19
	.dbline 556
; 
;    CMD[1] = ((sector & 0xFF000000) >>24 );
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,255
	movw R30,R28
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R24,24
	ldi R25,0
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	std y+1,R16
	.dbline 557
;    CMD[2] = ((sector & 0x00FF0000) >>16 );
	ldi R20,0
	ldi R21,0
	ldi R22,255
	ldi R23,0
	movw R30,R28
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	movw R2,R4
	clr R4
	clr R5
	std y+2,R2
	.dbline 558
;    CMD[3] = ((sector & 0x0000FF00) >>8 );
	ldi R20,0
	ldi R21,255
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+17
	ldd R3,z+18
	ldd R4,z+19
	ldd R5,z+20
	and R2,R20
	and R3,R21
	and R4,R22
	and R5,R23
	ldi R24,8
	ldi R25,0
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	std y+3,R16
	.dbline 560
;    //Send Command CMD to MMC/SD-Card
;    retry=0;
	clr R14
L131:
	.dbline 562
;    do
;    {  //Retry 100 times to send command.
	.dbline 563
;       temp=Write_Command_MMC(CMD);
	movw R16,R28
	xcall _Write_Command_MMC
	mov R12,R16
	.dbline 564
;       retry++;
	inc R14
	.dbline 565
;       if(retry==100) 
	mov R24,R14
	cpi R24,100
	brne L134
	.dbline 566
;       {
	.dbline 568
; 	     #if !(HW_SPI_Mode) 
;    		 SPCR=spimode; 
	ldd R0,y+6
	out 0xd,R0
	.dbline 569
;    		 SPSR=spispeeddub;
	out 0xe,R10
	.dbline 571
;    		 #endif
;         return(READ_BLOCK_ERROR); //block write Error!
	ldi R16,4
	xjmp L126
L134:
	.dbline 573
;       }
;    }
L132:
	.dbline 574
;    while(temp!=0); 
	tst R12
	brne L131
L136:
	.dbline 578
	.dbline 578
L137:
	.dbline 578
;    			
;    //Read Start Byte form MMC/SD-Card (FEh/Start Byte)
;    //Now data is ready,you can read it out.
;    while (Read_Byte_MMC() != 0xfe){};
	xcall _Read_Byte_MMC
	cpi R16,254
	brne L136
	.dbline 578
	.dbline 579
;    MMC_Disable();
	sbi 0x18,4
	.dbline 579
	.dbline 581
;    #if !(HW_SPI_Mode) 
;    SPCR=spimode; 
	ldd R0,y+6
	out 0xd,R0
	.dbline 582
;    SPSR=spispeeddub;
	out 0xe,R10
	.dbline 584
;    #endif
;    return 0; //Open a sector successfully!
	clr R16
	.dbline -2
L126:
	adiw R28,7
	xcall pop_gset5
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r spispeeddub 10 c
	.dbsym l spimode 6 c
	.dbsym l CMD 0 A[6:6]c
	.dbsym r temp 12 c
	.dbsym r retry 14 c
	.dbsym l sector 17 l
	.dbend
	.dbfunc e MMC_get_data _MMC_get_data fV
;    spispeeddub -> R20
;        spimode -> R22
;              j -> R10,R11
;         buffer -> R12,R13
;          Bytes -> R14,R15
	.even
_MMC_get_data::
	xcall push_gset5
	movw R12,R18
	movw R14,R16
	.dbline -1
	.dbline 590
; }
; 
; //***************************************************************************
; void MMC_get_data(uint16 Bytes,uint8 *buffer) 
; //***************************************************************************
; {
	.dbline 593
;    uint16 j;
;    uint8 spimode,spispeeddub;
;    spimode=SPCR; 
	in R22,0xd
	.dbline 594
;    spispeeddub=SPSR;
	in R20,0xe
	.dbline 597
; //   SPCR&=~(1<<SPIE);
; //   CLI(); //clear all interrupt.
;    for (j=0;((j<Bytes) && (readPos<512));j++)
	clr R10
	clr R11
	xjmp L143
L140:
	.dbline 598
	.dbline 599
	xcall _Read_Byte_MMC
	movw R30,R12
	st Z+,R16
	movw R12,R30
	.dbline 600
	lds R24,_readPos
	lds R25,_readPos+1
	adiw R24,1
	sts _readPos+1,R25
	sts _readPos,R24
	.dbline 601
L141:
	.dbline 597
	movw R24,R10
	adiw R24,1
	movw R10,R24
L143:
	.dbline 597
	cp R10,R14
	cpc R11,R15
	brsh L144
	lds R24,_readPos
	lds R25,_readPos+1
	cpi R24,0
	ldi R30,2
	cpc R25,R30
	brlo L140
L144:
	.dbline 602
	lds R24,_readPos
	lds R25,_readPos+1
	cpi R24,0
	ldi R30,2
	cpc R25,R30
	brne L145
	.dbline 603
	.dbline 604
	xcall _Read_Byte_MMC
	.dbline 605
	xcall _Read_Byte_MMC
	.dbline 606
	clr R2
	clr R3
	sts _readPos+1,R3
	sts _readPos,R2
	.dbline 607
	lds R24,_sectorPos
	subi R24,255    ; addi 1
	sts _sectorPos,R24
	.dbline 608
	sts _LBA_Opened,R2
	.dbline 610
	sbi 0x18,4
	.dbline 610
	.dbline 611
	out 0xd,R22
	.dbline 612
	out 0xe,R20
	.dbline 613
L145:
	.dbline -2
L139:
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r spispeeddub 20 c
	.dbsym r spimode 22 c
	.dbsym r j 10 i
	.dbsym r buffer 12 pc
	.dbsym r Bytes 14 i
	.dbend
	.dbfunc e MMC_get_data_LBA _MMC_get_data_LBA fV
;         buffer -> y+6
;          Bytes -> y+4
;            lba -> y+0
	.even
_MMC_get_data_LBA::
	xcall push_arg4
	.dbline -1
	.dbline 619
;    {	
;       *buffer++ = Read_Byte_MMC();
;       readPos++; //read a byte,increase read position
;    }
;    if (readPos==512)  
;    {  //CRC-Bytes
;       Read_Byte_MMC();//CRC - Byte 
;       Read_Byte_MMC();//CRC - Byte
;       readPos=0;      //reset sector read offset 
;       sectorPos++;    //Need to read next sector
;       LBA_Opened=0;   //Set to 1 when a sector is opened.
;       //set MMC_Chip_Select to high (MMC/SD-Card invalid)
;       MMC_Disable();  //MMC disable
; 	  SPCR=spimode; 
;       SPSR=spispeeddub;
;    }
; }
; 
; //***************************************************************************
; void MMC_get_data_LBA(uint32 lba, uint16 Bytes,uint8 *buffer)
; //***************************************************************************
; { //get data from lba address of MMC/SD-Card
	.dbline 621
;   //If a new sector has to be read then move head
;   if (readPos==0) MMC_Start_Read_Sector(lba); 
	lds R2,_readPos
	lds R3,_readPos+1
	tst R2
	brne L148
	tst R3
	brne L148
X0:
	.dbline 621
	movw R30,R28
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	xcall _MMC_Start_Read_Sector
L148:
	.dbline 622
;   MMC_get_data(Bytes,buffer);
	ldd R18,y+6
	ldd R19,y+7
	ldd R16,y+4
	ldd R17,y+5
	xcall _MMC_get_data
	.dbline -2
L147:
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l buffer 6 pc
	.dbsym l Bytes 4 i
	.dbsym l lba 0 l
	.dbend
	.dbfunc e MMC_GotoSectorOffset _MMC_GotoSectorOffset fV
;           temp -> y+4
;         offset -> R20,R21
;            LBA -> y+7
	.even
_MMC_GotoSectorOffset::
	xcall push_arg4
	xcall push_gset1
	sbiw R28,5
	ldd R20,y+11
	ldd R21,y+12
	.dbline -1
	.dbline 628
; }
; 
; //***************************************************************************
; void MMC_GotoSectorOffset(uint32 LBA,uint16 offset)
; //***************************************************************************
; {  
	.dbline 631
;    //Find the offset in the sector
;    uint8 temp[1];
;    MMC_LBA_Close(); //close MMC when read a new sector(readPos=0)
	xcall _MMC_LBA_Close
	xjmp L152
L151:
	.dbline 632
	movw R24,R28
	adiw R24,4
	std y+3,R25
	std y+2,R24
	ldi R24,1
	ldi R25,0
	std y+1,R25
	std y+0,R24
	movw R30,R28
	ldd R16,z+7
	ldd R17,z+8
	ldd R18,z+9
	ldd R19,z+10
	xcall _MMC_get_data_LBA
L152:
	.dbline 632
;    while (readPos<offset) MMC_get_data_LBA(LBA,1,temp); //go to offset  
	lds R2,_readPos
	lds R3,_readPos+1
	cp R2,R20
	cpc R3,R21
	brlo L151
	.dbline -2
L150:
	adiw R28,5
	xcall pop_gset1
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym l temp 4 A[1:1]c
	.dbsym r offset 20 i
	.dbsym l LBA 7 l
	.dbend
	.dbfunc e MMC_LBA_Close _MMC_LBA_Close fV
;           temp -> y+0
	.even
_MMC_LBA_Close::
	xcall push_gset2
	sbiw R28,1
	.dbline -1
	.dbline 638
; }
; 
; //***************************************************************************
; void MMC_LBA_Close(void)
; //***************************************************************************
; {  
	xjmp L156
L155:
	.dbline 641
	.dbline 642
	movw R18,R28
	ldi R16,1
	ldi R17,0
	xcall _MMC_get_data
	.dbline 643
L156:
	.dbline 640
;    uint8 temp[1];
;    while((readPos!=0x00)|(LBA_Opened==1))
	lds R2,_readPos
	lds R3,_readPos+1
	tst R2
	brne X1
	tst R3
	breq L158
X1:
	ldi R22,1
	ldi R23,0
	xjmp L159
L158:
	clr R22
	clr R23
L159:
	lds R24,_LBA_Opened
	cpi R24,1
	brne L160
	ldi R20,1
	ldi R21,0
	xjmp L161
L160:
	clr R20
	clr R21
L161:
	movw R2,R22
	or R2,R20
	or R3,R21
	tst R2
	brne L155
	tst R3
	brne L155
X2:
	.dbline -2
L154:
	adiw R28,1
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l temp 0 A[1:1]c
	.dbend
	.dbfunc e delay_us _delay_us fV
;         number -> R10
;              i -> R12
;             us -> R10
	.even
_delay_us::
	xcall push_gset4
	mov R10,R16
	.dbline -1
	.dbline 648
;    { //read MMC till readPos==0x00
;      MMC_get_data(1, temp); //dummy read,temp is a valid data.
;    }  
; }
; 
; 
; void delay_us(uint8 us)
; {
	.dbline 650
; uint8 number,i;
; number=us*(F_CPU/1000000);
	mov R2,R10
	clr R3
	clr R4
	clr R5
	ldi R20,14
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32s
	mov R10,R16
	.dbline 651
; for(i=0;i<number;i++)
	clr R12
	xjmp L166
L163:
	.dbline 652
	.dbline 653
	nop
	.dbline 654
L164:
	.dbline 651
	inc R12
L166:
	.dbline 651
	cp R12,R10
	brlo L163
	.dbline -2
L162:
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r number 10 c
	.dbsym r i 12 c
	.dbsym r us 10 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\桌面\mp3\sdmmc\sdmmc.c
_Init_Flag::
	.blkb 1
	.dbsym e Init_Flag _Init_Flag c

⌨️ 快捷键说明

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