📄 sdmmc.s
字号:
.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 + -