📄 sdmmc.lis
字号:
02AE ; while(!(SPSR & 0x80)){};
02AE 779B sbis 0xe,7
02B0 FECF rjmp L76
02B2 .dbline 338
02B2 .dbline 342
02B2 ; #else
02B2 ; Spi_SendReceive(&value,1,0);
02B2 ; #endif
02B2 ; }
02B2 L65:
02B2 .dbline 343
02B2 ; MMC_PORT|=(1<<SPI_Busy);
02B2 C09A sbi 0x18,0
02B4 .dbline -2
02B4 L63:
02B4 0E940000 xcall pop_gset2
02B8 .dbline 0 ; func end
02B8 0895 ret
02BA .dbsym r i 20 c
02BA .dbsym r value 22 c
02BA .dbend
.area lit(rom, con, rel)
0006 L80:
0006 5800 .byte 'X,0
0008 0000 .byte 0,0
000A 00FF .byte 0,255
.area text(rom, con, rel)
02BA .dbfile D:\桌面\mp3\sdmmc\sdmmc.c
02BA .dbfunc e MMC_Write_Sector _MMC_Write_Sector fc
02BA ; spispeeddub -> y+7
02BA ; spimode -> y+6
02BA ; CMD -> y+0
02BA ; retry -> R14
02BA ; tmp -> R12
02BA ; i -> R10,R11
02BA ; Buffer -> y+22
02BA ; addr -> y+18
.even
02BA _MMC_Write_Sector::
02BA 0E940000 xcall push_arg4
02BE 0E940000 xcall push_gset5
02C2 2897 sbiw R28,8
02C4 .dbline -1
02C4 .dbline 351
02C4 ; }
02C4 ;
02C4 ; //****************************************************************************
02C4 ; //Routine for writing a Block(512Byte) to MMC/SD-Card
02C4 ; //Return 0 if sector writing is completed.
02C4 ; uint8 MMC_Write_Sector(uint32 addr,uint8 *Buffer)
02C4 ; //****************************************************************************
02C4 ; {
02C4 .dbline 355
02C4 ; uint8 tmp,retry;
02C4 ; uint16 i;
02C4 ; //Command 24 is a writing blocks command for MMC/SD-Card.
02C4 ; uint8 CMD[] = {0x58,0x00,0x00,0x00,0x00,0xFF};
02C4 80E0 ldi R24,<L80
02C6 90E0 ldi R25,>L80
02C8 FE01 movw R30,R28
02CA 06E0 ldi R16,6
02CC 10E0 ldi R17,0
02CE FA93 st -y,R31
02D0 EA93 st -y,R30
02D2 9A93 st -y,R25
02D4 8A93 st -y,R24
02D6 0E940000 xcall asgncblk
02DA .dbline 358
02DA ; #if !(HW_SPI_Mode)
02DA ; uint8 spimode,spispeeddub;
02DA ; spimode=SPCR;
02DA 2DB0 in R2,0xd
02DC 2E82 std y+6,R2
02DE .dbline 359
02DE ; spispeeddub=SPSR;
02DE 2EB0 in R2,0xe
02E0 2F82 std y+7,R2
02E2 .dbline 360
02E2 ; SPCR&=~(1<<SPIE);
02E2 6F98 cbi 0xd,7
02E4 .dbline 363
02E4 ; #endif
02E4 ; // CLI(); //clear all interrupt.
02E4 ; addr = addr << 9; //addr = addr * 512
02E4 89E0 ldi R24,9
02E6 90E0 ldi R25,0
02E8 FE01 movw R30,R28
02EA 2288 ldd R2,z+18
02EC 3388 ldd R3,z+19
02EE 4488 ldd R4,z+20
02F0 5588 ldd R5,z+21
02F2 8A93 st -y,R24
02F4 8101 movw R16,R2
02F6 9201 movw R18,R4
02F8 0E940000 xcall lsl32
02FC FE01 movw R30,R28
02FE 028B std z+18,R16
0300 138B std z+19,R17
0302 248B std z+20,R18
0304 358B std z+21,R19
0306 .dbline 365
0306 ;
0306 ; CMD[1] = ((addr & 0xFF000000) >>24 );
0306 40E0 ldi R20,0
0308 50E0 ldi R21,0
030A 60E0 ldi R22,0
030C 7FEF ldi R23,255
030E FE01 movw R30,R28
0310 2288 ldd R2,z+18
0312 3388 ldd R3,z+19
0314 4488 ldd R4,z+20
0316 5588 ldd R5,z+21
0318 2422 and R2,R20
031A 3522 and R3,R21
031C 4622 and R4,R22
031E 5722 and R5,R23
0320 88E1 ldi R24,24
0322 90E0 ldi R25,0
0324 8A93 st -y,R24
0326 8101 movw R16,R2
0328 9201 movw R18,R4
032A 0E940000 xcall lsr32
032E 0983 std y+1,R16
0330 .dbline 366
0330 ; CMD[2] = ((addr & 0x00FF0000) >>16 );
0330 40E0 ldi R20,0
0332 50E0 ldi R21,0
0334 6FEF ldi R22,255
0336 70E0 ldi R23,0
0338 FE01 movw R30,R28
033A 2288 ldd R2,z+18
033C 3388 ldd R3,z+19
033E 4488 ldd R4,z+20
0340 5588 ldd R5,z+21
0342 2422 and R2,R20
0344 3522 and R3,R21
0346 4622 and R4,R22
0348 5722 and R5,R23
034A 1201 movw R2,R4
034C 4424 clr R4
034E 5524 clr R5
0350 2A82 std y+2,R2
0352 .dbline 367
0352 ; CMD[3] = ((addr & 0x0000FF00) >>8 );
0352 40E0 ldi R20,0
0354 5FEF ldi R21,255
0356 60E0 ldi R22,0
0358 70E0 ldi R23,0
035A FE01 movw R30,R28
035C 2288 ldd R2,z+18
035E 3388 ldd R3,z+19
0360 4488 ldd R4,z+20
0362 5588 ldd R5,z+21
0364 2422 and R2,R20
0366 3522 and R3,R21
0368 4622 and R4,R22
036A 5722 and R5,R23
036C 88E0 ldi R24,8
036E 90E0 ldi R25,0
0370 8A93 st -y,R24
0372 8101 movw R16,R2
0374 9201 movw R18,R4
0376 0E940000 xcall lsr32
037A 0B83 std y+3,R16
037C .dbline 370
037C ;
037C ; //Send Command CMD24 to MMC/SD-Card (Write 1 Block/512 Bytes)
037C ; retry=0;
037C EE24 clr R14
037E L84:
037E .dbline 372
037E ; do
037E ; { //Retry 100 times to send command.
037E .dbline 373
037E ; tmp=Write_Command_MMC(CMD);
037E 8E01 movw R16,R28
0380 1CDF xcall _Write_Command_MMC
0382 C02E mov R12,R16
0384 .dbline 374
0384 ; retry++;
0384 E394 inc R14
0386 .dbline 375
0386 ; if(retry==100)
0386 8E2D mov R24,R14
0388 8436 cpi R24,100
038A 31F4 brne L87
038C .dbline 376
038C ; {
038C .dbline 378
038C ; #if !(HW_SPI_Mode)
038C ; SPCR=spimode;
038C 0E80 ldd R0,y+6
038E 0DB8 out 0xd,R0
0390 .dbline 379
0390 ; SPSR=spispeeddub;
0390 0F80 ldd R0,y+7
0392 0EB8 out 0xe,R0
0394 .dbline 381
0394 ; #endif
0394 ; return(FALSE); //send commamd Error!
0394 0027 clr R16
0396 3BC0 xjmp L79
0398 L87:
0398 .dbline 383
0398 ; }
0398 ; }
0398 L85:
0398 .dbline 384
0398 ; while(tmp!=0);
0398 CC20 tst R12
039A 89F7 brne L84
039C .dbline 387
039C ;
039C ; //Before writing,send 100 clock to MMC/SD-Card
039C ; for (i=0;i<100;i++)
039C AA24 clr R10
039E BB24 clr R11
03A0 04C0 xjmp L92
03A2 L89:
03A2 .dbline 388
03A2 .dbline 389
03A2 29DF xcall _Read_Byte_MMC
03A4 .dbline 390
03A4 L90:
03A4 .dbline 387
03A4 C501 movw R24,R10
03A6 0196 adiw R24,1
03A8 5C01 movw R10,R24
03AA L92:
03AA .dbline 387
03AA C501 movw R24,R10
03AC 8436 cpi R24,100
03AE E0E0 ldi R30,0
03B0 9E07 cpc R25,R30
03B2 B8F3 brlo L89
03B4 .dbline 393
03B4 ; {
03B4 ; Read_Byte_MMC(); //此处会产生死等待
03B4 ; }
03B4 ;
03B4 ; //Send Start Byte to MMC/SD-Card
03B4 ; Write_Byte_MMC(0xFE);
03B4 0EEF ldi R16,254
03B6 51DF xcall _Write_Byte_MMC
03B8 .dbline 396
03B8 ;
03B8 ; //Now send real data Bolck (512Bytes) to MMC/SD-Card
03B8 ; for (i=0;i<512;i++)
03B8 AA24 clr R10
03BA BB24 clr R11
03BC 09C0 xjmp L96
03BE L93:
03BE .dbline 397
03BE .dbline 398
03BE EE89 ldd R30,y+22
03C0 FF89 ldd R31,y+23
03C2 0191 ld R16,Z+
03C4 FF8B std y+23,R31
03C6 EE8B std y+22,R30
03C8 48DF xcall _Write_Byte_MMC
03CA .dbline 399
03CA L94:
03CA .dbline 396
03CA C501 movw R24,R10
03CC 0196 adiw R24,1
03CE 5C01 movw R10,R24
03D0 L96:
03D0 .dbline 396
03D0 C501 movw R24,R10
03D2 8030 cpi R24,0
03D4 E2E0 ldi R30,2
03D6 9E07 cpc R25,R30
03D8 90F3 brlo L93
03DA .dbline 402
03DA ; {
03DA ; Write_Byte_MMC(*Buffer++); //send 512 bytes to Card
03DA ; }
03DA ;
03DA ; //CRC-Byte
03DA ; Write_Byte_MMC(0xFF); //Dummy CRC
03DA 0FEF ldi R16,255
03DC 3EDF xcall _Write_Byte_MMC
03DE .dbline 403
03DE ; Write_Byte_MMC(0xFF); //CRC Code
03DE 0FEF ldi R16,255
03E0 3CDF xcall _Write_Byte_MMC
03E2 .dbline 406
03E2 ;
03E2 ;
03E2 ; tmp=Read_Byte_MMC(); // read response
03E2 09DF xcall _Read_Byte_MMC
03E4 C02E mov R12,R16
03E6 .dbline 407
03E6 ; if((tmp & 0x1F)!=0x05) // data block accepted ?
03E6 8C2D mov R24,R12
03E8 8F71 andi R24,31
03EA 8530 cpi R24,5
03EC 39F0 breq L100
03EE .dbline 408
03EE ; {
03EE .dbline 409
03EE ; MMC_Disable();
03EE C49A sbi 0x18,4
03F0 .dbline 409
03F0 .dbline 411
03F0 ; #if !(HW_SPI_Mode)
03F0 ; SPCR=spimode;
03F0 0E80 ldd R0,y+6
03F2 0DB8 out 0xd,R0
03F4 .dbline 412
03F4 ; SPSR=spispeeddub;
03F4 0F80 ldd R0,y+7
03F6 0EB8 out 0xe,R0
03F8 .dbline 414
03F8 ; #endif
03F8 ; return(FALSE); //Error!
03F8 0027 clr R16
03FA 09C0 xjmp L79
03FC L99:
03FC .dbline 417
03FC .dbline 417
03FC L100:
03FC .dbline 417
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -