📄 sd.s
字号:
.dbline 130
; {
; *Buffer++ = SPI_ReadByte();
; // put_c(*Buffer);
; }
;
; //CRC-Byte
; SPI_ReadByte();//CRC - Byte
rcall _SPI_ReadByte
.dbline 131
; SPI_ReadByte();//CRC - Byte
rcall _SPI_ReadByte
.dbline 134
;
; //set MMC_Chip_Select to high (MMC/SD-Card invalid)
; SD_Disable();
sbi 0x18,4
.dbline 135
; return READ_BLOCK_OK;
clr R16
.dbline -2
L40:
rcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r retry 20 c
.dbsym r temp 22 c
.dbsym r i 22 i
.dbsym r Bytes 10 i
.dbsym r Buffer 12 pc
.dbsym r CMD 14 pc
.dbend
.area lit(rom, con, rel)
L54:
.byte 'Q,0
.byte 0,0
.byte 0,255
.area text(rom, con, rel)
.dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
.dbfunc e SD_read_sector _SD_read_sector fc
; CMD -> y+2
; Buffer -> y+16
; addr -> y+12
.even
_SD_read_sector::
rcall push_arg4
rcall push_gset2
sbiw R28,8
.dbline -1
.dbline 143
; }
;
; //****************************************************************************
; //Routine for writing a Block(512Byte) to MMC/SD-Card
; //Return 0 if sector writing is completed.
; uint8 SD_read_sector(uint32 addr,uint8 *Buffer)
; //****************************************************************************
; {
.dbline 145
; //Command 16 is reading Blocks from MMC/SD-Card
; uint8 CMD[] = {0x51,0x00,0x00,0x00,0x00,0xFF};
ldi R24,<L54
ldi R25,>L54
movw R30,R28
adiw R30,2
ldi R16,6
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 147
;
; asm("cli"); //clear all interrupt.
cli
.dbline 149
; //Address conversation(logic block address-->byte address)
; addr = addr << 9; //addr = addr * 512
ldi R24,9
ldi R25,0
movw R30,R28
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
st -y,R24
movw R16,R2
movw R18,R4
rcall lsl32
movw R30,R28
std z+12,R16
std z+13,R17
std z+14,R18
std z+15,R19
.dbline 151
;
; CMD[1] = ((addr & 0xFF000000) >>24 );
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,255
movw R30,R28
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
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
rcall lsr32
std y+3,R16
.dbline 152
; CMD[2] = ((addr & 0x00FF0000) >>16 );
ldi R20,0
ldi R21,0
ldi R22,255
ldi R23,0
movw R30,R28
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R2,R4
clr R4
clr R5
std y+4,R2
.dbline 153
; CMD[3] = ((addr & 0x0000FF00) >>8 );
ldi R20,0
ldi R21,255
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
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
rcall lsr32
std y+5,R16
.dbline 155
;
; return SD_Read_Block(CMD, Buffer, 512);
ldi R24,512
ldi R25,2
std y+1,R25
std y+0,R24
ldd R18,y+16
ldd R19,y+17
movw R16,R28
subi R16,254 ; offset = 2
sbci R17,255
rcall _SD_Read_Block
.dbline -2
L53:
adiw R28,8
rcall pop_gset2
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l CMD 2 A[6:6]c
.dbsym l Buffer 16 pc
.dbsym l addr 12 l
.dbend
.area lit(rom, con, rel)
L59:
.byte 'X,0
.byte 0,0
.byte 0,255
.area text(rom, con, rel)
.dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
.dbfunc e SD_write_sector _SD_write_sector fc
; retry -> R10
; CMD -> y+0
; tmp -> R14
; i -> R12,R13
; Buffer -> y+20
; addr -> y+16
.even
_SD_write_sector::
rcall push_arg4
rcall push_gset5
sbiw R28,6
.dbline -1
.dbline 160
;
; }
; uint8 SD_write_sector(uint32 addr,uint8 *Buffer)
; //****************************************************************************
; {
.dbline 164
; uint8 tmp,retry;
; uint16 i;
; //Command 24 is a writing blocks command for MMC/SD-Card.
; uint8 CMD[] = {0x58,0x00,0x00,0x00,0x00,0xFF};
ldi R24,<L59
ldi R25,>L59
movw R30,R28
ldi R16,6
ldi R17,0
st -y,R31
st -y,R30
st -y,R25
st -y,R24
rcall asgncblk
.dbline 166
;
; asm("cli"); //clear all interrupt.
cli
.dbline 167
; addr = addr << 9; //addr = addr * 512
ldi R24,9
ldi R25,0
movw R30,R28
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
st -y,R24
movw R16,R2
movw R18,R4
rcall lsl32
movw R30,R28
std z+16,R16
std z+17,R17
std z+18,R18
std z+19,R19
.dbline 169
;
; CMD[1] = ((addr & 0xFF000000) >>24 );
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,255
movw R30,R28
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
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
rcall lsr32
std y+1,R16
.dbline 170
; CMD[2] = ((addr & 0x00FF0000) >>16 );
ldi R20,0
ldi R21,0
ldi R22,255
ldi R23,0
movw R30,R28
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
and R2,R20
and R3,R21
and R4,R22
and R5,R23
movw R2,R4
clr R4
clr R5
std y+2,R2
.dbline 171
; CMD[3] = ((addr & 0x0000FF00) >>8 );
ldi R20,0
ldi R21,255
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+16
ldd R3,z+17
ldd R4,z+18
ldd R5,z+19
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
rcall lsr32
std y+3,R16
.dbline 174
;
; //Send Command CMD24 to MMC/SD-Card (Write 1 Block/512 Bytes)
; retry=0;
clr R10
L63:
.dbline 176
; do
; { //Retry 100 times to send command.
.dbline 177
; tmp = Write_Command_SD(CMD);
movw R16,R28
rcall _Write_Command_SD
mov R14,R16
.dbline 178
; if(retry++ == 100)
mov R2,R10
clr R3
mov R24,R2
subi R24,255 ; addi 1
mov R10,R24
mov R24,R2
cpi R24,100
brne L66
.dbline 179
; return(tmp); //send commamd Error!
rjmp L58
L66:
.dbline 180
; }
L64:
.dbline 181
; while(tmp != 0);
tst R14
brne L63
.dbline 184
;
; //Before writing,send 100 clock to MMC/SD-Card
; for (i = 0; i < 100; i++)
clr R12
clr R13
rjmp L71
L68:
.dbline 185
rcall _SPI_ReadByte
L69:
.dbline 184
movw R24,R12
adiw R24,1
movw R12,R24
L71:
.dbline 184
movw R24,R12
cpi R24,100
ldi R30,0
cpc R25,R30
brlo L68
.dbline 188
; SPI_ReadByte();
;
; //Send Start Byte to MMC/SD-Card
; SPI_TransferByte(0xFE);
ldi R16,254
rcall _SPI_TransferByte
.dbline 191
;
; //Now send real data Bolck (512Bytes) to MMC/SD-Card
; for (i = 0; i < 512; i++)
clr R12
clr R13
rjmp L75
L72:
.dbline 192
ldd R30,y+20
ldd R31,y+21
ld R16,Z+
std y+21,R31
std y+20,R30
rcall _SPI_TransferByte
L73:
.dbline 191
movw R24,R12
adiw R24,1
movw R12,R24
L75:
.dbline 191
movw R24,R12
cpi R24,0
ldi R30,2
cpc R25,R30
brlo L72
.dbline 195
; SPI_TransferByte(*Buffer++); //send 512 bytes to Card
;
; //CRC-Byte
; SPI_TransferByte(0xFF); //Dummy CRC
ldi R16,255
rcall _SPI_TransferByte
.dbline 196
; SPI_TransferByte(0xFF); //CRC Code
ldi R16,255
rcall _SPI_TransferByte
.dbline 199
;
;
; tmp=SPI_ReadByte(); // read response
rcall _SPI_ReadByte
mov R14,R16
.dbline 200
; if((tmp & 0x1F) != 0x05) // data block accepted ?
mov R24,R14
andi R24,31
cpi R24,5
breq L79
.dbline 201
; {
.dbline 202
; SD_Disable();
sbi 0x18,4
.dbline 203
; return WRITE_BLOCK_ERROR; //Error!
ldi R16,3
rjmp L58
L78:
.dbline 206
.dbline 206
L79:
.dbline 206
; }
; //Wait till MMC/SD-Card is not busy
; while (SPI_ReadByte() != 0xFF){};
rcall _SPI_ReadByte
cpi R16,255
brne L78
.dbline 206
.dbline 209
;
; //set MMC_Chip_Select to high (MMC/SD-Card Invalid)
; SD_Disable();
sbi 0x18,4
.dbline 210
; return 0;
clr R16
.dbline -2
L58:
adiw R28,6
rcall pop_gset5
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r retry 10 c
.dbsym l CMD 0 A[6:6]c
.dbsym r tmp 14 c
.dbsym r i 12 i
.dbsym l Buffer 20 pc
.dbsym l addr 16 l
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -