📄 sd.s
字号:
.module sd.c
.area text(rom, con, rel)
.dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
.dbfunc e SPI_ReadByte _SPI_ReadByte fc
.even
_SPI_ReadByte::
.dbline -1
.dbline 9
; #include<iom16v.h>
; #include<main.h>
; #include<sd.h>
;
;
; extern uint8 BUFFER[512];
;
; uint8 SPI_ReadByte(void)
; {
.dbline 10
; SPDR = 0xFF;
ldi R24,255
out 0xf,R24
L2:
.dbline 11
L3:
.dbline 11
; while (!(SPSR & 0x80));
sbis 0xe,7
rjmp L2
.dbline 12
; return SPDR;
in R16,0xf
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e SPI_TransferByte _SPI_TransferByte fV
; cmp1 -> R16
.even
_SPI_TransferByte::
.dbline -1
.dbline 15
; }
; void SPI_TransferByte(uint8 cmp1)
; {
.dbline 16
; SPDR=cmp1;
out 0xf,R16
L6:
.dbline 17
L7:
.dbline 17
; while(!(SPSR&(1<<SPIF)));
sbis 0xe,7
rjmp L6
.dbline -2
L5:
.dbline 0 ; func end
ret
.dbsym r cmp1 16 c
.dbend
.dbfunc e SD_Port_Init _SD_Port_Init fV
.even
_SD_Port_Init::
.dbline -1
.dbline 22
; }
;
; void SD_Port_Init(void)
; //****************************************************************************
; {
.dbline 23
; SD_PORT |= (1<<SD_SS);//(1<<SD_SCK)
sbi 0x18,4
.dbline 24
; SD_DDR |= (1<<SD_SCK)|(1<<SD_MOSI)|(1<<SD_SS);
in R24,0x17
ori R24,176
out 0x17,R24
.dbline 25
; SD_DDR &= ~(1<<SD_MISO);
cbi 0x17,6
.dbline 26
; SD_Disable();
sbi 0x18,4
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbend
.area lit(rom, con, rel)
L11:
.byte 64,0
.byte 0,0
.byte 0,149
.area text(rom, con, rel)
.dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
.dbfunc e SD_Init _SD_Init fc
; retry -> R20
; CMD -> y+0
; temp -> R22
; i -> R10
.even
_SD_Init::
rcall push_gset3
sbiw R28,6
.dbline -1
.dbline 33
; }
;
; //****************************************************************************
; //Routine for Init MMC/SD card(SPI-MODE)
; uint8 SD_Init(void)
; //****************************************************************************
; {
.dbline 37
; uint8 retry,temp;
; uint8 i;
;
; uint8 CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};
ldi R24,<L11
ldi R25,>L11
movw R30,R28
ldi R16,6
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 38
; SD_Port_Init(); //Init SPI port
rcall _SD_Port_Init
.dbline 40
clr R10
rjmp L15
L12:
.dbline 40
nop
L13:
.dbline 40
inc R10
L15:
.dbline 40
;
; for (i = 0; i < 200; i++) asm("nop"); //Wait MMC/SD ready...
mov R24,R10
cpi R24,200
brlo L12
.dbline 43
;
; //Active SPI bus at low speed
; SPCR=0x53; //SPI Master,MSB First
ldi R24,83
out 0xd,R24
.dbline 44
; SPSR=0x00; //double speed disable,Fsck=Fosc/128
clr R2
out 0xe,R2
.dbline 46
;
; for (i = 0; i < 16; i++)
clr R10
rjmp L19
L16:
.dbline 47
ldi R16,255
rcall _SPI_TransferByte
L17:
.dbline 46
inc R10
L19:
.dbline 46
mov R24,R10
cpi R24,16
brlo L16
.dbline 50
; SPI_TransferByte(0xff); //send 74 clock at least!!!
;
; //Send Command CMD0 to MMC/SD Card
; SD_Enable();
cbi 0x18,4
.dbline 51
; retry = 0;
clr R20
L20:
.dbline 53
; do
; { //retry 200 times to send CMD0 command
.dbline 54
; temp = Write_Command_SD(CMD);
movw R16,R28
rcall _Write_Command_SD
mov R22,R16
.dbline 55
; if (retry++ == 200)
mov R2,R20
clr R3
subi R20,255 ; addi 1
mov R24,R2
cpi R24,200
brne L23
.dbline 56
; return INIT_CMD0_ERROR;//CMD0 Error!
ldi R16,1
rjmp L10
L23:
.dbline 57
; }
L21:
.dbline 58
; while (temp != 1);
cpi R22,1
brne L20
.dbline 61
;
; //Send Command CMD1 to MMC/SD-Card
; CMD[0] = 0x41; //Command 1
ldi R24,65
std y+0,R24
.dbline 62
; CMD[5] = 0xFF;
ldi R24,255
std y+5,R24
.dbline 63
; retry = 0;
clr R20
L26:
.dbline 65
; do
; { //retry 100 times to send CMD1 command
.dbline 66
; temp = Write_Command_SD(CMD);
movw R16,R28
rcall _Write_Command_SD
mov R22,R16
.dbline 67
; if (retry++ == 100)
mov R2,R20
clr R3
subi R20,255 ; addi 1
mov R24,R2
cpi R24,100
brne L29
.dbline 68
; return INIT_CMD1_ERROR;//CMD1 Error!
ldi R16,2
rjmp L10
L29:
.dbline 69
; }
L27:
.dbline 70
; while (temp != 0);
tst R22
brne L26
.dbline 73
;
; //Active High-speed SPI mode(Fsck=Fosc/2)
; SPCR = 0x50;
ldi R24,80
out 0xd,R24
.dbline 74
; SPSR = 0x00;
clr R2
out 0xe,R2
.dbline 76
;
; SD_Disable(); //set MMC_Chip_Select to high
sbi 0x18,4
.dbline 77
; return INIT_OK; //All commands have been taken.
clr R16
.dbline -2
L10:
adiw R28,6
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r retry 20 c
.dbsym l CMD 0 A[6:6]c
.dbsym r temp 22 c
.dbsym r i 10 c
.dbend
.dbfunc e Write_Command_SD _Write_Command_SD fc
; retry -> R20
; i -> R22
; tmp -> R10
; cmd -> R12,R13
.even
_Write_Command_SD::
rcall push_gset4
movw R12,R16
.dbline -1
.dbline 85
; }
;
; //****************************************************************************
; //Send a Command to MMC/SD-Card
; //Return: the second byte of response register of MMC/SD-Card
; uint8 Write_Command_SD(uint8 *cmd)
; //****************************************************************************
; {
.dbline 87
; uint8 tmp,i;
; uint8 retry=0;
clr R20
.dbline 88
; SD_Disable();
sbi 0x18,4
.dbline 89
; SPI_TransferByte(0xFF);
ldi R16,255
rcall _SPI_TransferByte
.dbline 90
; SD_Enable();
cbi 0x18,4
.dbline 91
; for(i=0;i<6;i++)
clr R22
rjmp L35
L32:
.dbline 92
.dbline 93
movw R30,R12
ld R16,Z+
movw R12,R30
rcall _SPI_TransferByte
.dbline 94
L33:
.dbline 91
inc R22
L35:
.dbline 91
cpi R22,6
brlo L32
.dbline 95
; {
; SPI_TransferByte(*cmd++);
; }
; SPI_ReadByte();
rcall _SPI_ReadByte
L36:
.dbline 97
;
; do{
.dbline 98
; tmp = SPI_ReadByte();
rcall _SPI_ReadByte
mov R10,R16
.dbline 99
L37:
.dbline 99
; }while((tmp==0xff)&&(retry++ <100));
mov R24,R10
cpi R24,255
brne L39
mov R2,R20
clr R3
subi R20,255 ; addi 1
mov R24,R2
cpi R24,100
brlo L36
L39:
.dbline 100
; return(tmp);
mov R16,R10
.dbline -2
L31:
rcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r retry 20 c
.dbsym r i 22 c
.dbsym r tmp 10 c
.dbsym r cmd 12 pc
.dbend
.dbfunc e SD_Read_Block _SD_Read_Block fc
; retry -> R20
; temp -> R22
; i -> R22,R23
; Bytes -> R10,R11
; Buffer -> R12,R13
; CMD -> R14,R15
.even
_SD_Read_Block::
rcall push_gset5
movw R12,R18
movw R14,R16
ldd R10,y+10
ldd R11,y+11
.dbline -1
.dbline 105
; }
;
; uint8 SD_Read_Block(uint8 *CMD,uint8 *Buffer,uint16 Bytes)
; //****************************************************************************
; {
.dbline 110
; uint16 i;
; uint8 retry, temp;
;
; //Send Command CMD to MMC/SD-Card
; retry=0;
clr R20
L41:
.dbline 112
; do
; { //Retry 100 times to send command.
.dbline 113
; temp=Write_Command_SD(CMD);
movw R16,R14
rcall _Write_Command_SD
mov R22,R16
.dbline 114
; if(retry++ == 100)
mov R2,R20
clr R3
subi R20,255 ; addi 1
mov R24,R2
cpi R24,100
brne L44
.dbline 115
; return READ_BLOCK_ERROR; //block write Error!
ldi R16,4
rjmp L40
L44:
.dbline 116
; }
L42:
.dbline 117
; while (temp != 0);
tst R22
brne L41
L46:
.dbline 120
L47:
.dbline 120
;
; //Read Start Byte form MMC/SD-Card (FEh/Start Byte)
; while (SPI_ReadByte() != 0xfe);
rcall _SPI_ReadByte
cpi R16,254
brne L46
.dbline 123
;
; //Write blocks(normal 512Bytes) to MMC/SD-Card
; for (i = 0; i < Bytes; i++)
clr R22
clr R23
rjmp L52
L49:
.dbline 124
.dbline 125
rcall _SPI_ReadByte
movw R30,R12
st Z+,R16
movw R12,R30
.dbline 127
L50:
.dbline 123
subi R22,255 ; offset = 1
sbci R23,255
L52:
.dbline 123
cp R22,R10
cpc R23,R11
brlo L49
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -