📄 sd.lis
字号:
01EE 9201 movw R18,R4
01F0 00D0 rcall lsr32
01F2 0D83 std y+5,R16
01F4 .dbline 155
01F4 ;
01F4 ; return SD_Read_Block(CMD, Buffer, 512);
01F4 80E0 ldi R24,512
01F6 92E0 ldi R25,2
01F8 9983 std y+1,R25
01FA 8883 std y+0,R24
01FC 2889 ldd R18,y+16
01FE 3989 ldd R19,y+17
0200 8E01 movw R16,R28
0202 0E5F subi R16,254 ; offset = 2
0204 1F4F sbci R17,255
0206 76DF rcall _SD_Read_Block
0208 .dbline -2
0208 L53:
0208 2896 adiw R28,8
020A 00D0 rcall pop_gset2
020C 2496 adiw R28,4
020E .dbline 0 ; func end
020E 0895 ret
0210 .dbsym l CMD 2 A[6:6]c
0210 .dbsym l Buffer 16 pc
0210 .dbsym l addr 12 l
0210 .dbend
.area lit(rom, con, rel)
000C L59:
000C 5800 .byte 'X,0
000E 0000 .byte 0,0
0010 00FF .byte 0,255
.area text(rom, con, rel)
0210 .dbfile D:\ICCFIL~1\五键MP3ICC\sd.c
0210 .dbfunc e SD_write_sector _SD_write_sector fc
0210 ; retry -> R10
0210 ; CMD -> y+0
0210 ; tmp -> R14
0210 ; i -> R12,R13
0210 ; Buffer -> y+20
0210 ; addr -> y+16
.even
0210 _SD_write_sector::
0210 00D0 rcall push_arg4
0212 00D0 rcall push_gset5
0214 2697 sbiw R28,6
0216 .dbline -1
0216 .dbline 160
0216 ;
0216 ; }
0216 ; uint8 SD_write_sector(uint32 addr,uint8 *Buffer)
0216 ; //****************************************************************************
0216 ; {
0216 .dbline 164
0216 ; uint8 tmp,retry;
0216 ; uint16 i;
0216 ; //Command 24 is a writing blocks command for MMC/SD-Card.
0216 ; uint8 CMD[] = {0x58,0x00,0x00,0x00,0x00,0xFF};
0216 80E0 ldi R24,<L59
0218 90E0 ldi R25,>L59
021A FE01 movw R30,R28
021C 06E0 ldi R16,6
021E 10E0 ldi R17,0
0220 FA93 st -y,R31
0222 EA93 st -y,R30
0224 9A93 st -y,R25
0226 8A93 st -y,R24
0228 00D0 rcall asgncblk
022A .dbline 166
022A ;
022A ; asm("cli"); //clear all interrupt.
022A F894 cli
022C .dbline 167
022C ; addr = addr << 9; //addr = addr * 512
022C 89E0 ldi R24,9
022E 90E0 ldi R25,0
0230 FE01 movw R30,R28
0232 2088 ldd R2,z+16
0234 3188 ldd R3,z+17
0236 4288 ldd R4,z+18
0238 5388 ldd R5,z+19
023A 8A93 st -y,R24
023C 8101 movw R16,R2
023E 9201 movw R18,R4
0240 00D0 rcall lsl32
0242 FE01 movw R30,R28
0244 008B std z+16,R16
0246 118B std z+17,R17
0248 228B std z+18,R18
024A 338B std z+19,R19
024C .dbline 169
024C ;
024C ; CMD[1] = ((addr & 0xFF000000) >>24 );
024C 40E0 ldi R20,0
024E 50E0 ldi R21,0
0250 60E0 ldi R22,0
0252 7FEF ldi R23,255
0254 FE01 movw R30,R28
0256 2088 ldd R2,z+16
0258 3188 ldd R3,z+17
025A 4288 ldd R4,z+18
025C 5388 ldd R5,z+19
025E 2422 and R2,R20
0260 3522 and R3,R21
0262 4622 and R4,R22
0264 5722 and R5,R23
0266 88E1 ldi R24,24
0268 90E0 ldi R25,0
026A 8A93 st -y,R24
026C 8101 movw R16,R2
026E 9201 movw R18,R4
0270 00D0 rcall lsr32
0272 0983 std y+1,R16
0274 .dbline 170
0274 ; CMD[2] = ((addr & 0x00FF0000) >>16 );
0274 40E0 ldi R20,0
0276 50E0 ldi R21,0
0278 6FEF ldi R22,255
027A 70E0 ldi R23,0
027C FE01 movw R30,R28
027E 2088 ldd R2,z+16
0280 3188 ldd R3,z+17
0282 4288 ldd R4,z+18
0284 5388 ldd R5,z+19
0286 2422 and R2,R20
0288 3522 and R3,R21
028A 4622 and R4,R22
028C 5722 and R5,R23
028E 1201 movw R2,R4
0290 4424 clr R4
0292 5524 clr R5
0294 2A82 std y+2,R2
0296 .dbline 171
0296 ; CMD[3] = ((addr & 0x0000FF00) >>8 );
0296 40E0 ldi R20,0
0298 5FEF ldi R21,255
029A 60E0 ldi R22,0
029C 70E0 ldi R23,0
029E FE01 movw R30,R28
02A0 2088 ldd R2,z+16
02A2 3188 ldd R3,z+17
02A4 4288 ldd R4,z+18
02A6 5388 ldd R5,z+19
02A8 2422 and R2,R20
02AA 3522 and R3,R21
02AC 4622 and R4,R22
02AE 5722 and R5,R23
02B0 88E0 ldi R24,8
02B2 90E0 ldi R25,0
02B4 8A93 st -y,R24
02B6 8101 movw R16,R2
02B8 9201 movw R18,R4
02BA 00D0 rcall lsr32
02BC 0B83 std y+3,R16
02BE .dbline 174
02BE ;
02BE ; //Send Command CMD24 to MMC/SD-Card (Write 1 Block/512 Bytes)
02BE ; retry=0;
02BE AA24 clr R10
02C0 L63:
02C0 .dbline 176
02C0 ; do
02C0 ; { //Retry 100 times to send command.
02C0 .dbline 177
02C0 ; tmp = Write_Command_SD(CMD);
02C0 8E01 movw R16,R28
02C2 F9DE rcall _Write_Command_SD
02C4 E02E mov R14,R16
02C6 .dbline 178
02C6 ; if(retry++ == 100)
02C6 2A2C mov R2,R10
02C8 3324 clr R3
02CA 822D mov R24,R2
02CC 8F5F subi R24,255 ; addi 1
02CE A82E mov R10,R24
02D0 822D mov R24,R2
02D2 8436 cpi R24,100
02D4 09F4 brne L66
02D6 .dbline 179
02D6 ; return(tmp); //send commamd Error!
02D6 33C0 rjmp L58
02D8 L66:
02D8 .dbline 180
02D8 ; }
02D8 L64:
02D8 .dbline 181
02D8 ; while(tmp != 0);
02D8 EE20 tst R14
02DA 91F7 brne L63
02DC .dbline 184
02DC ;
02DC ; //Before writing,send 100 clock to MMC/SD-Card
02DC ; for (i = 0; i < 100; i++)
02DC CC24 clr R12
02DE DD24 clr R13
02E0 04C0 rjmp L71
02E2 L68:
02E2 .dbline 185
02E2 8EDE rcall _SPI_ReadByte
02E4 L69:
02E4 .dbline 184
02E4 C601 movw R24,R12
02E6 0196 adiw R24,1
02E8 6C01 movw R12,R24
02EA L71:
02EA .dbline 184
02EA C601 movw R24,R12
02EC 8436 cpi R24,100
02EE E0E0 ldi R30,0
02F0 9E07 cpc R25,R30
02F2 B8F3 brlo L68
02F4 .dbline 188
02F4 ; SPI_ReadByte();
02F4 ;
02F4 ; //Send Start Byte to MMC/SD-Card
02F4 ; SPI_TransferByte(0xFE);
02F4 0EEF ldi R16,254
02F6 8ADE rcall _SPI_TransferByte
02F8 .dbline 191
02F8 ;
02F8 ; //Now send real data Bolck (512Bytes) to MMC/SD-Card
02F8 ; for (i = 0; i < 512; i++)
02F8 CC24 clr R12
02FA DD24 clr R13
02FC 09C0 rjmp L75
02FE L72:
02FE .dbline 192
02FE EC89 ldd R30,y+20
0300 FD89 ldd R31,y+21
0302 0191 ld R16,Z+
0304 FD8B std y+21,R31
0306 EC8B std y+20,R30
0308 81DE rcall _SPI_TransferByte
030A L73:
030A .dbline 191
030A C601 movw R24,R12
030C 0196 adiw R24,1
030E 6C01 movw R12,R24
0310 L75:
0310 .dbline 191
0310 C601 movw R24,R12
0312 8030 cpi R24,0
0314 E2E0 ldi R30,2
0316 9E07 cpc R25,R30
0318 90F3 brlo L72
031A .dbline 195
031A ; SPI_TransferByte(*Buffer++); //send 512 bytes to Card
031A ;
031A ; //CRC-Byte
031A ; SPI_TransferByte(0xFF); //Dummy CRC
031A 0FEF ldi R16,255
031C 77DE rcall _SPI_TransferByte
031E .dbline 196
031E ; SPI_TransferByte(0xFF); //CRC Code
031E 0FEF ldi R16,255
0320 75DE rcall _SPI_TransferByte
0322 .dbline 199
0322 ;
0322 ;
0322 ; tmp=SPI_ReadByte(); // read response
0322 6EDE rcall _SPI_ReadByte
0324 E02E mov R14,R16
0326 .dbline 200
0326 ; if((tmp & 0x1F) != 0x05) // data block accepted ?
0326 8E2D mov R24,R14
0328 8F71 andi R24,31
032A 8530 cpi R24,5
032C 19F0 breq L79
032E .dbline 201
032E ; {
032E .dbline 202
032E ; SD_Disable();
032E C49A sbi 0x18,4
0330 .dbline 203
0330 ; return WRITE_BLOCK_ERROR; //Error!
0330 03E0 ldi R16,3
0332 05C0 rjmp L58
0334 L78:
0334 .dbline 206
0334 .dbline 206
0334 L79:
0334 .dbline 206
0334 ; }
0334 ; //Wait till MMC/SD-Card is not busy
0334 ; while (SPI_ReadByte() != 0xFF){};
0334 65DE rcall _SPI_ReadByte
0336 0F3F cpi R16,255
0338 E9F7 brne L78
033A .dbline 206
033A .dbline 209
033A ;
033A ; //set MMC_Chip_Select to high (MMC/SD-Card Invalid)
033A ; SD_Disable();
033A C49A sbi 0x18,4
033C .dbline 210
033C ; return 0;
033C 0027 clr R16
033E .dbline -2
033E L58:
033E 2696 adiw R28,6
0340 00D0 rcall pop_gset5
0342 2496 adiw R28,4
0344 .dbline 0 ; func end
0344 0895 ret
0346 .dbsym r retry 10 c
0346 .dbsym l CMD 0 A[6:6]c
0346 .dbsym r tmp 14 c
0346 .dbsym r i 12 i
0346 .dbsym l Buffer 20 pc
0346 .dbsym l addr 16 l
0346 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -